示例#1
0
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);
}
示例#2
0
文件: auth.c 项目: Nurb432/plan9front
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;
}
示例#3
0
文件: sub.c 项目: npe9/harvey
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);
}
示例#4
0
void
sfsserv::sfs_logout (svccb *sbp)
{
  authfree (*sbp->Xtmpl getarg<u_int32_t> ());
  sbp->reply (NULL);
}