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

1991/1112/port/devproc.c (diff list | history)

1991/1111/sys/src/9/port/devproc.c:26,351991/1112/sys/src/9/port/devproc.c:26,35 (short | long | prev | next)
1991/1109    
	"ctl",		{Qctl},		0,			0000, 
	"mem",		{Qmem},		0,			0000, 
	"note",		{Qnote},	0,			0000, 
1990/11211    
	"notepg",	{Qnotepg},	0,			0200, 
1991/1112    
	"notepg",	{Qnotepg},	0,			0000, 
1991/1109    
	"proc",		{Qproc},	sizeof(Proc),		0000, 
1991/0705    
	"segment",	{Qsegment},	0,			0400, 
1991/0807    
	"status",	{Qstatus},	STATSIZE,		0400, 
1991/1112    
	"segment",	{Qsegment},	0,			0444, 
	"status",	{Qstatus},	STATSIZE,		0444, 
1991/1109    
	"text",		{Qtext},	0,			0000, 
1990/0227    
}; 
 
1991/1111/sys/src/9/port/devproc.c:72,781991/1112/sys/src/9/port/devproc.c:72,78
1990/0227    
		if(pid == 0) 
			return 0; 
		sprint(buf, "%d", pid); 
1991/1109    
		devdir(c, (Qid){CHDIR|((s+1)<<QSHIFT), pid}, buf, 0, p->user, CHDIR|0500, dp); 
1991/1112    
		devdir(c, (Qid){CHDIR|((s+1)<<QSHIFT), pid}, buf, 0, p->user, CHDIR|0555, dp); 
1990/0227    
		return 1; 
	} 
	if(s >= NPROC) 
1991/1111/sys/src/9/port/devproc.c:141,1511991/1112/sys/src/9/port/devproc.c:141,149
1991/0705    
	Segment *s; 
1990/0227    
	Chan *tc; 
 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/03081    
		if(omode != OREAD) 
1990/11211    
			error(Eperm); 
1990/03081    
		goto done; 
	} 
1991/1112    
	if(c->qid.path & CHDIR) 
		return devopen(c, omode, 0, 0, procgen); 
 
1990/0227    
	p = proctab(SLOT(c->qid)); 
1990/1110    
	pg = p->pgrp; 
1990/11211    
	if(p->pid != PID(c->qid)) 
1991/1111/sys/src/9/port/devproc.c:155,1601991/1112/sys/src/9/port/devproc.c:153,160
1990/0227    
 
	switch(QID(c->qid)){ 
	case Qtext: 
1991/1112    
		if(omode != OREAD) 
			error(Eperm); 
1991/1110    
		tc = proctext(c, p); 
1990/0227    
		tc->offset = 0; 
1991/1110    
 
1991/1111/sys/src/9/port/devproc.c:164,1691991/1112/sys/src/9/port/devproc.c:164,171
1990/0227    
	case Qnote: 
1991/1110    
	case Qmem: 
1991/0705    
	case Qsegment: 
1991/1112    
	case Qproc: 
	case Qstatus: 
1990/0227    
		break; 
1990/1110    
 
	case Qnotepg: 
1991/1111/sys/src/9/port/devproc.c:172,1841991/1112/sys/src/9/port/devproc.c:174,179
1990/11211    
		c->pgrpid.path = pg->index+1; 
		c->pgrpid.vers = pg->pgrpid; 
1990/1110    
		break; 
                 
1990/0227    
	case Qdir: 
	case Qproc: 
	case Qstatus: 
1990/1110    
		if(omode != OREAD) 
1990/11211    
			error(Eperm); 
1990/0424    
		break; 
1990/0227    
	default: 
		pprint("unknown qid in devopen\n"); 
1990/11211    
		error(Egreg); 
1991/1111/sys/src/9/port/devproc.c:187,1971991/1112/sys/src/9/port/devproc.c:182,190
1991/1110    
	/* Affix pid to qid */ 
1990/0227    
	if(p->state != Dead) 
1990/11211    
		c->qid.vers = p->pid; 
1990/03081    
   done: 
1990/0227    
	c->mode = omode; 
	c->flag |= COPEN; 
	c->offset = 0; 
	return c; 
1991/1112    
 
	return devopen(c, omode, 0, 0, procgen); 
; 
1990/0227    
} 
 
void 
1991/1111/sys/src/9/port/devproc.c:212,2171991/1112/sys/src/9/port/devproc.c:205,213
1991/1109    
	Proc *p; 
	Dir d; 
 
1991/1112    
	if(c->qid.path&CHDIR) 
		error(Eperm); 
 
1991/1109    
	convM2D(db, &d); 
	p = proctab(SLOT(c->qid)); 
	if(p->pid != PID(c->qid)) 
1991/1111/sys/src/9/port/devproc.c:349,3541991/1112/sys/src/9/port/devproc.c:345,352
1991/0705    
			return 0; 
		if(offset+n > j) 
			n = j-offset; 
1991/1112    
		if(n == 0 && offset == 0) 
			errors("no segments"); 
1991/0705    
		memmove(a, &statbuf[offset], n); 
		return n; 
1990/0227    
	} 
1991/1111/sys/src/9/port/devproc.c:425,4301991/1112/sys/src/9/port/devproc.c:423,430
1991/1110    
		break; 
 
1990/0227    
	case Qnote: 
1991/1112    
		if(p->kp) 
			errors("can' t note kproc"); 
1990/0614    
		k = kmap(p->upage); 
		up = (User*)VA(k); 
1990/0227    
		if(up->p != p){ 
1991/1111/sys/src/9/port/devproc.c:460,4661991/1112/sys/src/9/port/devproc.c:460,468
1991/1110    
	Segment *s; 
 
	s = p->seg[TSEG]; 
	if(s==0 || p->state==Dead) 
1991/1112    
	if(s == 0) 
		errors("no text segment"); 
	if(p->state==Dead) 
1991/1110    
		error(Eprocdied); 
 
	lock(s); 
1991/1111/sys/src/9/port/devproc.c:546,5931991/1112/sys/src/9/port/devproc.c:548,589
1991/1110    
void 
1991/1109    
procctlreq(Proc *p, char *va, int n) 
{ 
	if(n >= 4) { 
		if(strncmp(va, "exit", 4) == 0) { 
			if(p->state == Broken) 
				ready(p); 
			return; 
		} 
		if(strncmp(va, "stop", 4) == 0) { 
1991/1110    
			procstopwait(p, Proc_stopme); 
1991/1109    
			return; 
		} 
		if(strncmp(va, "kill", 4) == 0) { 
			postnote(p, 0, "sys: killed", NExit); 
			p->procctl = Proc_exitme; 
			return; 
		} 
1991/1110    
		if(strncmp(va, "hang", 4) == 0) { 
			p->hang = 1; 
			return; 
		} 
1991/1109    
	} 
1991/1112    
	char buf[NAMELEN]; 
1991/1109    
 
1991/1110    
	if(n >= 8 && strncmp(va, "waitstop", 8) == 0) { 
		procstopwait(p, 0); 
		return; 
1991/1112    
	if(n > NAMELEN) 
		n = NAMELEN; 
	strncpy(buf, va, n); 
 
	if(strncmp(buf, "exit", 4) == 0) { 
		if(p->state == Broken) 
			ready(p); 
1991/1110    
	} 
                  
	if(n >= 9 && strncmp(va, "startstop", 9) == 0) { 
1991/1112    
	else if(strncmp(buf, "stop", 4) == 0) 
		procstopwait(p, Proc_stopme); 
	else if(strncmp(buf, "kill", 4) == 0) { 
		if(p->state == Stopped) 
			ready(p); 
		postnote(p, 0, "sys: killed", NExit); 
		p->procctl = Proc_exitme; 
	} 
	else if(strncmp(buf, "hang", 4) == 0) 
		p->hang = 1; 
	else if(strncmp(buf, "waitstop", 8) == 0) 
		procstopwait(p, 0); 
	else if(strncmp(buf, "startstop", 9) == 0) { 
1991/1110    
		if(p->state != Stopped) 
			errors("not stopped"); 
		p->procctl = Proc_traceme; 
		ready(p); 
		procstopwait(p, Proc_traceme); 
		return; 
	} 
1991/1109    
	if(n >= 5 && strncmp(va, "start", 5) == 0) { 
1991/1112    
	else if(strncmp(buf, "start", 5) == 0) { 
1991/1109    
		if(p->state != Stopped) 
			errors("not stopped"); 
		ready(p); 
		return; 
	} 
1991/1110    
                 
1991/1109    
	error(Ebadctl); 
1991/1112    
	else 
		error(Ebadctl); 
1991/1109    
} 
 
int 


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