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

2001/0527/port/devpipe.c (diff list | history)

2000/1201/sys/src/9/port/devpipe.c:33,422001/0527/sys/src/9/port/devpipe.c:33,43 (short | long | prev | next)
1990/0227    
 
1992/0621    
Dirtab pipedir[] = 
{ 
1993/0528    
	"data",		{Qdata0},	0,			0600, 
	"data1",	{Qdata1},	0,			0600, 
2001/0527    
	".",		{Qdir,0,QTDIR},	0,		DMDIR|0500, 
	"data",		{Qdata0},	0,		0600, 
	"data1",	{Qdata1},	0,		0600, 
1990/1009    
}; 
1994/0503    
#define NPIPEDIR 2 
2001/0527    
#define NPIPEDIR 3 
1990/1009    
 
1997/0327    
static void 
1990/0227    
pipeinit(void) 
2000/1201/sys/src/9/port/devpipe.c:80,1322001/0527/sys/src/9/port/devpipe.c:81,109
1992/0621    
	p->path = ++pipealloc.path; 
1990/1009    
	unlock(&pipealloc); 
 
1993/0528    
	c->qid = (Qid){CHDIR|NETQID(2*p->path, Qdir), 0}; 
2001/0527    
	mkqid(&c->qid, NETQID(2*p->path, Qdir), 0, QTDIR); 
1993/0528    
	c->aux = p; 
1991/1227    
	c->dev = 0; 
1990/0227    
	return c; 
} 
 
1997/0327    
static Chan* 
1990/0227    
pipeclone(Chan *c, Chan *nc) 
{ 
1990/1009    
	Pipe *p; 
                 
1993/0528    
	p = c->aux; 
1990/0227    
	nc = devclone(c, nc); 
1993/0528    
	qlock(p); 
	p->ref++; 
1993/1111    
	if(c->flag & COPEN){ 
		switch(NETTYPE(c->qid.path)){ 
		case Qdata0: 
			p->qref[0]++; 
			break; 
		case Qdata1: 
			p->qref[1]++; 
			break; 
		} 
	} 
1993/0528    
	qunlock(p); 
1990/1009    
	return nc; 
} 
1990/0227    
                 
1997/0327    
static int 
1990/1009    
pipegen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp) 
2001/0527    
pipegen(Chan *c, char*, Dirtab *tab, int ntab, int i, Dir *dp) 
1990/1009    
{ 
	int id; 
2000/0516    
	int len; 
	Pipe *p; 
2001/0527    
	Qid q; 
1990/0629    
 
1999/1230    
	if(i == DEVDOTDOT){ 
		devdir(c, c->qid, "#|", 0, eve, CHDIR|0555, dp); 
2001/0527    
		devdir(c, c->qid, "#|", 0, eve, DMDIR|0555, dp); 
1999/1230    
		return 1; 
	} 
                 
1993/0528    
	id = NETID(c->qid.path); 
1990/1009    
	if(tab==0 || i>=ntab) 
		return -1; 
2001/0527    
 
1990/1009    
	tab += i; 
2000/0516    
	p = c->aux; 
	switch(tab->qid.path){ 
2001/0527    
	switch((ulong)tab->qid.path){ 
2000/0516    
	case Qdata0: 
		len = qlen(p->q[0]); 
		break; 
2000/1201/sys/src/9/port/devpipe.c:137,1552001/0527/sys/src/9/port/devpipe.c:114,154
2000/0516    
		len = tab->length; 
		break; 
	} 
	devdir(c, (Qid){NETQID(id, tab->qid.path),0}, tab->name, len, eve, tab->perm, dp); 
2001/0527    
	mkqid(&q, NETQID(NETID(c->qid.path), tab->qid.path), 0, QTFILE); 
	devdir(c, q, tab->name, len, eve, tab->perm, dp); 
1990/1009    
	return 1; 
1990/0227    
} 
 
1990/1009    
 
1997/0327    
static int 
1990/0227    
pipewalk(Chan *c, char *name) 
2001/0527    
static Walkqid* 
pipewalk(Chan *c, Chan *nc, char **name, int nname) 
1990/0227    
{ 
1990/1009    
	return devwalk(c, name, pipedir, NPIPEDIR, pipegen); 
2001/0527    
	Walkqid *wq; 
	Pipe *p; 
 
	wq = devwalk(c, nc, name, nname, pipedir, NPIPEDIR, pipegen); 
	if(wq != nil && wq->clone != nil && wq->clone != c){ 
		p = c->aux; 
		qlock(p); 
		p->ref++; 
		if(c->flag & COPEN){ 
			print("channel open in pipewalk\n"); 
			switch(NETTYPE(c->qid.path)){ 
			case Qdata0: 
				p->qref[0]++; 
				break; 
			case Qdata1: 
				p->qref[1]++; 
				break; 
			} 
		} 
		qunlock(p); 
	} 
	return wq; 
1990/0227    
} 
 
1997/0327    
static void 
1990/0227    
pipestat(Chan *c, char *db) 
2001/0527    
static int 
pipestat(Chan *c, uchar *db, int n) 
1990/0227    
{ 
1993/0528    
	Pipe *p; 
	Dir dir; 
2000/1201/sys/src/9/port/devpipe.c:158,1642001/0527/sys/src/9/port/devpipe.c:157,163
1993/0528    
 
	switch(NETTYPE(c->qid.path)){ 
	case Qdir: 
		devdir(c, c->qid, ".", 2*DIRLEN, eve, CHDIR|0555, &dir); 
2001/0527    
		devdir(c, c->qid, ".", 0, eve, DMDIR|0555, &dir); 
1993/0528    
		break; 
	case Qdata0: 
1993/0530    
		devdir(c, c->qid, "data", qlen(p->q[0]), eve, 0660, &dir); 
2000/1201/sys/src/9/port/devpipe.c:169,1752001/0527/sys/src/9/port/devpipe.c:168,177
1993/0528    
	default: 
		panic("pipestat"); 
	} 
	convD2M(&dir, db); 
2001/0527    
	n = convD2M(&dir, db, n); 
	if(n < BIT16SZ) 
		error(Eshortstat); 
	return n; 
1990/0227    
} 
 
1990/1009    
/* 
2000/1201/sys/src/9/port/devpipe.c:180,1862001/0527/sys/src/9/port/devpipe.c:182,188
1990/0227    
{ 
1990/1009    
	Pipe *p; 
 
1990/11211    
	if(c->qid.path & CHDIR){ 
2001/0527    
	if(c->qid.type & QTDIR){ 
1990/1009    
		if(omode != OREAD) 
1990/11211    
			error(Ebadarg); 
1990/1009    
		c->mode = omode; 
2000/1201/sys/src/9/port/devpipe.c:372,3782001/0527/sys/src/9/port/devpipe.c:374,379
1997/0327    
	devreset, 
	pipeinit, 
	pipeattach, 
	pipeclone, 
	pipewalk, 
	pipestat, 
	pipeopen, 


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