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

1993/0330/port/devcons.c (diff list | history)

1993/0216/sys/src/9/port/devcons.c:21,281993/0330/sys/src/9/port/devcons.c:21,26 (short | long | prev | next)
1991/1224    
static Ref	ctl;			/* number of opens to the control file */ 
static int	raw;			/* true if raw has been requested on a ctl file */ 
1990/0227    
 
1991/1109    
char	eve[NAMELEN] = "bootes"; 
1991/1207    
char	evekey[DESKEYLEN]; 
1992/0321    
char	sysname[NAMELEN]; 
1991/1109    
 
1990/0227    
/* 
1993/0216/sys/src/9/port/devcons.c:184,1961993/0330/sys/src/9/port/devcons.c:182,189
1991/0720    
		return 0; 
 
1991/0705    
	c = u->p->fgrp->fd[2]; 
1993/0216    
	if(c == 0 || (c->mode!=OWRITE && c->mode!=ORDWR)) 
1993/0330    
	if(c==0 || (c->mode!=OWRITE && c->mode!=ORDWR)) 
1990/0321    
		return 0; 
1993/0216    
                 
	/* Can't afford to take an error in notify */ 
	if(waserror()) 
		return 0; 
                 
1990/0227    
	n = sprint(buf, "%s %d: ", u->p->text, u->p->pid); 
1990/06111    
	n = doprint(buf+n, buf+sizeof(buf), fmt, (&fmt+1)) - buf; 
1992/0825    
 
1993/0216/sys/src/9/port/devcons.c:199,2051993/0330/sys/src/9/port/devcons.c:192,198
1992/0825    
	lock(c); 
1990/0227    
	c->offset += n; 
1992/0825    
	unlock(c); 
1993/0216    
	poperror(); 
1993/0330    
 
1990/0227    
	return n; 
} 
 
1993/0216/sys/src/9/port/devcons.c:325,3381993/0330/sys/src/9/port/devcons.c:318,333
1990/0227    
 
enum{ 
1992/0506    
	Qdir, 
1992/0428    
	Qchal, 
1993/0330    
	Qauth, 
	Qauthcheck, 
1992/0428    
	Qclock, 
1990/0227    
	Qcons, 
1991/1224    
	Qconsctl, 
1990/0227    
	Qcputime, 
1992/0428    
	Qcrypt, 
1992/0617    
	Qhz, 
1992/0428    
	Qkey, 
1993/0330    
	Qhostdomain, 
	Qhostowner, 
1992/0428    
	Qklog, 
1991/0607    
	Qlights, 
1992/0428    
	Qmsec, 
1993/0216/sys/src/9/port/devcons.c:350,3611993/0330/sys/src/9/port/devcons.c:345,358
1990/0227    
}; 
 
Dirtab consdir[]={ 
1992/0428    
	"chal",		{Qchal},	8,		0666, 
1993/0330    
	"authenticate",	{Qauth},	0,		0666, 
	"authcheck",	{Qauthcheck},	0,		0666, 
1992/0428    
	"clock",	{Qclock},	2*NUMSIZE,	0444, 
1991/1211    
	"cons",		{Qcons},	0,		0660, 
1991/1224    
	"consctl",	{Qconsctl},	0,		0220, 
1991/1127    
	"cputime",	{Qcputime},	6*NUMSIZE,	0444, 
1992/0428    
	"crypt",	{Qcrypt},	0,		0666, 
1993/0330    
	"hostdomain",	{Qhostdomain},	DOMLEN,		0622, 
	"hostowner",	{Qhostowner},	NAMELEN,	0622, 
1992/0617    
	"hz",		{Qhz},		NUMSIZE,	0666, 
1992/0428    
	"key",		{Qkey},		DESKEYLEN,	0622, 
	"klog",		{Qklog},	0,		0444, 
1993/0216/sys/src/9/port/devcons.c:371,3771993/0330/sys/src/9/port/devcons.c:368,374
1992/0428    
	"sysname",	{Qsysname},	0,		0664, 
	"sysstat",	{Qsysstat},	0,		0666, 
	"time",		{Qtime},	NUMSIZE,	0664, 
	"user",		{Quser},	0,		0666, 
1993/0330    
 	"user",		{Quser},	NAMELEN,	0664, 
1990/0227    
}; 
 
#define	NCONS	(sizeof consdir/sizeof(Dirtab)) 
1993/0216/sys/src/9/port/devcons.c:451,4641993/0330/sys/src/9/port/devcons.c:448,461
1990/0227    
Chan* 
consopen(Chan *c, int omode) 
{ 
1993/0330    
	c->aux = 0; 
1991/0607    
	switch(c->qid.path){ 
1991/1224    
	case Qconsctl: 
1991/1211    
		if(strcmp(u->p->user, eve) != 0) 
1993/0330    
		if(!iseve()) 
1991/0620    
			error(Eperm); 
1991/1224    
		incref(&ctl); 
1991/0607    
		break; 
1990/0227    
	} 
1991/1127    
	c->aux = 0; 
1990/0227    
	return devopen(c, omode, consdir, NCONS, devgen); 
} 
 
1993/0216/sys/src/9/port/devcons.c:473,4871993/0330/sys/src/9/port/devcons.c:470,487
1990/0227    
consclose(Chan *c) 
{ 
1991/1224    
	/* last close of control file turns off raw */ 
	if(c->qid.path==Qconsctl && (c->flag&COPEN)){ 
		lock(&ctl); 
		if(--ctl.ref == 0) 
			raw = 0; 
		unlock(&ctl); 
1993/0330    
	switch(c->qid.path){ 
	case Qconsctl: 
		if(c->flag&COPEN){ 
			lock(&ctl); 
			if(--ctl.ref == 0) 
				raw = 0; 
			unlock(&ctl); 
		} 
	case Qauth: 
	case Qauthcheck: 
		authclose(c); 
1991/1224    
	} 
1991/1127    
	if(c->qid.path == Qcrypt && c->aux) 
1992/0826    
		free(c->aux); 
1991/1127    
	c->aux = 0; 
1990/0227    
} 
 
long 
1993/0216/sys/src/9/port/devcons.c:490,4961993/0330/sys/src/9/port/devcons.c:490,496
1992/0814    
	int ch, i, k, id; 
1990/0227    
	ulong l; 
	char *cbuf = buf; 
1992/0826    
	char *chal, *b, *bp, *cb; 
1993/0330    
	char *b, *bp; 
1992/0814    
	char tmp[128];	/* must be >= 6*NUMSIZE */ 
1991/0425    
	Mach *mp; 
1990/0227    
 
1993/0216/sys/src/9/port/devcons.c:591,6251993/0330/sys/src/9/port/devcons.c:591,608
1991/0607    
		memmove(buf, tmp+k, n); 
		return n; 
 
1991/1127    
	case Qcrypt: 
		cb = c->aux; 
		if(!cb) 
			return 0; 
1992/0826    
		if(n > MAXCRYPT) 
			n = MAXCRYPT; 
		memmove(buf, &cb[1], n); 
1991/1127    
		return n; 
1993/0330    
	case Qkey: 
		return keyread(buf, n, offset); 
1991/1127    
 
	case Qchal: 
1992/0323    
		if(offset!=0 || n!=8) 
1991/1127    
			error(Ebadarg); 
		chal = u->p->pgrp->crypt->chal; 
1992/0318    
		chal[0] = RXschal; 
1992/0603    
		for(i=1; i<AUTHLEN; i++) 
1991/1127    
			chal[i] = nrand(256); 
		memmove(buf, chal, 8); 
		encrypt(evekey, buf, 8); 
1992/0318    
		chal[0] = RXstick; 
1992/0323    
		return n; 
1993/0330    
	case Qauth: 
		return authread(c, cbuf, n); 
1992/0323    
 
	case Qkey: 
		if(offset!=0 || n!=DESKEYLEN) 
			error(Ebadarg); 
1992/0725    
		if(strcmp(u->p->user, eve)!=0 || !cpuserver) 
1992/0323    
			error(Eperm); 
		memmove(buf, evekey, DESKEYLEN); 
1991/1127    
		return n; 
1993/0330    
	case Qhostowner: 
		return readstr(offset, buf, n, eve); 
1991/1127    
 
1993/0330    
	case Qhostdomain: 
		return readstr(offset, buf, n, hostdomain); 
 
1990/0227    
	case Quser: 
1991/1105    
		return readstr(offset, buf, n, u->p->user); 
1990/0227    
 
1993/0216/sys/src/9/port/devcons.c:742,7481993/0330/sys/src/9/port/devcons.c:725,731
1990/0227    
	char cbuf[64]; 
	char buf[256]; 
1991/1116    
	long l, bp; 
1992/0826    
	char *a = va, *cb; 
1993/0330    
	char *a = va; 
1991/0425    
	Mach *mp; 
1991/1224    
	int id, fd, ch; 
1991/0705    
	Chan *swc; 
1993/0216/sys/src/9/port/devcons.c:801,8631993/0330/sys/src/9/port/devcons.c:784,806
1992/0522    
		boottime = strtoul(a, 0, 0)-TK2SEC(MACHP(0)->ticks); 
1990/0227    
		break; 
 
1991/1127    
	case Qcrypt: 
		cb = c->aux; 
		if(!cb){ 
1992/0826    
			/* first byte determines whether encrypting or decrypting */ 
			cb = c->aux = smalloc(MAXCRYPT+1); 
			cb[0] = 'E'; 
1991/1127    
		} 
		if(n < 8){ 
			if(n != 1 || a[0] != 'E' && a[0] != 'D') 
				error(Ebadarg); 
1992/0826    
			cb[0] = a[0]; 
1991/1127    
			return 1; 
		} 
1992/0826    
		if(n > MAXCRYPT) 
			n = MAXCRYPT; 
		memset(&cb[1], 0, MAXCRYPT); 
		memmove(&cb[1], a, n); 
		if(cb[0] == 'E') 
			encrypt(u->p->pgrp->crypt->key, &cb[1], n); 
1991/1127    
		else 
1992/0826    
			decrypt(u->p->pgrp->crypt->key, &cb[1], n); 
1991/1127    
		break; 
                 
	case Qkey: 
1991/1207    
		if(n != DESKEYLEN) 
1991/1127    
			error(Ebadarg); 
1991/1207    
		memmove(u->p->pgrp->crypt->key, a, DESKEYLEN); 
1991/1127    
		if(strcmp(u->p->user, eve) == 0) 
1991/1207    
			memmove(evekey, a, DESKEYLEN); 
1991/1127    
		break; 
1993/0330    
		return keywrite(a, n); 
1991/1127    
 
1993/0330    
	case Qhostowner: 
		return hostownerwrite(a, n); 
 
	case Qhostdomain: 
		return hostdomainwrite(a, n); 
 
1990/0227    
	case Quser: 
1992/0725    
		if(offset!=0 || n>=NAMELEN-1) 
1991/1127    
			error(Ebadarg); 
1992/0725    
		strncpy(buf, a, NAMELEN); 
		if(strcmp(buf, "none")==0 
		|| strcmp(buf, u->p->user)==0 
		|| strcmp(u->p->user, eve)==0) 
			memmove(u->p->user, buf, NAMELEN); 
		else 
1991/1127    
			error(Eperm); 
1992/0725    
		if(!cpuserver && strcmp(eve, "bootes")==0) 
1991/1127    
			memmove(eve, u->p->user, NAMELEN); 
1990/0227    
		break; 
1993/0330    
		return userwrite(a, n); 
1990/0227    
 
1991/1127    
	case Qchal: 
		if(offset != 0) 
			error(Ebadarg); 
1991/1207    
		if(n != 8+NAMELEN+DESKEYLEN) 
1991/1127    
			error(Ebadarg); 
		decrypt(evekey, a, n); 
		if(memcmp(u->p->pgrp->crypt->chal, a, 8) != 0) 
1992/0114    
			error(Eperm); 
1991/1127    
		strncpy(u->p->user, a+8, NAMELEN); 
		u->p->user[NAMELEN-1] = '\0'; 
1992/0129    
		memmove(u->p->pgrp->crypt->key, a+8+NAMELEN, DESKEYLEN); 
1991/1127    
		break; 
1993/0330    
	case Qauth: 
		return authwrite(c, a, n); 
 
	case Qauthcheck: 
		return authcheck(c, a, n); 
1990/0227    
 
	case Qnull: 
		break; 


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