summaryrefslogtreecommitdiff
path: root/sys/src/lib9p/fid.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/lib9p/fid.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/lib9p/fid.c')
-rwxr-xr-xsys/src/lib9p/fid.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/sys/src/lib9p/fid.c b/sys/src/lib9p/fid.c
new file mode 100755
index 000000000..e0b6af5ee
--- /dev/null
+++ b/sys/src/lib9p/fid.c
@@ -0,0 +1,82 @@
+#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);
+ 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);
+}