plan 9 kernel history: overview | file list | diff list

1999/0122/port/devsrv.c (diff list | history)

1998/0319/sys/src/9/port/devsrv.c:63,681999/0122/sys/src/9/port/devsrv.c:63,78 (short | long | prev | next)
1991/0828    
	devstat(c, db, 0, 0, srvgen); 
1990/0227    
} 
 
1999/0122    
static Srv* 
srvlookup(char *name, ulong qidpath) 
{ 
	Srv *sp; 
	for(sp = srv; sp; sp = sp->link) 
		if(sp->path == qidpath || (name && strcmp(sp->name, name) == 0)) 
			return sp; 
	return nil; 
} 
 
1997/0327    
static Chan* 
1990/0227    
srvopen(Chan *c, int omode) 
{ 
1998/0319/sys/src/9/port/devsrv.c:69,741999/0122/sys/src/9/port/devsrv.c:79,86
1992/0622    
	Srv *sp; 
1990/0227    
 
1991/0828    
	if(c->qid.path == CHDIR){ 
1999/0122    
		if(omode & ORCLOSE) 
			error(Eperm); 
1990/1110    
		if(omode != OREAD) 
1990/11211    
			error(Eisdir); 
1990/0227    
		c->mode = omode; 
1998/0319/sys/src/9/port/devsrv.c:82,971999/0122/sys/src/9/port/devsrv.c:94,106
1991/0828    
		nexterror(); 
	} 
1992/0622    
 
	for(sp = srv; sp; sp = sp->link) 
		if(sp->path == c->qid.path) 
			break; 
                 
1999/0122    
	sp = srvlookup(nil, c->qid.path); 
1992/0622    
	if(sp == 0 || sp->chan == 0) 
1990/11211    
		error(Eshutdown); 
1992/0622    
 
1991/0828    
	if(omode&OTRUNC) 
1990/11211    
		error(Eperm); 
1992/0622    
	if(omode!=sp->chan->mode && sp->chan->mode!=ORDWR) 
1999/0122    
	if(openmode(omode)!=sp->chan->mode && sp->chan->mode!=ORDWR) 
1990/11211    
		error(Eperm); 
1992/0622    
 
1997/0327    
	cclose(c); 
1998/0319/sys/src/9/port/devsrv.c:106,1141999/0122/sys/src/9/port/devsrv.c:115,126
1990/0227    
{ 
1991/1219    
	Srv *sp; 
1990/0227    
 
1991/0828    
	if(omode != OWRITE) 
1999/0122    
	if(openmode(omode) != OWRITE) 
1991/0828    
		error(Eperm); 
1991/1219    
 
1999/0122    
	if(omode & OCEXEC)	/* can't happen */ 
		panic("someone broke namec"); 
 
1992/0622    
	sp = malloc(sizeof(Srv)); 
	if(sp == 0) 
		error(Enomem); 
1998/0319/sys/src/9/port/devsrv.c:118,1231999/0122/sys/src/9/port/devsrv.c:130,138
1992/0622    
		qunlock(&srvlk); 
1990/0227    
		nexterror(); 
	} 
1999/0122    
	if(srvlookup(name, -1)) 
		error(Eexist); 
 
1993/0501    
	sp->path = qidpath++; 
1992/0622    
	sp->link = srv; 
	c->qid.path = sp->path; 
1998/0319/sys/src/9/port/devsrv.c:174,1831999/0122/sys/src/9/port/devsrv.c:189,196
1994/1018    
	Dir d; 
	Srv *sp; 
 
	if(!iseve()) 
1999/0122    
	if(c->qid.path & CHDIR) 
1994/1018    
		error(Eperm); 
	if(CHDIR & c->qid.path) 
		error(Eperm); 
 
	qlock(&srvlk); 
	if(waserror()){ 
1998/0319/sys/src/9/port/devsrv.c:185,1951999/0122/sys/src/9/port/devsrv.c:198,210
1994/1018    
		nexterror(); 
	} 
 
	for(sp = srv; sp; sp = sp->link) 
		if(sp->path == c->qid.path) 
			break; 
	if(sp == 0 || sp->chan == 0) 
		error(Eshutdown); 
1999/0122    
	sp = srvlookup(nil, c->qid.path); 
	if(sp == 0) 
		error(Enonexist); 
 
	if(strcmp(sp->owner, up->user) && !iseve()) 
		error(Eperm); 
 
1994/1018    
	convM2D(dp, &d); 
	d.mode &= 0777; 
	sp->perm = d.mode; 
1998/0319/sys/src/9/port/devsrv.c:199,2061999/0122/sys/src/9/port/devsrv.c:214,229
1990/0227    
} 
 
1997/0327    
static void 
1995/0804    
srvclose(Chan*) 
1999/0122    
srvclose(Chan *c) 
1990/0227    
{ 
1999/0122    
	/* 
	 * errors from srvremove will be caught by cclose and ignored. 
	 * in theory we need to override any changes in removability 
	 * since open, but since all that's checked is the owner, 
	 * which is immutable, all is well. 
	 */ 
	if(c->flag & CRCLOSE) 
		srvremove(c); 
1990/0227    
} 
 
1997/0327    
static long 
1998/0319/sys/src/9/port/devsrv.c:232,2461999/0122/sys/src/9/port/devsrv.c:255,266
1997/0327    
		cclose(c1); 
1992/0520    
		nexterror(); 
	} 
1992/0622    
	for(sp = srv; sp; sp = sp->link) 
		if(sp->path == c->qid.path) 
			break; 
1992/0620    
                 
1999/0122    
	sp = srvlookup(nil, c->qid.path); 
1992/0622    
	if(sp == 0) 
		error(Enonexist); 
 
	if(sp->chan) 
		panic("srvwrite"); 
1999/0122    
		error(Ebadusefd); 
1992/0622    
 
	sp->chan = c1; 
	qunlock(&srvlk); 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)