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

1992/0623/port/net.c (diff list | history)

1992/0619/sys/src/9/port/net.c:15,201992/0623/sys/src/9/port/net.c:15,34 (short | long | prev | next)
1991/1107    
}; 
 
/* 
1992/0623    
 *  find protection structure 
 */ 
static Netprot* 
findprot(Network *np, int id) 
{ 
	Netprot *p; 
 
	for(p = np->prot; p; p = p->next) 
		if(p->id == id) 
			break; 
	return p; 
} 
 
/* 
1991/1107    
 *  generate a 3 level directory 
 */ 
int 
1992/0619/sys/src/9/port/net.c:24,301992/0623/sys/src/9/port/net.c:38,43
1991/1107    
	char buf[32]; 
	Network *np = vp; 
1991/1115    
	int t; 
	int id; 
	Netprot *p; 
	int perm; 
	char *o; 
1992/0619/sys/src/9/port/net.c:61,691992/0623/sys/src/9/port/net.c:74,81
1991/1107    
	} 
 
	/* third level depends on the number of info files */ 
1991/1115    
	id = STREAMID(c->qid.path); 
	p = &np->prot[id]; 
	if(*p->owner){ 
1992/0623    
	p = findprot(np, STREAMID(c->qid.path)); 
	if(p && *p->owner){ 
1991/1115    
		o = p->owner; 
		perm = p->mode; 
	} else { 
1992/0619/sys/src/9/port/net.c:153,1591992/0623/sys/src/9/port/net.c:165,173
1991/1115    
	Dir dir; 
	Netprot *p; 
 
	p = &np->prot[STREAMID(c->qid.path)]; 
1992/0623    
	p = findprot(np, STREAMID(c->qid.path)); 
	if(p == 0) 
		error(Enonexist); 
1991/1115    
	lock(np); 
	if(strncmp(p->owner, u->p->user, NAMELEN)){ 
		unlock(np); 
1992/0619/sys/src/9/port/net.c:169,1741992/0623/sys/src/9/port/net.c:183,189
1991/1107    
netopen(Chan *c, int omode, Network *np) 
{ 
1991/1122    
	int id = 0; 
1992/0623    
	Netprot *p; 
1991/1107    
 
	if(c->qid.path & CHDIR){ 
		if(omode != OREAD) 
1992/0619/sys/src/9/port/net.c:199,2051992/0623/sys/src/9/port/net.c:214,222
1991/1107    
			streamopen(c, np->devp); 
			if(np->protop && c->stream->devq->next->info != np->protop) 
				pushq(c->stream, np->protop); 
1991/1116    
			if(netown(np, id, u->p->user, omode&7) < 0) 
1992/0623    
			p = findprot(np, id); 
if(p == 0) print("netopen: can't find %d\n", id); 
			if(netown(p, u->p->user, omode&7) < 0) 
1991/1116    
				error(Eperm); 
1991/1107    
			break; 
		} 
1992/0619/sys/src/9/port/net.c:227,2451992/0623/sys/src/9/port/net.c:244,279
1991/1107    
		error(Ebadusefd); 
 
1991/1108    
	(*np->info[t-Qinf].fill)(c, buf, sizeof(buf)); 
1991/1115    
	return stringread(a, n, buf, offset); 
1992/0623    
	return readstr(offset, a, n, buf); 
1991/1115    
} 
 
1992/0623    
void 
netadd(Network *np, Netprot *p, int id) 
{ 
	Netprot **l, *pp; 
 
	memset(p, 0, sizeof(Netprot)); 
	p->id = id; 
 
	l = &np->prot; 
	for(pp = np->prot; pp; pp = pp->next){ 
		if(pp->id == id) 
			panic("netadd"); 
		l = &pp->next; 
	} 
	*l = p; 
} 
 
Lock netlock; 
 
1991/1115    
int 
netown(Network *np, int id, char *o, int omode) 
1992/0623    
netown(Netprot *p, char *o, int omode) 
1991/1115    
{ 
	static int access[] = { 0400, 0200, 0600, 0100 }; 
	Netprot *p; 
	int mode; 
	int t; 
 
	p = &np->prot[id]; 
	lock(np); 
1992/0623    
	lock(&netlock); 
1991/1115    
	if(*p->owner){ 
		if(strncmp(o, p->owner, NAMELEN) == 0)	/* User */ 
			mode = p->mode; 
1992/0619/sys/src/9/port/net.c:250,2711992/0623/sys/src/9/port/net.c:284,304
1991/1115    
 
		t = access[omode&3]; 
		if((t & mode) == t){ 
			unlock(np); 
1992/0623    
			unlock(&netlock); 
1991/1115    
			return 0; 
		} else { 
			unlock(np); 
1992/0623    
			unlock(&netlock); 
1991/1115    
			return -1; 
		} 
	} 
	strncpy(p->owner, o, NAMELEN); 
	np->prot[id].mode = 0660; 
	unlock(np); 
1992/0623    
	p->mode = 0660; 
	unlock(&netlock); 
1991/1115    
	return 0; 
} 
 
void 
netdisown(Network *np, int id) 
1992/0623    
netdisown(Netprot *p) 
1991/1115    
{ 
1992/0416    
if(np == 0) panic("np == 0"); 
1991/1115    
	*np->prot[id].owner = 0; 
1992/0623    
	p->owner[0] = 0; 
1991/1107    
} 


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