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

1991/0705/port/devenv.c (diff list | history)

1991/0427/sys/src/9/port/devenv.c:211,2251991/0705/sys/src/9/port/devenv.c:211,225 (short | long | prev | next)
1990/0227    
envgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) 
{ 
	Env *e; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
	int ans; 
 
	pg = u->p->pgrp; 
	lock(pg); 
	if(s >= pg->nenv) 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
	if(s >= eg->nenv) 
1990/0227    
		ans = -1; 
	else{ 
		e = pg->etab[s].env; 
1991/0705    
		e = eg->etab[s].env; 
1990/0227    
		if(e == 0) 
			ans = 0; 
		else{ 
1991/0427/sys/src/9/port/devenv.c:229,2351991/0705/sys/src/9/port/devenv.c:229,235
1990/0227    
			ans = 1; 
		} 
	} 
	unlock(pg); 
1991/0705    
	unlock(eg); 
1990/0227    
	return ans; 
} 
 
1991/0427/sys/src/9/port/devenv.c:242,2541991/0705/sys/src/9/port/devenv.c:242,254
1990/0227    
Chan* 
envclone(Chan *c, Chan *nc) 
{ 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
 
1990/11211    
	if(!(c->qid.path&CHDIR)){ 
1990/0227    
		pg = u->p->pgrp; 
		lock(pg); 
1990/11211    
		pg->etab[c->qid.path-1].chref++; 
1990/0227    
		unlock(pg); 
1991/0705    
		eg = u->p->egrp; 
		lock(eg); 
		eg->etab[c->qid.path-1].chref++; 
		unlock(eg); 
1990/0227    
	} 
	return devclone(c, nc); 
} 
1991/0427/sys/src/9/port/devenv.c:256,2691991/0705/sys/src/9/port/devenv.c:256,269
1990/0227    
int 
envwalk(Chan *c, char *name) 
{ 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
 
	if(devwalk(c, name, 0, 0, envgen)){ 
1990/11211    
		if(!(c->qid.path&CHDIR)){ 
1990/0227    
			pg = u->p->pgrp; 
			lock(pg); 
1990/11211    
			pg->etab[c->qid.path-1].chref++; 
1990/0227    
			unlock(pg); 
1991/0705    
			eg = u->p->egrp; 
			lock(eg); 
			eg->etab[c->qid.path-1].chref++; 
			unlock(eg); 
1990/0227    
			return 1; 
		} 
	} 
1991/0427/sys/src/9/port/devenv.c:281,2971991/0705/sys/src/9/port/devenv.c:281,297
1990/0227    
{ 
	Env *e, *ne; 
	Envp *ep; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
 
	if(omode & (OWRITE|OTRUNC)){ 
1990/11211    
		if(c->qid.path & CHDIR) 
			error(Eperm); 
1990/0227    
		pg = u->p->pgrp; 
		lock(pg); 
1990/11211    
		ep = &pg->etab[c->qid.path-1]; 
1991/0705    
		eg = u->p->egrp; 
		lock(eg); 
		ep = &eg->etab[c->qid.path-1]; 
1990/0227    
		e = ep->env; 
		if(!e){ 
			unlock(pg); 
1991/0705    
			unlock(eg); 
1990/11211    
			error(Egreg); 
1990/0227    
		} 
		lock(&envalloc); 
1991/0427/sys/src/9/port/devenv.c:299,3051991/0705/sys/src/9/port/devenv.c:299,305
1990/0227    
		if(waserror()){ 
			unlock(e); 
			unlock(&envalloc); 
1990/03042    
			unlock(pg); 
1991/0705    
			unlock(eg); 
1990/0227    
			nexterror(); 
		} 
		if(e->pgref == 0) 
1991/0427/sys/src/9/port/devenv.c:318,3241991/0705/sys/src/9/port/devenv.c:318,324
1990/0227    
		poperror(); 
		unlock(e); 
		unlock(&envalloc); 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/0227    
	} 
	c->mode = openmode(omode); 
	c->flag |= COPEN; 
1991/0427/sys/src/9/port/devenv.c:330,3461991/0705/sys/src/9/port/devenv.c:330,346
1990/0227    
envcreate(Chan *c, char *name, int omode, ulong perm) 
{ 
	Env *e; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
	int i; 
 
1990/11211    
	if(c->qid.path != CHDIR) 
		error(Eperm); 
1990/0227    
	pg = u->p->pgrp; 
	lock(pg); 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
1990/0227    
	lock(&envalloc); 
	if(waserror()){ 
		unlock(&envalloc); 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/0227    
		nexterror(); 
	} 
	e = envalloc.efree; 
1991/0427/sys/src/9/port/devenv.c:352,3721991/0705/sys/src/9/port/devenv.c:352,372
1990/0227    
	e->next = 0; 
	e->pgref = 1; 
	strncpy(e->name, name, NAMELEN); 
	if(pg->nenv == conf.npgenv){ 
		for(i = 0; i<pg->nenv; i++) 
			if(pg->etab[i].chref == 0) 
1991/0705    
	if(eg->nenv == conf.npgenv){ 
		for(i = 0; i<eg->nenv; i++) 
			if(eg->etab[i].chref == 0) 
1990/0227    
				break; 
		if(i == pg->nenv){ 
			print("out of pgroup envs\n"); 
1991/0705    
		if(i == eg->nenv){ 
			print("out of egroup envs\n"); 
1990/11211    
			error(Enoenv); 
1990/0227    
		} 
	}else 
		i = pg->nenv++; 
1991/0705    
		i = eg->nenv++; 
1990/11211    
	c->qid.path = i+1; 
1990/0227    
	pg->etab[i].env = e; 
	pg->etab[i].chref = 1; 
1991/0705    
	eg->etab[i].env = e; 
	eg->etab[i].chref = 1; 
1990/0227    
	unlock(&envalloc); 
	unlock(pg); 
1991/0705    
	unlock(eg); 
1990/0227    
	c->offset = 0; 
	c->mode = openmode(omode); 
	poperror(); 
1991/0427/sys/src/9/port/devenv.c:378,3991991/0705/sys/src/9/port/devenv.c:378,399
1990/0227    
{ 
	Env *e; 
	Envp *ep; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
 
1990/11211    
	if(c->qid.path & CHDIR) 
		error(Eperm); 
1990/0227    
	pg = u->p->pgrp; 
	lock(pg); 
1990/11211    
	ep = &pg->etab[c->qid.path-1]; 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
	ep = &eg->etab[c->qid.path-1]; 
1990/0227    
	e = ep->env; 
	if(!e){ 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/11211    
		error(Enonexist); 
1990/0227    
	} 
	ep->env = 0; 
	ep->chref--; 
	envpgclose(e); 
	unlock(pg); 
1991/0705    
	unlock(eg); 
1990/0227    
} 
 
void 
1991/0427/sys/src/9/port/devenv.c:407,4201991/0705/sys/src/9/port/devenv.c:407,420
1990/0227    
void 
envclose(Chan * c) 
{ 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
 
1990/11211    
	if(c->qid.path & CHDIR) 
1990/0227    
		return; 
	pg = u->p->pgrp; 
	lock(pg); 
1990/11211    
	pg->etab[c->qid.path-1].chref--; 
1990/0227    
	unlock(pg); 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
	eg->etab[c->qid.path-1].chref--; 
	unlock(eg); 
1990/0227    
} 
 
void 
1991/0427/sys/src/9/port/devenv.c:441,4561991/0705/sys/src/9/port/devenv.c:441,456
1990/0227    
	Envval *ev; 
	char *p; 
	long vn; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
	char *a = va; 
 
1990/11211    
	if(c->qid.path & CHDIR) 
1990/0227    
		return devdirread(c, a, n, 0, 0, envgen); 
	pg = u->p->pgrp; 
	lock(pg); 
1990/11211    
	e = pg->etab[c->qid.path-1].env; 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
	e = eg->etab[c->qid.path-1].env; 
1990/0227    
	if(!e){ 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/11211    
		error(Eio); 
1990/0227    
	} 
	lock(e); 
1991/0427/sys/src/9/port/devenv.c:463,4691991/0705/sys/src/9/port/devenv.c:463,469
1990/0227    
	else 
1991/0411    
		memmove(a, ev->dat+offset, n); 
1990/0227    
	unlock(e); 
	unlock(pg); 
1991/0705    
	unlock(eg); 
1990/0227    
	return n; 
} 
 
1991/0427/sys/src/9/port/devenv.c:474,4891991/0705/sys/src/9/port/devenv.c:474,489
1990/0227    
	char *p; 
	Envval *ev; 
	long vn; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
	char *a = va; 
 
	if(n <= 0) 
		return 0; 
	pg = u->p->pgrp; 
	lock(pg); 
1990/11211    
	e = pg->etab[c->qid.path-1].env; /* caller checks for CHDIR */ 
1991/0705    
	eg = u->p->egrp; 
	lock(eg); 
	e = eg->etab[c->qid.path-1].env; /* caller checks for CHDIR */ 
1990/0227    
	if(!e){ 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/11211    
		error(Eio); 
1990/0227    
	} 
	lock(&envalloc); 
1991/0427/sys/src/9/port/devenv.c:491,4971991/0705/sys/src/9/port/devenv.c:491,497
1990/0227    
	if(waserror()){ 
		unlock(e); 
		unlock(&envalloc); 
		unlock(pg); 
1991/0705    
		unlock(eg); 
1990/0227    
		nexterror(); 
	} 
	if(e->pgref>1) 
1991/0427/sys/src/9/port/devenv.c:506,5121991/0705/sys/src/9/port/devenv.c:506,512
1990/0227    
	poperror(); 
	unlock(e); 
	unlock(&envalloc); 
	unlock(pg); 
1991/0705    
	unlock(eg); 
1990/0227    
	return n; 
} 
 
1991/0427/sys/src/9/port/devenv.c:516,5271991/0705/sys/src/9/port/devenv.c:516,527
1990/0227    
	Env *e; 
	Envp *ep; 
	Envval *ev; 
	Pgrp *pg; 
1991/0705    
	Egrp *eg; 
1990/0227    
	int i; 
	char hold; 
 
	pg = u->p->pgrp; 
	for(ep=pg->etab, i=0; i<pg->nenv; i++, ep++) 
1991/0705    
	eg = u->p->egrp; 
	for(ep=eg->etab, i=0; i<eg->nenv; i++, ep++) 
1990/0227    
		print("P%d(%lux %d)",i, ep->env, ep->chref); 
	for(e=envalloc.earena; e<&envalloc.earena[conf.nenv]; e++) 
		if(e->pgref){ 


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