8 static Xfile* clean(Xfile*);
10 #define FIDMOD 127 /* prime */
13 static Xfile* xfiles[FIDMOD];
14 static Xfile* freelist;
28 flag = (access(name, 6) == 0) ? ORDWR : OREAD;
29 fd = open(name, flag);
38 if((dir = dirfstat(fd)) == nil)
40 if((dir->qid.type & ~QTTMP) != QTFILE)
41 error("attach name not a plain file");
42 for(fxf=0,xf=xhead; xf; xf=xf->next){
48 if(xf->qid.path != dir->qid.path || xf->qid.vers != dir->qid.vers)
50 if(xf->type != dir->type || xf->fdev != dir->dev)
53 chat("incref=%d, \"%s\", dev=%d...", xf->ref, xf->name, xf->dev);
60 fxf = ealloc(sizeof(Xfs));
64 chat("alloc \"%s\", dev=%d...", name, fd);
66 fxf->name = strcpy(ealloc(strlen(name)+1), name);
68 fxf->type = dir->type;
82 chat("decref=%d, \"%s\", dev=%d...", d->ref, d->name, d->dev);
93 refxfs(Xfs *xf, int delta)
106 xfile(int fid, int flag)
109 Xfile **hp=&xfiles[k], *f, *pf;
111 for(f=*hp,pf=0; f; pf=f,f=f->next)
124 error("unassigned fid");
139 if(f = freelist) /* assign = */
142 f = ealloc(sizeof(Xfile));
148 f->qid = (Qid){0,0,0};
167 f->qid = (Qid){0,0,0};