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

1991/1114/port/net.c (diff list | history)

1991/1114/sys/src/9/port/net.c:25,301991/1115/sys/src/9/port/net.c:25,35 (short | long | prev | next)
1991/1107    
	Qid q; 
	char buf[32]; 
	Network *np = vp; 
1991/1115    
	int t; 
	int id; 
	Netprot *p; 
	int perm; 
	char *o; 
1991/1107    
 
	q.vers = 0; 
 
1991/1114/sys/src/9/port/net.c:34,401991/1115/sys/src/9/port/net.c:39,45
1991/1107    
		case 0: 
			q.path = CHDIR | Q2nd; 
			strcpy(buf, np->name); 
1991/1109    
			devdir(c, q, buf, 0, eve, 0666, dp); 
1991/1115    
			devdir(c, q, buf, 0, eve, 0555, dp); 
1991/1107    
			break; 
		default: 
			return -1; 
1991/1114/sys/src/9/port/net.c:43,491991/1115/sys/src/9/port/net.c:48,55
1991/1107    
	} 
 
	/* second level contains clone plus all the conversations */ 
1991/1114    
	if(STREAMTYPE(c->qid.path) == Q2nd){ 
1991/1115    
	t = STREAMTYPE(c->qid.path); 
	if(t == Q2nd || t == Qclone){ 
1991/1107    
		if(i == 0){ 
			q.path = Qclone; 
1991/1109    
			devdir(c, q, "clone", 0, eve, 0666, dp); 
1991/1114/sys/src/9/port/net.c:50,561991/1115/sys/src/9/port/net.c:56,62
1991/1114    
		}else if(i <= np->nconv){ 
			q.path = CHDIR|STREAMQID(i-1, Q3rd); 
			sprint(buf, "%d", i-1); 
1991/1109    
			devdir(c, q, buf, 0, eve, 0666, dp); 
1991/1115    
			devdir(c, q, buf, 0, eve, 0555, dp); 
1991/1107    
		}else 
			return -1; 
		return 1; 
1991/1114/sys/src/9/port/net.c:57,761991/1115/sys/src/9/port/net.c:63,91
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){ 
		o = p->owner; 
		perm = p->mode; 
	} else { 
		o = eve; 
		perm = 0666; 
	} 
1991/1107    
	switch(i){ 
	case 0: 
		q.path = STREAMQID(STREAMID(c->qid.path), Sdataqid); 
1991/1109    
		devdir(c, q, "data", 0, eve, 0666, dp); 
1991/1115    
		devdir(c, q, "data", 0, o, perm, dp); 
1991/1107    
		break; 
	case 1: 
		q.path = STREAMQID(STREAMID(c->qid.path), Sctlqid); 
1991/1109    
		devdir(c, q, "ctl", 0, eve, 0666, dp); 
1991/1115    
		devdir(c, q, "ctl", 0, o, perm, dp); 
1991/1107    
		break; 
	case 2: 
		if(np->listen == 0) 
			return 0; 
		q.path = STREAMQID(STREAMID(c->qid.path), Qlisten); 
1991/1109    
		devdir(c, q, "listen", 0, eve, 0666, dp); 
1991/1115    
		devdir(c, q, "listen", 0, o, perm, dp); 
1991/1107    
		break; 
	default: 
		i -= 3; 
1991/1114/sys/src/9/port/net.c:77,831991/1115/sys/src/9/port/net.c:92,98
1991/1108    
		if(i >= np->ninfo) 
			return -1; 
		q.path = STREAMQID(STREAMID(c->qid.path), Qinf+i); 
1991/1109    
		devdir(c, q, np->info[i].name, 0, eve, 0666, dp); 
1991/1115    
		devdir(c, q, np->info[i].name, 0, eve, 0444, dp); 
1991/1108    
		break; 
1991/1107    
	} 
	return 1; 
1991/1114/sys/src/9/port/net.c:117,1231991/1115/sys/src/9/port/net.c:132,138
1991/1108    
			 * here, which is good because we've lost the name by now. 
			 */ 
			if(c->qid.path & CHDIR){ 
1991/1109    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); 
1991/1115    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0555, &dir); 
1991/1108    
				convD2M(&dir, db); 
				return; 
			} 
1991/1114/sys/src/9/port/net.c:134,1431991/1115/sys/src/9/port/net.c:149,176
1991/1108    
		} 
} 
 
1991/1115    
void 
netwstat(Chan *c, char *db, Network *np) 
{ 
	Dir dir; 
	Netprot *p; 
 
	p = &np->prot[STREAMID(c->qid.path)]; 
	lock(np); 
	if(strncmp(p->owner, u->p->user, NAMELEN)){ 
		unlock(np); 
		error(Eperm); 
	} 
	convM2D(db, &dir); 
	strncpy(p->owner, dir.uid, NAMELEN); 
	p->mode = dir.mode; 
	unlock(np); 
} 
 
1991/1107    
Chan * 
netopen(Chan *c, int omode, Network *np) 
{ 
	int conv; 
1991/1115    
	int id; 
1991/1107    
 
	if(c->qid.path & CHDIR){ 
		if(omode != OREAD) 
1991/1114/sys/src/9/port/net.c:146,1591991/1115/sys/src/9/port/net.c:179,197
1991/1107    
		switch(STREAMTYPE(c->qid.path)){ 
		case Sdataqid: 
		case Sctlqid: 
1991/1115    
			id = STREAMID(c->qid.path); 
			if(netown(np, id, u->p->user, omode&7) < 0) 
				error(Eperm); 
1991/1107    
			break; 
		case Qlisten: 
			conv = (*np->listen)(c); 
			c->qid.path = STREAMQID(conv, Sctlqid); 
1991/1115    
			streamopen(c, np->devp); 
			id = (*np->listen)(c); 
			streamclose(c); 
			c->qid.path = STREAMQID(id, Sctlqid); 
1991/1107    
			break; 
		case Qclone: 
			conv = (*np->clone)(c); 
			c->qid.path = STREAMQID(conv, Sctlqid); 
1991/1115    
			id = (*np->clone)(c); 
			c->qid.path = STREAMQID(id, Sctlqid); 
1991/1107    
			break; 
		default: 
			if(omode != OREAD) 
1991/1114/sys/src/9/port/net.c:191,1951991/1115/sys/src/9/port/net.c:229,272
1991/1107    
		error(Ebadusefd); 
 
1991/1108    
	(*np->info[t-Qinf].fill)(c, buf, sizeof(buf)); 
1991/1107    
	return stringread(c, a, n, buf, offset); 
1991/1115    
	return stringread(a, n, buf, offset); 
} 
 
int 
netown(Network *np, int id, char *o, int omode) 
{ 
	static int access[] = { 0400, 0200, 0600, 0100 }; 
	Netprot *p; 
	int mode; 
	int t; 
 
	p = &np->prot[id]; 
	lock(np); 
	if(*p->owner){ 
		if(strncmp(o, p->owner, NAMELEN) == 0)	/* User */ 
			mode = p->mode; 
		else if(strncmp(o, eve, NAMELEN) == 0)	/* Bootes is group */ 
			mode = p->mode<<3; 
		else 
			mode = p->mode<<6;		/* Other */ 
 
		t = access[omode&3]; 
		if((t & mode) == t){ 
			unlock(np); 
			return 0; 
		} else { 
			unlock(np); 
			return -1; 
		} 
	} 
	strncpy(p->owner, o, NAMELEN); 
	np->prot[id].mode = 0660; 
	unlock(np); 
	return 0; 
} 
 
void 
netdisown(Network *np, int id) 
{ 
	*np->prot[id].owner = 0; 
1991/1107    
} 


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