Blame


1 2277c5d7 2004-03-21 devnull #include <u.h>
2 2277c5d7 2004-03-21 devnull #include <libc.h>
3 2277c5d7 2004-03-21 devnull #include <auth.h>
4 2277c5d7 2004-03-21 devnull #include <fcall.h>
5 2277c5d7 2004-03-21 devnull #include <thread.h>
6 2277c5d7 2004-03-21 devnull #include "9p.h"
7 2277c5d7 2004-03-21 devnull
8 2277c5d7 2004-03-21 devnull static void
9 2277c5d7 2004-03-21 devnull incfidref(void *v)
10 2277c5d7 2004-03-21 devnull {
11 2277c5d7 2004-03-21 devnull Fid *f;
12 2277c5d7 2004-03-21 devnull
13 2277c5d7 2004-03-21 devnull f = v;
14 2277c5d7 2004-03-21 devnull if(f)
15 2277c5d7 2004-03-21 devnull incref(&f->ref);
16 2277c5d7 2004-03-21 devnull }
17 2277c5d7 2004-03-21 devnull
18 2277c5d7 2004-03-21 devnull Fidpool*
19 2277c5d7 2004-03-21 devnull allocfidpool(void (*destroy)(Fid*))
20 2277c5d7 2004-03-21 devnull {
21 2277c5d7 2004-03-21 devnull Fidpool *f;
22 2277c5d7 2004-03-21 devnull
23 2277c5d7 2004-03-21 devnull f = emalloc9p(sizeof *f);
24 2277c5d7 2004-03-21 devnull f->map = allocmap(incfidref);
25 2277c5d7 2004-03-21 devnull f->destroy = destroy;
26 2277c5d7 2004-03-21 devnull return f;
27 2277c5d7 2004-03-21 devnull }
28 2277c5d7 2004-03-21 devnull
29 2277c5d7 2004-03-21 devnull void
30 2277c5d7 2004-03-21 devnull freefidpool(Fidpool *p)
31 2277c5d7 2004-03-21 devnull {
32 2277c5d7 2004-03-21 devnull freemap(p->map, (void(*)(void*))p->destroy);
33 2277c5d7 2004-03-21 devnull free(p);
34 2277c5d7 2004-03-21 devnull }
35 2277c5d7 2004-03-21 devnull
36 2277c5d7 2004-03-21 devnull Fid*
37 2277c5d7 2004-03-21 devnull allocfid(Fidpool *pool, ulong fid)
38 2277c5d7 2004-03-21 devnull {
39 2277c5d7 2004-03-21 devnull Fid *f;
40 2277c5d7 2004-03-21 devnull
41 2277c5d7 2004-03-21 devnull f = emalloc9p(sizeof *f);
42 2277c5d7 2004-03-21 devnull f->fid = fid;
43 2277c5d7 2004-03-21 devnull f->omode = -1;
44 2277c5d7 2004-03-21 devnull f->pool = pool;
45 2277c5d7 2004-03-21 devnull
46 2277c5d7 2004-03-21 devnull incfidref(f);
47 2277c5d7 2004-03-21 devnull incfidref(f);
48 2277c5d7 2004-03-21 devnull if(caninsertkey(pool->map, fid, f) == 0){
49 2277c5d7 2004-03-21 devnull closefid(f);
50 5c8a0421 2004-12-26 devnull closefid(f);
51 2277c5d7 2004-03-21 devnull return nil;
52 2277c5d7 2004-03-21 devnull }
53 2277c5d7 2004-03-21 devnull
54 2277c5d7 2004-03-21 devnull return f;
55 2277c5d7 2004-03-21 devnull }
56 2277c5d7 2004-03-21 devnull
57 2277c5d7 2004-03-21 devnull Fid*
58 2277c5d7 2004-03-21 devnull lookupfid(Fidpool *pool, ulong fid)
59 2277c5d7 2004-03-21 devnull {
60 2277c5d7 2004-03-21 devnull return lookupkey(pool->map, fid);
61 2277c5d7 2004-03-21 devnull }
62 2277c5d7 2004-03-21 devnull
63 2277c5d7 2004-03-21 devnull void
64 2277c5d7 2004-03-21 devnull closefid(Fid *f)
65 2277c5d7 2004-03-21 devnull {
66 2277c5d7 2004-03-21 devnull if(decref(&f->ref) == 0) {
67 2277c5d7 2004-03-21 devnull if(f->rdir)
68 2277c5d7 2004-03-21 devnull closedirfile(f->rdir);
69 2277c5d7 2004-03-21 devnull if(f->pool->destroy)
70 2277c5d7 2004-03-21 devnull f->pool->destroy(f);
71 2277c5d7 2004-03-21 devnull if(f->file)
72 2277c5d7 2004-03-21 devnull closefile(f->file);
73 2277c5d7 2004-03-21 devnull free(f->uid);
74 2277c5d7 2004-03-21 devnull free(f);
75 2277c5d7 2004-03-21 devnull }
76 2277c5d7 2004-03-21 devnull }
77 2277c5d7 2004-03-21 devnull
78 2277c5d7 2004-03-21 devnull Fid*
79 2277c5d7 2004-03-21 devnull removefid(Fidpool *pool, ulong fid)
80 2277c5d7 2004-03-21 devnull {
81 2277c5d7 2004-03-21 devnull return deletekey(pool->map, fid);
82 2277c5d7 2004-03-21 devnull }