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

1993/0501/port/devroot.c (diff list | history)

1992/0902/sys/src/9/port/devroot.c:6,121993/0501/sys/src/9/port/devroot.c:6,13 (short | long | prev | next)
1992/0111    
#include	"../port/error.h" 
1990/0227    
#include	"devtab.h" 
 
enum{ 
1993/0501    
enum 
{ 
1990/0227    
	Qdir, 
	Qbin, 
	Qdev, 
1992/0902/sys/src/9/port/devroot.c:13,181993/0501/sys/src/9/port/devroot.c:14,20
1990/0227    
	Qenv, 
	Qproc, 
1992/0213    
	Qnet, 
1993/0501    
	Qrecover, 
1991/1206    
 
	Qboot, 
	Qcfs, 
1992/0902/sys/src/9/port/devroot.c:33,381993/0501/sys/src/9/port/devroot.c:35,41
1991/1112    
	"env",		{Qenv|CHDIR},	0,			0777, 
	"proc",		{Qproc|CHDIR},	0,			0777, 
1992/0213    
	"net",		{Qnet|CHDIR},	0,			0777, 
1993/0501    
	"recover",	{Qrecover},	0,			0777, 
1990/0227    
}; 
#define	NROOT	(sizeof rootdir/sizeof(Dirtab)) 
1991/0615    
Dirtab rootpdir[]={ 
1992/0902/sys/src/9/port/devroot.c:42,471993/0501/sys/src/9/port/devroot.c:45,66
1991/0615    
Dirtab *rootmap[sizeof rootpdir/sizeof(Dirtab)]; 
1991/0214    
int	nroot; 
1990/0227    
 
1993/0501    
typedef struct Recover Recover; 
struct Recover 
{ 
	int	len; 
	char	*req; 
	Recover	*next; 
}; 
 
struct  
{ 
	Lock; 
	QLock; 
	Rendez; 
	Recover	*q; 
}reclist; 
 
1991/0615    
int 
rootgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp) 
{ 
1992/0902/sys/src/9/port/devroot.c:110,1151993/0501/sys/src/9/port/devroot.c:129,143
1990/0227    
Chan* 
rootopen(Chan *c, int omode) 
{ 
1993/0501    
	switch(c->qid.path & ~CHDIR) { 
	default: 
		break; 
	case Qrecover: 
		if(strcmp(up->user, eve) != 0) 
			error(Eperm); 
		break; 
	} 
 
1991/0615    
	return devopen(c, omode, rootdir, nroot, rootgen); 
1990/0227    
} 
 
1992/0902/sys/src/9/port/devroot.c:129,1371993/0501/sys/src/9/port/devroot.c:157,173
1991/1115    
	USED(c); 
1990/0227    
} 
 
1993/0501    
int 
rdrdy(void *a) 
{ 
	USED(a); 
	return reclist.q != 0; 
} 
 
1990/0227    
long	  
1991/0411    
rootread(Chan *c, void *buf, long n, ulong offset) 
1990/0227    
{ 
1993/0501    
	Recover *r; 
1990/0227    
 
1990/11211    
	switch(c->qid.path & ~CHDIR){ 
1990/0227    
	case Qdir: 
1992/0902/sys/src/9/port/devroot.c:161,1661993/0501/sys/src/9/port/devroot.c:197,226
1992/0902    
		memmove(buf, ((char*)fscode)+offset, n); 
1990/0227    
		return n; 
 
1993/0501    
	case Qrecover: 
		qlock(&reclist); 
		if(waserror()) { 
			qunlock(&reclist); 
			nexterror(); 
		} 
 
		sleep(&reclist, rdrdy, 0); 
 
		lock(&reclist); 
		r = reclist.q; 
		reclist.q = r->next; 
		unlock(&reclist); 
 
		qunlock(&reclist); 
 
		poperror(); 
		if(n < r->len) 
			n = r->len; 
		memmove(buf, r->req, n); 
		free(r->req); 
		free(r); 
		return n; 
 
1990/0227    
	case Qdev: 
		return 0; 
	} 
1992/0902/sys/src/9/port/devroot.c:170,1781993/0501/sys/src/9/port/devroot.c:230,251
1990/0227    
long	  
1991/0411    
rootwrite(Chan *c, void *buf, long n, ulong offset) 
1990/0227    
{ 
1991/1115    
	USED(c, buf, n, offset); 
1990/11211    
	error(Egreg); 
1992/0520    
	return 0;	/* not reached */ 
1993/0501    
	char tmp[256]; 
 
	USED(offset); 
	switch(c->qid.path & ~CHDIR){ 
	default: 
		error(Egreg); 
	case Qrecover: 
		if(n > sizeof(tmp)-1) 
			error(Etoosmall); 
		/* Nul terminate */ 
		memmove(tmp, buf, n); 
		tmp[n] = '\0'; 
		mntrepl(tmp); 
		return n; 
	} 
	return 0; 
1990/0227    
} 
 
void	  
1992/0902/sys/src/9/port/devroot.c:187,1901993/0501/sys/src/9/port/devroot.c:260,281
1990/0227    
{ 
1991/1115    
	USED(c, dp); 
1990/11211    
	error(Eperm); 
1993/0501    
} 
 
void 
rootrecover(Path *p, char *mntname) 
{ 
	int i; 
	Recover *r; 
	char buf[256]; 
 
	r = malloc(sizeof(Recover)); 
	i = ptpath(p, buf, sizeof(buf)); 
	r->req = smalloc(i+strlen(mntname)+2); 
	sprint(r->req, "%s %s", buf, mntname); 
	lock(&reclist); 
	r->next = reclist.q; 
	reclist.q = r; 
	unlock(&reclist); 
	wakeup(&reclist); 
1990/0227    
} 


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