2016-11-25 17:18:40 +01:00
|
|
|
#include <u.h>
|
2017-04-19 23:33:14 +02:00
|
|
|
#include <lib9.h>
|
2016-11-25 17:18:40 +01:00
|
|
|
#include <auth.h>
|
2016-12-01 00:09:42 +01:00
|
|
|
#include <9P2000.h>
|
2016-11-25 17:18:40 +01:00
|
|
|
#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, uint32_t 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, uint32_t 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, uint32_t fid)
|
|
|
|
{
|
|
|
|
return deletekey(pool->map, fid);
|
|
|
|
}
|