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

1990/0227/port/dev.c (diff list | history)

1990/0227/sys/src/9/port/dev.c:76,811990/0303/sys/src/9/port/dev.c:76,83 (short | long)
1990/0227    
	nc->dev = c->dev; 
	nc->flag = c->flag; 
	nc->mnt = c->mnt; 
1990/0303    
	nc->mchan = c->mchan; 
	nc->mqid = c->mqid; 
1990/0227    
	return nc; 
} 
 
1990/0303/sys/src/9/port/dev.c:67,721990/0329/sys/src/9/port/dev.c:67,74 (short | long)
1990/0227    
Chan * 
devclone(Chan *c, Chan *nc) 
{ 
1990/0329    
	if(c->flag & COPEN) 
		panic("clone of open file type %c\n", devchar[c->type]); 
1990/0227    
	if(nc == 0) 
		nc = newchan(); 
	nc->type = c->type; 
1990/0329/sys/src/9/port/dev.c:143,1581990/0821/sys/src/9/port/dev.c:143,156 (short | long)
1990/0227    
long 
devdirread(Chan *c, char *d, long n, Dirtab *tab, int ntab, Devgen *gen) 
{ 
	long k, l, m; 
1990/0821    
	long k, m; 
1990/0227    
	Dir dir; 
 
	k = c->offset/DIRLEN; 
	l = (c->offset+n)/DIRLEN; 
	n = 0; 
	for(m=k; m<l; k++) 
1990/0821    
	for(m=0; m<n; k++) 
1990/0227    
		switch((*gen)(c, tab, ntab, k, &dir)){ 
		case -1: 
			return n; 
1990/0821    
			return m; 
1990/0227    
 
		case 0: 
			c->offset += DIRLEN; 
1990/0329/sys/src/9/port/dev.c:160,1711990/0821/sys/src/9/port/dev.c:158,168
1990/0227    
 
		case 1: 
			convD2M(&dir, d); 
			n += DIRLEN; 
1990/0821    
			m += DIRLEN; 
1990/0227    
			d += DIRLEN; 
			m++; 
			break; 
		} 
	return n; 
1990/0821    
	return m; 
1990/0227    
} 
 
Chan * 
1990/0821/sys/src/9/port/dev.c:4,101990/11211/sys/src/9/port/dev.c:4,9 (short | long)
1990/0227    
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
                 
#define	DEVTAB 
#include	"devtab.h" 
 
1990/0821/sys/src/9/port/dev.c:25,371990/11211/sys/src/9/port/dev.c:24,36
1990/0227    
} 
 
void 
devdir(Chan *c, long qid, char *n, long length, long perm, Dir *db) 
1990/11211    
devdir(Chan *c, Qid qid, char *n, long length, long perm, Dir *db) 
1990/0227    
{ 
	strcpy(db->name, n); 
	db->qid = qid; 
	db->type = devchar[c->type]; 
	db->dev = c->dev; 
	if(qid & CHDIR) 
1990/11211    
	if(qid.path & CHDIR) 
1990/0227    
		db->mode = CHDIR|perm; 
	else 
		db->mode = perm; 
1990/0821/sys/src/9/port/dev.c:39,461990/11211/sys/src/9/port/dev.c:38,45
1990/0227    
	db->mtime = db->atime; 
	db->hlength = 0; 
	db->length = length; 
	db->uid = 0; 
	db->gid = 0; 
1990/11211    
	memcpy(db->uid, user, NAMELEN); 
	memcpy(db->gid, user, NAMELEN); 
1990/0227    
} 
 
int 
1990/0821/sys/src/9/port/dev.c:59,651990/11211/sys/src/9/port/dev.c:58,64
1990/0227    
	Chan *c; 
 
	c = newchan(); 
	c->qid = CHDIR; 
1990/11211    
	c->qid = (Qid){CHDIR, 0}; 
1990/0227    
	c->type = devno(tc, 0); 
	return c; 
} 
1990/0821/sys/src/9/port/dev.c:95,1031990/11211/sys/src/9/port/dev.c:94,100
1990/0227    
	for(i=0;; i++) 
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
			u->error.type = 0; 
			u->error.dev = 0; 
			u->error.code = Enonexist; 
1990/11211    
			strncpy(u->error, errstrtab[Enonexist], NAMELEN); 
1990/0227    
			return 0; 
		case 0: 
			continue; 
1990/0821/sys/src/9/port/dev.c:123,1291990/11211/sys/src/9/port/dev.c:120,126
1990/0227    
			 * devices with interesting directories usually don't get 
			 * here, which is good because we've lost the name by now. 
			 */ 
			if(c->qid & CHDIR){ 
1990/11211    
			if(c->qid.path & CHDIR){ 
1990/0227    
				devdir(c, c->qid, ".", 0L, CHDIR|0700, &dir); 
				convD2M(&dir, db); 
				return; 
1990/0821/sys/src/9/port/dev.c:132,1381990/11211/sys/src/9/port/dev.c:129,135
1990/0227    
		case 0: 
			break; 
		case 1: 
			if(c->qid == dir.qid){ 
1990/11211    
			if(eqqid(c->qid, dir.qid)){ 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1990/0821/sys/src/9/port/dev.c:180,1961990/11211/sys/src/9/port/dev.c:177,193
1990/0227    
		case 0: 
			break; 
		case 1: 
			if(c->qid == dir.qid){ 
1990/11211    
			if(eqqid(c->qid, dir.qid)){ 
1990/0227    
				if((access[omode&3] & dir.mode) == access[omode&3]) 
					goto Return; 
				error(0, Eperm); 
1990/11211    
				error(Eperm); 
1990/0227    
			} 
			break; 
		} 
    Return: 
	c->offset = 0; 
	if((c->qid&CHDIR) && omode!=OREAD) 
		error(0, Eperm); 
1990/11211    
	if((c->qid.path&CHDIR) && omode!=OREAD) 
		error(Eperm); 
1990/0227    
	c->mode = openmode(omode); 
	c->flag |= COPEN; 
	return c; 
1990/11211/sys/src/9/port/dev.c:38,451991/0318/sys/src/9/port/dev.c:38,45 (short | long)
Eliminate memcpy.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	db->mtime = db->atime; 
	db->hlength = 0; 
	db->length = length; 
1990/11211    
	memcpy(db->uid, user, NAMELEN); 
	memcpy(db->gid, user, NAMELEN); 
1991/0318    
	memmove(db->uid, user, NAMELEN); 
	memmove(db->gid, user, NAMELEN); 
1990/0227    
} 
 
int 
1991/0318/sys/src/9/port/dev.c:107,1121991/0411/sys/src/9/port/dev.c:107,118 (short | long)
Add devclwalk.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
		} 
} 
 
1991/0411    
int devclwalk(Chan *c, Chan *nc, char *name, Dirtab *tab, int ntab, Devgen *gen) 
{ 
	c = devclone(c, nc); 
	return devwalk(c, name, tab, ntab, gen); 
} 
 
1990/0227    
void 
devstat(Chan *c, char *db, Dirtab *tab, int ntab, Devgen *gen) 
{ 
1991/0411/sys/src/9/port/dev.c:107,1161991/0414/sys/src/9/port/dev.c:107,127 (short | long)
Bug fix: close nc if walk errors out.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
		} 
} 
 
1991/0411    
int devclwalk(Chan *c, Chan *nc, char *name, Dirtab *tab, int ntab, Devgen *gen) 
1991/0414    
Chan* 
devclwalk(Chan *c, char *name) 
1991/0411    
{ 
	c = devclone(c, nc); 
	return devwalk(c, name, tab, ntab, gen); 
1991/0414    
	Chan *nc; 
 
	nc = 0; 
	if(waserror()){ 
		if(nc) 
			close(nc); 
		return 0; 
	} 
	nc = (*devtab[c->type].clone)(c, 0); 
	(*devtab[nc->type].walk)(nc, name); 
	poperror(); 
	return nc; 
1991/0411    
} 
 
1990/0227    
void 
1991/0414/sys/src/9/port/dev.c:71,821991/0421/sys/src/9/port/dev.c:71,83 (short | long)
Copy nc->aux in devclone. Bug fix confusion: now walk is returning on error.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	if(nc == 0) 
		nc = newchan(); 
	nc->type = c->type; 
1991/0421    
	nc->dev = c->dev; 
1990/0227    
	nc->mode = c->mode; 
	nc->qid = c->qid; 
	nc->offset = c->offset; 
	nc->dev = c->dev; 
	nc->flag = c->flag; 
	nc->mnt = c->mnt; 
1991/0421    
	nc->aux = c->aux; 
1990/0303    
	nc->mchan = c->mchan; 
	nc->mqid = c->mqid; 
1990/0227    
	return nc; 
1991/0414/sys/src/9/port/dev.c:119,1251991/0421/sys/src/9/port/dev.c:120,129
1991/0414    
		return 0; 
	} 
	nc = (*devtab[c->type].clone)(c, 0); 
	(*devtab[nc->type].walk)(nc, name); 
1991/0421    
	if((*devtab[nc->type].walk)(nc, name) == 0){ 
		close(nc); 
		nc = 0; 
	} 
1991/0414    
	poperror(); 
	return nc; 
1991/0411    
} 
1991/0421/sys/src/9/port/dev.c:77,821991/0427/sys/src/9/port/dev.c:77,83 (short | long)
Copy mountid in devclone. Remove devclwalk entirely.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	nc->offset = c->offset; 
	nc->flag = c->flag; 
	nc->mnt = c->mnt; 
1991/0427    
	nc->mountid = c->mountid; 
1991/0421    
	nc->aux = c->aux; 
1990/0303    
	nc->mchan = c->mchan; 
	nc->mqid = c->mqid; 
1991/0421/sys/src/9/port/dev.c:106,1311991/0427/sys/src/9/port/dev.c:107,112
1990/0227    
			} 
			continue; 
		} 
} 
                 
1991/0414    
Chan* 
devclwalk(Chan *c, char *name) 
1991/0411    
{ 
1991/0414    
	Chan *nc; 
                 
	nc = 0; 
	if(waserror()){ 
		if(nc) 
			close(nc); 
		return 0; 
	} 
	nc = (*devtab[c->type].clone)(c, 0); 
1991/0421    
	if((*devtab[nc->type].walk)(nc, name) == 0){ 
		close(nc); 
		nc = 0; 
	} 
1991/0414    
	poperror(); 
	return nc; 
1991/0411    
} 
 
1990/0227    
void 
1991/0427/sys/src/9/port/dev.c:127,1331991/0626/sys/src/9/port/dev.c:127,134 (short | long)
Debugging: print when gen is broken, instead of panicking.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
			panic("devstat"); 
1991/0626    
			print("devstat %c %lux\n", devchar[c->type], c->qid.path); 
			error(Enonexist); 
1990/0227    
		case 0: 
			break; 
		case 1: 
1991/0626/sys/src/9/port/dev.c:24,301991/1109/sys/src/9/port/dev.c:24,30 (short | long)
Add user to devdir parameters.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
} 
 
void 
1990/11211    
devdir(Chan *c, Qid qid, char *n, long length, long perm, Dir *db) 
1991/1109    
devdir(Chan *c, Qid qid, char *n, long length, char *user, long perm, Dir *db) 
1990/0227    
{ 
	strcpy(db->name, n); 
	db->qid = qid; 
1991/0626/sys/src/9/port/dev.c:48,541991/1109/sys/src/9/port/dev.c:48,54
1990/0227    
	if(tab==0 || i>=ntab) 
		return -1; 
	tab += i; 
	devdir(c, tab->qid, tab->name, tab->length, tab->perm, dp); 
1991/1109    
	devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp); 
1990/0227    
	return 1; 
} 
 
1991/0626/sys/src/9/port/dev.c:123,1291991/1109/sys/src/9/port/dev.c:123,129
1990/0227    
			 * here, which is good because we've lost the name by now. 
			 */ 
1990/11211    
			if(c->qid.path & CHDIR){ 
1990/0227    
				devdir(c, c->qid, ".", 0L, CHDIR|0700, &dir); 
1991/1109    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1991/1109/sys/src/9/port/dev.c:38,451991/1112/sys/src/9/port/dev.c:38,45 (short | long)
Performance: replace memmove with strncpy. Compute access modes for permission.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	db->mtime = db->atime; 
	db->hlength = 0; 
	db->length = length; 
1991/0318    
	memmove(db->uid, user, NAMELEN); 
	memmove(db->gid, user, NAMELEN); 
1991/1112    
	strncpy(db->uid, user, NAMELEN); 
	strncpy(db->gid, eve, NAMELEN); 
1990/0227    
} 
 
int 
1991/1109/sys/src/9/port/dev.c:170,1751991/1112/sys/src/9/port/dev.c:170,176
1990/0227    
{ 
	int i; 
	Dir dir; 
1991/1112    
	ulong t, mode; 
1990/0227    
	static int access[] = { 0400, 0200, 0600, 0100 }; 
 
	for(i=0;; i++) 
1991/1109/sys/src/9/port/dev.c:180,1871991/1112/sys/src/9/port/dev.c:181,196
1990/0227    
		case 0: 
			break; 
		case 1: 
1990/11211    
			if(eqqid(c->qid, dir.qid)){ 
1990/0227    
				if((access[omode&3] & dir.mode) == access[omode&3]) 
1991/1112    
			if(eqqid(c->qid, dir.qid)) { 
				if(strcmp(u->p->user, dir.uid) == 0)	/* User */ 
					mode = dir.mode; 
				else if(strcmp(u->p->user, eve) == 0)	/* Bootes is group */ 
					mode = dir.mode<<3; 
				else 
					mode = dir.mode<<6;		/* Other */ 
 
				t = access[omode&3]; 
				if((t & mode) == t) 
1990/0227    
					goto Return; 
1990/11211    
				error(Eperm); 
1990/0227    
			} 
1991/1112/sys/src/9/port/dev.c:127,1331991/1120/sys/src/9/port/dev.c:127,134 (short | long)
Debugging: print more info about broken gen functions.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1991/0626    
			print("devstat %c %lux\n", devchar[c->type], c->qid.path); 
1991/1120    
			print("%s %s: devstat %c %lux\n", u->p->text, u->p->user, 
							devchar[c->type], c->qid.path); 
1991/0626    
			error(Enonexist); 
1990/0227    
		case 0: 
			break; 
1991/1120/sys/src/9/port/dev.c:119,1261991/1206/sys/src/9/port/dev.c:119,127 (short | long)
Comment edit.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
			/* 
			 * devices with interesting directories usually don't get 
			 * here, which is good because we've lost the name by now. 
1991/1206    
			 *  given a channel, we cannot derive the directory name 
			 *  that the channel was generated from since it was lost 
			 *  by namec. 
1990/0227    
			 */ 
1990/11211    
			if(c->qid.path & CHDIR){ 
1991/1109    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); 
1991/1120/sys/src/9/port/dev.c:177,1831991/1206/sys/src/9/port/dev.c:178,183
1990/0227    
	for(i=0;; i++) 
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
			/* Deal with union directories? */ 
			goto Return; 
		case 0: 
			break; 
1991/1120/sys/src/9/port/dev.c:185,1911991/1206/sys/src/9/port/dev.c:185,191
1991/1112    
			if(eqqid(c->qid, dir.qid)) { 
				if(strcmp(u->p->user, dir.uid) == 0)	/* User */ 
					mode = dir.mode; 
				else if(strcmp(u->p->user, eve) == 0)	/* Bootes is group */ 
1991/1206    
				else if(strcmp(u->p->user, eve) == 0)	/* eve is group */ 
1991/1112    
					mode = dir.mode<<3; 
				else 
					mode = dir.mode<<6;		/* Other */ 
1991/1206/sys/src/9/port/dev.c:9,141991/1220/sys/src/9/port/dev.c:9,16 (short | long)
Add kerndate.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
 
#include	"fcall.h" 
 
1991/1220    
extern ulong	kerndate; 
 
1990/0227    
int 
devno(int c, int user) 
{ 
1991/1206/sys/src/9/port/dev.c:35,411991/1220/sys/src/9/port/dev.c:37,43
1990/0227    
	else 
		db->mode = perm; 
	db->atime = seconds(); 
	db->mtime = db->atime; 
1991/1220    
	db->mtime = kerndate; 
1990/0227    
	db->hlength = 0; 
	db->length = length; 
1991/1112    
	strncpy(db->uid, user, NAMELEN); 
1991/1220/sys/src/9/port/dev.c:3,91992/0111/sys/src/9/port/dev.c:3,9 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1990/0227    
#define	DEVTAB 
#include	"devtab.h" 
 
1991/1220/sys/src/9/port/dev.c:98,1041992/0111/sys/src/9/port/dev.c:98,104
1990/0227    
	for(i=0;; i++) 
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
1990/11211    
			strncpy(u->error, errstrtab[Enonexist], NAMELEN); 
1992/0111    
			strncpy(u->error, Enonexist, NAMELEN); 
1990/0227    
			return 0; 
		case 0: 
			continue; 
1992/0111/sys/src/9/port/dev.c:1,51992/0321/sys/src/9/port/dev.c:1,5 (short | long)
Move lib.h to ../port. XXX get copies of old lib.h
rsc Fri Mar 4 12:44:25 2005
1990/0227    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1990/0227    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/port/dev.c:109,1141992/0520/sys/src/9/port/dev.c:109,115 (short | long)
Silence compiler warning.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
			} 
			continue; 
		} 
1992/0520    
	return 1;	/* not reached */ 
1991/0411    
} 
 
1990/0227    
void 
1992/0520/sys/src/9/port/dev.c:7,141992/0619/sys/src/9/port/dev.c:7,12 (short | long)
Remove "fcall.h".
rsc Fri Mar 4 12:44:25 2005
1990/0227    
#define	DEVTAB 
#include	"devtab.h" 
 
#include	"fcall.h" 
                 
1991/1220    
extern ulong	kerndate; 
 
1990/0227    
int 
1992/0619/sys/src/9/port/dev.c:57,621992/0711/sys/src/9/port/dev.c:57,63 (short | long)
Silence compiler warning.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
{ 
	Chan *c; 
 
1992/0711    
	USED(spec); 
1990/0227    
	c = newchan(); 
1990/11211    
	c->qid = (Qid){CHDIR, 0}; 
1990/0227    
	c->type = devno(tc, 0); 
1992/0711/sys/src/9/port/dev.c:12,261992/1217/sys/src/9/port/dev.c:12,33 (short | long)
Change: devchar is now a Rune string
rsc Fri Mar 4 12:44:25 2005
1990/0227    
int 
devno(int c, int user) 
{ 
	char *s; 
1992/1217    
	Rune *s; 
	int i; 
1990/0227    
 
	s = strchr(devchar, c); 
	if(s==0 || c==0){ 
		if(user) 
			return -1; 
		panic("devno %c 0x%ux", c, c); 
1992/1217    
	s = devchar; 
	i = 0; 
	while(*s){ 
		if(c == *s) 
			return i; 
		i++; 
		s++; 
1990/0227    
	} 
	return s - devchar; 
1992/1217    
 
	if(user) 
		return -1; 
	panic("devno %C 0x%ux", c, c); 
	return 0; 
1990/0227    
} 
 
void 
1992/0711/sys/src/9/port/dev.c:68,741992/1217/sys/src/9/port/dev.c:75,81
1990/0227    
devclone(Chan *c, Chan *nc) 
{ 
1990/0329    
	if(c->flag & COPEN) 
		panic("clone of open file type %c\n", devchar[c->type]); 
1992/1217    
		panic("clone of open file type %C\n", devchar[c->type]); 
1990/0227    
	if(nc == 0) 
		nc = newchan(); 
	nc->type = c->type; 
1992/0711/sys/src/9/port/dev.c:130,1361992/1217/sys/src/9/port/dev.c:137,143
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1991/1120    
			print("%s %s: devstat %c %lux\n", u->p->text, u->p->user, 
1992/1217    
			print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, 
1991/1120    
							devchar[c->type], c->qid.path); 
1991/0626    
			error(Enonexist); 
1990/0227    
		case 0: 
1992/1217/sys/src/9/port/dev.c:124,1311993/0321/sys/src/9/port/dev.c:124,133 (short | long)
Format edit.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	int i; 
	Dir dir; 
 
	for(i=0;; i++) 
1993/0321    
	for(i=0;; i++) { 
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
1993/0321    
		case 0: 
			break; 
1990/0227    
		case -1: 
			/* 
1991/1206    
			 *  given a channel, we cannot derive the directory name 
1992/1217/sys/src/9/port/dev.c:138,1541993/0321/sys/src/9/port/dev.c:140,155
1990/0227    
				return; 
			} 
1992/1217    
			print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, 
1991/1120    
							devchar[c->type], c->qid.path); 
1993/0321    
						devchar[c->type], c->qid.path); 
1991/0626    
			error(Enonexist); 
1990/0227    
		case 0: 
			break; 
		case 1: 
1990/11211    
			if(eqqid(c->qid, dir.qid)){ 
1993/0321    
			if(eqqid(c->qid, dir.qid)) { 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
			break; 
		} 
1993/0321    
	} 
1990/0227    
} 
 
long 
1993/0321/sys/src/9/port/dev.c:41,461993/0323/sys/src/9/port/dev.c:41,48 (short | long)
Add CHMOUNT bit to mounted channels.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
		db->mode = CHDIR|perm; 
	else 
		db->mode = perm; 
1993/0323    
	if(c->flag&CMSG) 
		db->mode |= CHMOUNT; 
1990/0227    
	db->atime = seconds(); 
1991/1220    
	db->mtime = kerndate; 
1990/0227    
	db->hlength = 0; 
1993/0321/sys/src/9/port/dev.c:144,1491993/0323/sys/src/9/port/dev.c:146,153
1991/0626    
			error(Enonexist); 
1990/0227    
		case 1: 
1993/0321    
			if(eqqid(c->qid, dir.qid)) { 
1993/0323    
				if(c->flag&CMSG) 
					dir.mode |= CHMOUNT; 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1993/0323/sys/src/9/port/dev.c:126,1351993/0330/sys/src/9/port/dev.c:126,133 (short | long)
Confusion over whether braces should stay. Use mode 775 not 700 for device directories.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
	int i; 
	Dir dir; 
 
1993/0321    
	for(i=0;; i++) { 
1993/0330    
	for(i=0;; i++) 
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
1993/0321    
		case 0: 
			break; 
1990/0227    
		case -1: 
			/* 
1991/1206    
			 *  given a channel, we cannot derive the directory name 
1993/0323/sys/src/9/port/dev.c:137,1511993/0330/sys/src/9/port/dev.c:135,151
1991/1206    
			 *  by namec. 
1990/0227    
			 */ 
1990/11211    
			if(c->qid.path & CHDIR){ 
1991/1109    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); 
1993/0330    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0775, &dir); 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1992/1217    
			print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, 
1993/0321    
						devchar[c->type], c->qid.path); 
1993/0330    
							devchar[c->type], c->qid.path); 
1991/0626    
			error(Enonexist); 
1993/0330    
		case 0: 
			break; 
1990/0227    
		case 1: 
1993/0321    
			if(eqqid(c->qid, dir.qid)) { 
1993/0330    
			if(eqqid(c->qid, dir.qid)){ 
1993/0323    
				if(c->flag&CMSG) 
					dir.mode |= CHMOUNT; 
1990/0227    
				convD2M(&dir, db); 
1993/0323/sys/src/9/port/dev.c:153,1591993/0330/sys/src/9/port/dev.c:153,158
1990/0227    
			} 
			break; 
		} 
1993/0321    
	} 
1990/0227    
} 
 
long 
1993/0330/sys/src/9/port/dev.c:65,751993/0501/sys/src/9/port/dev.c:65,80 (short | long)
Convert to Brazil: add Path, up, format edits. Directory mode back to 0700.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
devattach(int tc, char *spec) 
{ 
	Chan *c; 
1993/0501    
	char buf[NAMELEN+4]; 
1990/0227    
 
1992/0711    
	USED(spec); 
1990/0227    
	c = newchan(); 
1990/11211    
	c->qid = (Qid){CHDIR, 0}; 
1990/0227    
	c->type = devno(tc, 0); 
1993/0501    
	if(tc != 'M') { 
		sprint(buf, "#%C%s", tc, spec); 
		c->path = ptenter(&syspt, 0, buf); 
	} 
1990/0227    
	return c; 
} 
 
1993/0330/sys/src/9/port/dev.c:78,851993/0501/sys/src/9/port/dev.c:83,92
1990/0227    
{ 
1990/0329    
	if(c->flag & COPEN) 
1992/1217    
		panic("clone of open file type %C\n", devchar[c->type]); 
1993/0501    
 
1990/0227    
	if(nc == 0) 
		nc = newchan(); 
1993/0501    
 
1990/0227    
	nc->type = c->type; 
1991/0421    
	nc->dev = c->dev; 
1990/0227    
	nc->mode = c->mode; 
1993/0330/sys/src/9/port/dev.c:91,961993/0501/sys/src/9/port/dev.c:98,105
1991/0421    
	nc->aux = c->aux; 
1990/0303    
	nc->mchan = c->mchan; 
	nc->mqid = c->mqid; 
1993/0501    
	nc->path = c->path; 
	incref(nc->path); 
1990/0227    
	return nc; 
} 
 
1993/0330/sys/src/9/port/dev.c:99,1121993/0501/sys/src/9/port/dev.c:108,122
1990/0227    
{ 
	long i; 
	Dir dir; 
1993/0501    
	Path *op; 
1990/0227    
 
	isdir(c); 
	if(name[0]=='.' && name[1]==0) 
		return 1; 
	for(i=0;; i++) 
1993/0501    
	for(i=0;; i++) { 
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
1992/0111    
			strncpy(u->error, Enonexist, NAMELEN); 
1993/0501    
			strncpy(up->error, Enonexist, NAMELEN); 
1990/0227    
			return 0; 
		case 0: 
			continue; 
1993/0330/sys/src/9/port/dev.c:113,1231993/0501/sys/src/9/port/dev.c:123,137
1990/0227    
		case 1: 
			if(strcmp(name, dir.name) == 0){ 
				c->qid = dir.qid; 
1993/0501    
				op = c->path; 
				c->path = ptenter(&syspt, op, name); 
				decref(op); 
1990/0227    
				return 1; 
			} 
			continue; 
		} 
1992/0520    
	return 1;	/* not reached */ 
1993/0501    
	} 
	return 0;	/* not reached */ 
1991/0411    
} 
 
1990/0227    
void 
1993/0330/sys/src/9/port/dev.c:129,1511993/0501/sys/src/9/port/dev.c:143,165
1993/0330    
	for(i=0;; i++) 
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
			/* 
1991/1206    
			 *  given a channel, we cannot derive the directory name 
			 *  that the channel was generated from since it was lost 
			 *  by namec. 
1990/0227    
			 */ 
1993/0501    
		/* 
		 *  given a channel, we cannot derive the directory name 
		 *  that the channel was generated from since it was lost 
		 *  by namec. 
		 */ 
1990/11211    
			if(c->qid.path & CHDIR){ 
1993/0330    
				devdir(c, c->qid, ".", 0L, eve, CHDIR|0775, &dir); 
1993/0501    
				devdir(c, c->qid, c->path->elem, i*DIRLEN, eve, CHDIR|0700, &dir); 
1990/0227    
				convD2M(&dir, db); 
				return; 
			} 
1992/1217    
			print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, 
1993/0330    
							devchar[c->type], c->qid.path); 
1993/0501    
			print("%s %s: devstat %C %lux\n", up->text, up->user, 
						devchar[c->type], c->qid.path); 
1991/0626    
			error(Enonexist); 
1993/0330    
		case 0: 
			break; 
1990/0227    
		case 1: 
1993/0330    
			if(eqqid(c->qid, dir.qid)){ 
1993/0501    
			if(eqqid(c->qid, dir.qid)) { 
1993/0323    
				if(c->flag&CMSG) 
					dir.mode |= CHMOUNT; 
1990/0227    
				convD2M(&dir, db); 
1993/0330/sys/src/9/port/dev.c:162,1681993/0501/sys/src/9/port/dev.c:176,182
1990/0227    
	Dir dir; 
 
	k = c->offset/DIRLEN; 
1990/0821    
	for(m=0; m<n; k++) 
1993/0501    
	for(m=0; m<n; k++) { 
1990/0227    
		switch((*gen)(c, tab, ntab, k, &dir)){ 
		case -1: 
1990/0821    
			return m; 
1993/0330/sys/src/9/port/dev.c:177,1821993/0501/sys/src/9/port/dev.c:191,198
1990/0227    
			d += DIRLEN; 
			break; 
		} 
1993/0501    
	} 
 
1990/0821    
	return m; 
1990/0227    
} 
 
1993/0330/sys/src/9/port/dev.c:188,1941993/0501/sys/src/9/port/dev.c:204,210
1991/1112    
	ulong t, mode; 
1990/0227    
	static int access[] = { 0400, 0200, 0600, 0100 }; 
 
	for(i=0;; i++) 
1993/0501    
	for(i=0;; i++) { 
1990/0227    
		switch((*gen)(c, tab, ntab, i, &dir)){ 
		case -1: 
			goto Return; 
1993/0330/sys/src/9/port/dev.c:196,2071993/0501/sys/src/9/port/dev.c:212,224
1990/0227    
			break; 
		case 1: 
1991/1112    
			if(eqqid(c->qid, dir.qid)) { 
				if(strcmp(u->p->user, dir.uid) == 0)	/* User */ 
1993/0501    
				if(strcmp(up->user, dir.uid) == 0) 
1991/1112    
					mode = dir.mode; 
1991/1206    
				else if(strcmp(u->p->user, eve) == 0)	/* eve is group */ 
1993/0501    
				else 
				if(strcmp(up->user, eve) == 0) 
1991/1112    
					mode = dir.mode<<3; 
				else 
					mode = dir.mode<<6;		/* Other */ 
1993/0501    
					mode = dir.mode<<6; 
1991/1112    
 
				t = access[omode&3]; 
				if((t & mode) == t) 
1993/0330/sys/src/9/port/dev.c:210,2161993/0501/sys/src/9/port/dev.c:227,234
1990/0227    
			} 
			break; 
		} 
    Return: 
1993/0501    
	} 
Return: 
1990/0227    
	c->offset = 0; 
1990/11211    
	if((c->qid.path&CHDIR) && omode!=OREAD) 
		error(Eperm); 
Too many diffs (26 > 25). Stopping.


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