void freefp(File *fp) { Chan *cp; File *f, *prev; if(!fp || !(cp = fp->cp)) return; authfree(fp); lock(&cp->flock); for(prev=0,f=cp->flist; f; prev=f,f=f->next) { if(f != fp) continue; if(prev) prev->next = f->next; else cp->flist = f->next; f->cp = 0; lock(&suballoc.flock); f->list = suballoc.ffree; suballoc.ffree = f; unlock(&suballoc.flock); break; } unlock(&cp->flock); }
void* authnew(void) { AuthRpc *rpc; int fd; if(access("/mnt/factotum", 0) < 0) if((fd = open("/srv/factotum", ORDWR)) >= 0) mount(fd, -1, "/mnt", MBEFORE, ""); if((fd = open("/mnt/factotum/rpc", ORDWR)) < 0) return nil; if((rpc = auth_allocrpc(fd)) == nil){ close(fd); return nil; } if(auth_rpc(rpc, "start", keyspec, strlen(keyspec)) != ARok){ authfree(rpc); return nil; } return rpc; }
void fileinit(Chan *cp) { File *f, *prev; Tlock *t; int h; loop: lock(&flock); for (h=0; h < nelem(flist); h++) for (prev=0, f = flist[h]; f; prev=f, f=f->next) { if(f->cp != cp) continue; if(prev) { prev->next = f->next; f->next = flist[h]; flist[h] = f; } flist[h] = f->next; unlock(&flock); qlock(f); if(t = f->tlock) { if(t->file == f) t->time = 0; /* free the lock */ f->tlock = 0; } if(f->open & FREMOV) doremove(f, 0); freewp(f->wpath); f->open = 0; authfree(f->auth); f->auth = 0; f->cp = 0; qunlock(f); goto loop; } unlock(&flock); }
void sfsserv::sfs_logout (svccb *sbp) { authfree (*sbp->Xtmpl getarg<u_int32_t> ()); sbp->reply (NULL); }