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

1992/0428/port/sysproc.c (diff list | history)

1992/0420/sys/src/9/port/sysproc.c:21,291992/0428/sys/src/9/port/sysproc.c:21,35 (short | long | prev | next)
1990/0227    
sysfork(ulong *arg) 
{ 
1991/1115    
	USED(arg); 
1991/0808    
	return rfork(Forkfd); 
1992/0428    
	return rfork(FORKFDG|FORKPCS); 
1991/0807    
} 
 
1992/0428    
long 
sys__rfork__(ulong *arg) 
{ 
	return rfork(arg[0]|FORKPCS); 
} 
 
1991/0807    
/* This call will obsolete fork */ 
long 
sysrfork(ulong *arg) 
1992/0420/sys/src/9/port/sysproc.c:40,501992/0428/sys/src/9/port/sysproc.c:46,93
1992/0420    
	int n, on, i; 
1990/0227    
	Chan *c; 
1990/0614    
	KMap *k; 
1992/0428    
	Pgrp *opg; 
	Egrp *oeg; 
	Fgrp *ofg; 
1991/0807    
	/* 
	 * used to compute last valid system stack address for copy 
	 */ 
	int lastvar;	 
1991/0709    
 
1992/0428    
	p = u->p; 
	if((flag&FORKPCS) == 0) { 
		if(flag & (FORKNSG|FORKCNSG)) { 
			if((flag & (FORKNSG|FORKCNSG)) == (FORKNSG|FORKCNSG)) 
				error(Ebadarg); 
			opg = p->pgrp; 
			p->pgrp = newpgrp(); 
			if(flag & FORKNSG) 
				pgrpcpy(p->pgrp, opg); 
			closepgrp(opg); 
		} 
		if(flag & (FORKEVG|FORKCEVG)) { 
			if((flag & (FORKEVG|FORKCEVG)) == (FORKEVG|FORKCEVG)) 
				error(Ebadarg); 
			oeg = p->egrp; 
			p->egrp = newegrp(); 
			if(flag & FORKEVG) 
				envcpy(p->egrp, oeg); 
			closeegrp(oeg); 
		} 
		if(flag & FORKFDG) 
			error(Ebadarg); 
		if(flag & FORKCFDG) { 
			ofg = p->fgrp; 
			p->fgrp = newfgrp(); 
			closefgrp(ofg); 
		} 
		if(flag & FORKNTG) 
			p->noteid = incref(¬eidalloc); 
		if(flag & FORKMEM) 
			error(Ebadarg); 
		return 0; 
	} 
 
1990/0227    
	p = newproc(); 
1991/0705    
 
	/* Page va of upage used as check in mapstack */ 
1992/0420/sys/src/9/port/sysproc.c:66,951992/0428/sys/src/9/port/sysproc.c:109,165
1991/0705    
			p->seg[i] = dupseg(u->p->seg[i]); 
 
1991/1110    
	/* Refs */ 
1992/0307    
	incref(u->dot);					/* File descriptors etc. */ 
1992/0428    
	incref(u->dot);	 
1991/0705    
 
1991/0807    
	if(flag & Forkfd) 
		p->fgrp = dupfgrp(u->p->fgrp); 
1991/0808    
	else{ 
1992/0428    
	if(flag & FORKMEM) 
		error(Egreg); 
 
	/* File descriptors */ 
	if(flag & (FORKFDG|FORKCFDG)) { 
		if((flag & (FORKFDG|FORKCFDG)) == (FORKFDG|FORKCFDG)) 
			error(Ebadarg); 
		if(flag & FORKFDG) 
			p->fgrp = dupfgrp(u->p->fgrp); 
		else 
		if(flag & FORKCFDG) 
			p->fgrp = newfgrp(); 
	} 
	else { 
1991/0807    
		p->fgrp = u->p->fgrp; 
		incref(p->fgrp); 
	} 
1991/0705    
 
1991/0807    
	if(flag & Forkpg) { 
		p->pgrp = newpgrp(); 
		pgrpcpy(p->pgrp, u->p->pgrp); 
1992/0428    
	/* Process groups */ 
	if(flag & (FORKNSG|FORKCNSG)) {	 
		if((flag & (FORKNSG|FORKCNSG)) == (FORKNSG|FORKCNSG)) 
			error(Ebadarg); 
		if(flag & FORKNSG) { 
			p->pgrp = newpgrp(); 
			pgrpcpy(p->pgrp, u->p->pgrp); 
		} 
		else 
		if(flag & FORKCNSG) 
			p->pgrp = newpgrp(); 
1991/0807    
	} 
1991/0808    
	else { 
		p->pgrp = u->p->pgrp;			/* Process groups */ 
1992/0428    
		p->pgrp = u->p->pgrp; 
1991/0808    
		incref(p->pgrp); 
	} 
1991/0705    
 
1991/0807    
	if(flag & Forkeg) { 
		p->egrp = newegrp(); 
		envcpy(p->egrp, u->p->egrp); 
1992/0428    
	/* Environment group */ 
	if(flag & (FORKEVG|FORKCEVG)) { 
		if((flag & (FORKEVG|FORKCEVG)) == (FORKEVG|FORKCEVG)) 
			error(Ebadarg); 
		if(flag & FORKEVG) { 
			p->egrp = newegrp(); 
			envcpy(p->egrp, u->p->egrp); 
		} 
		else 
		if(flag & FORKCEVG) 
			p->egrp = newegrp(); 
1991/0807    
	} 
1991/0808    
	else { 
		p->egrp = u->p->egrp;			/* Environment group */ 
1992/0428    
		p->egrp = u->p->egrp; 
1991/0808    
		incref(p->egrp); 
	} 
1991/0807    
 
1992/0420/sys/src/9/port/sysproc.c:111,1161992/0428/sys/src/9/port/sysproc.c:181,188
1991/0705    
 
1990/0227    
	p->parent = u->p; 
	p->parentpid = u->p->pid; 
1992/0428    
	if((flag&FORKNTG) == 0) 
		p->noteid = u->p->noteid; 
1991/0705    
 
1991/0118    
	p->fpstate = u->p->fpstate; 
1991/0926    
	lock(&u->p->exl); 
1992/0420/sys/src/9/port/sysproc.c:513,5181992/0428/sys/src/9/port/sysproc.c:585,591
1991/0514    
		u->notified = 0; 
		memset(u->note, 0, sizeof(u->note)); 
	} 
1992/0428    
	u->p->noteid = incref(¬eidalloc); 
1991/0514    
 
1991/0614    
	poperror(); 
1990/0227    
	closepgrp(u->p->pgrp); 


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