aboutsummaryrefslogtreecommitdiff
path: root/src/lib9p/fid.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-21 04:33:13 +0000
committerrsc <devnull@localhost>2004-03-21 04:33:13 +0000
commit2277c5d7bbe1f9595fad512d8f790708473a9bf1 (patch)
tree4d653e13906f1971d3170dba6dbe0fbf92eb48d6 /src/lib9p/fid.c
parenta770daa795754cb600ad3fab2fdd2961147006c4 (diff)
downloadplan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.tar.gz
plan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.tar.bz2
plan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.zip
Small tweaks
Lots of new code imported.
Diffstat (limited to 'src/lib9p/fid.c')
-rw-r--r--src/lib9p/fid.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/lib9p/fid.c b/src/lib9p/fid.c
new file mode 100644
index 00000000..2393f1c4
--- /dev/null
+++ b/src/lib9p/fid.c
@@ -0,0 +1,81 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include <fcall.h>
+#include <thread.h>
+#include "9p.h"
+
+static void
+incfidref(void *v)
+{
+ Fid *f;
+
+ f = v;
+ if(f)
+ incref(&f->ref);
+}
+
+Fidpool*
+allocfidpool(void (*destroy)(Fid*))
+{
+ Fidpool *f;
+
+ f = emalloc9p(sizeof *f);
+ f->map = allocmap(incfidref);
+ f->destroy = destroy;
+ return f;
+}
+
+void
+freefidpool(Fidpool *p)
+{
+ freemap(p->map, (void(*)(void*))p->destroy);
+ free(p);
+}
+
+Fid*
+allocfid(Fidpool *pool, ulong fid)
+{
+ Fid *f;
+
+ f = emalloc9p(sizeof *f);
+ f->fid = fid;
+ f->omode = -1;
+ f->pool = pool;
+
+ incfidref(f);
+ incfidref(f);
+ if(caninsertkey(pool->map, fid, f) == 0){
+ closefid(f);
+ return nil;
+ }
+
+ return f;
+}
+
+Fid*
+lookupfid(Fidpool *pool, ulong fid)
+{
+ return lookupkey(pool->map, fid);
+}
+
+void
+closefid(Fid *f)
+{
+ if(decref(&f->ref) == 0) {
+ if(f->rdir)
+ closedirfile(f->rdir);
+ if(f->pool->destroy)
+ f->pool->destroy(f);
+ if(f->file)
+ closefile(f->file);
+ free(f->uid);
+ free(f);
+ }
+}
+
+Fid*
+removefid(Fidpool *pool, ulong fid)
+{
+ return deletekey(pool->map, fid);
+}