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

1990/11211/port/devdk.c (diff list | history)

1990/11161/sys/src/9/port/devdk.c:232,2381990/11211/sys/src/9/port/devdk.c:232,238 (short | long | prev | next)
1990/0312    
	} 
1990/1101    
	if(freep == 0){ 
		unlock(&dklock); 
		error(0, Enoifc); 
1990/11211    
		error(Enoifc); 
1990/1101    
	} 
	dp = freep; 
	dp->opened = 0; 
1990/11161/sys/src/9/port/devdk.c:388,3941990/11211/sys/src/9/port/devdk.c:388,394
1990/1101    
	lock(dp); 
	if(dp->opened==0 || streamenter(dp->s)<0){ 
		unlock(dp); 
		error(0, Ehungup); 
1990/11211    
		error(Ehungup); 
1990/1101    
	} 
	unlock(dp); 
1990/1104    
	lp->rq = q; 
1990/11161/sys/src/9/port/devdk.c:499,5051990/11211/sys/src/9/port/devdk.c:499,505
1990/0312    
 
	if(bp->type != M_DATA){ 
		freeb(bp); 
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	} 
 
	lp = (Line *)q->ptr; 
1990/11161/sys/src/9/port/devdk.c:540,5461990/11211/sys/src/9/port/devdk.c:540,546
1990/0312    
 
1990/1101    
	if(WR(q)->ptr){ 
1990/0312    
		freeb(bp); 
1990/1101    
		error(0, Egreg); 
1990/11211    
		error(Egreg); 
1990/0312    
	} 
 
	/* 
1990/11161/sys/src/9/port/devdk.c:571,5811990/11211/sys/src/9/port/devdk.c:571,581
1990/0312    
		break; 
	default: 
		freeb(bp); 
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	} 
	freeb(bp); 
1990/1101    
	if(ncsc <= 0 || lines <= ncsc) 
1990/0312    
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
 
	/* 
1990/1101    
	 *  set up 
1990/11161/sys/src/9/port/devdk.c:584,5901990/11211/sys/src/9/port/devdk.c:584,590
1990/1101    
	lock(dp); 
	if(dp->opened){ 
		unlock(dp); 
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	} 
1990/1101    
	dp->ncsc = ncsc; 
	dp->lines = lines; 
1990/11161/sys/src/9/port/devdk.c:653,6631990/11211/sys/src/9/port/devdk.c:653,663
1990/0312    
 *  the per stream directory structure 
 */ 
Dirtab dksubdir[]={ 
	"addr",		Daddrqid,	0,	0600, 
	"listen",	Dlistenqid,	0,	0600, 
	"other",	Dotherqid,	0,	0600, 
	"raddr",	Draddrqid,	0, 	0600, 
	"ruser",	Duserqid,	0, 	0600, 
1990/11211    
	"addr",		{Daddrqid},	0,	0600, 
	"listen",	{Dlistenqid},	0,	0600, 
	"other",	{Dotherqid},	0,	0600, 
	"raddr",	{Draddrqid},	0, 	0600, 
	"ruser",	{Duserqid},	0, 	0600, 
1990/0312    
}; 
 
/* 
1990/11161/sys/src/9/port/devdk.c:687,6931990/11211/sys/src/9/port/devdk.c:687,694
1990/0312    
	 */ 
	for(i = 1; i < Nline; i++) { 
		sprint(dkdir[i].name, "%d", i); 
		dkdir[i].qid = CHDIR|STREAMQID(i, Dlineqid); 
1990/11211    
		dkdir[i].qid.path = CHDIR|STREAMQID(i, Dlineqid); 
		dkdir[i].qid.vers = 0; 
1990/0312    
		dkdir[i].length = 0; 
		dkdir[i].perm = 0600; 
	} 
1990/11161/sys/src/9/port/devdk.c:696,7021990/11211/sys/src/9/port/devdk.c:697,704
1990/0312    
	 *  the clone device 
	 */ 
	strcpy(dkdir[0].name, "clone"); 
	dkdir[0].qid = Dcloneqid; 
1990/11211    
	dkdir[0].qid.path = Dcloneqid; 
	dkdir[0].qid.vers = 0; 
1990/0312    
	dkdir[0].length = 0; 
	dkdir[0].perm = 0600; 
} 
1990/11161/sys/src/9/port/devdk.c:731,7371990/11211/sys/src/9/port/devdk.c:733,739
1990/0312    
int	  
dkwalk(Chan *c, char *name) 
{ 
	if(c->qid == CHDIR) 
1990/11211    
	if(c->qid.path == CHDIR) 
1990/0312    
		return devwalk(c, name, dkdir, dk[c->dev].lines, devgen); 
	else 
		return devwalk(c, name, dksubdir, Nsubdir, streamgen); 
1990/11161/sys/src/9/port/devdk.c:740,7461990/11211/sys/src/9/port/devdk.c:742,748
1990/0312    
void	  
dkstat(Chan *c, char *dp) 
{ 
	if(c->qid == CHDIR) 
1990/11211    
	if(c->qid.path == CHDIR) 
1990/0312    
		devstat(c, dp, dkdir, dk[c->dev].lines, devgen); 
	else 
		devstat(c, dp, dksubdir, Nsubdir, streamgen); 
1990/11161/sys/src/9/port/devdk.c:764,7761990/11211/sys/src/9/port/devdk.c:766,778
1990/0312    
	Dk *dp; 
	int line; 
 
1990/0319    
	if(c->qid & CHDIR){ 
1990/11211    
	if(c->qid.path & CHDIR){ 
1990/0312    
		/* 
1990/0319    
		 *  directories are read only 
		 */ 
		if(omode != OREAD) 
			error(0, Ebadarg); 
	} else switch(STREAMTYPE(c->qid)){ 
1990/11211    
			error(Ebadarg); 
	} else switch(STREAMTYPE(c->qid.path)){ 
1990/0319    
	case Dcloneqid: 
1990/1101    
		dp = &dk[c->dev]; 
1990/0319    
		/* 
1990/11161/sys/src/9/port/devdk.c:783,7941990/11211/sys/src/9/port/devdk.c:785,796
1990/0312    
					qunlock(lp); 
					continue; 
				} 
				c->qid = STREAMQID(lp-dp->line, Sctlqid); 
1990/11211    
				c->qid.path = STREAMQID(lp-dp->line, Sctlqid); 
1990/0312    
				break; 
			} 
		} 
		if(lp == end) 
			error(0, Enodev); 
1990/11211    
			error(Enodev); 
1990/1101    
		lp->state = Lopened; 
		qunlock(lp); 
1990/0312    
		streamopen(c, &dkinfo); 
1990/11161/sys/src/9/port/devdk.c:800,8061990/11211/sys/src/9/port/devdk.c:802,808
1990/0312    
		 *  channel on which the call arrived. 
		 */ 
		line = dklisten(c); 
		c->qid = STREAMQID(line, Sctlqid); 
1990/11211    
		c->qid.path = STREAMQID(line, Sctlqid); 
1990/0312    
		streamopen(c, &dkinfo); 
		pushq(c->stream, &urpinfo); 
		dkwindow(c); 
1990/11161/sys/src/9/port/devdk.c:813,8191990/11211/sys/src/9/port/devdk.c:815,821
1990/0319    
		 *  read only files 
		 */ 
		if(omode != OREAD) 
			error(0, Ebadarg); 
1990/11211    
			error(Ebadarg); 
1990/0319    
		break; 
	default: 
		/* 
1990/11161/sys/src/9/port/devdk.c:834,8401990/11211/sys/src/9/port/devdk.c:836,842
1990/0312    
void	  
dkcreate(Chan *c, char *name, int omode, ulong perm) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0312    
} 
 
void	  
1990/11161/sys/src/9/port/devdk.c:852,8661990/11211/sys/src/9/port/devdk.c:854,868
1990/0319    
	if(c->stream) 
1990/0312    
		return streamread(c, a, n); 
 
1990/0319    
	if(c->qid & CHDIR){ 
		if(c->qid == CHDIR) 
1990/11211    
	if(c->qid.path & CHDIR){ 
		if(c->qid.path == CHDIR) 
1990/0319    
			return devdirread(c, a, n, dkdir, dk[c->dev].lines, devgen); 
		else 
			return devdirread(c, a, n, dksubdir, Nsubdir, streamgen); 
	} 
 
1990/0312    
	lp = &dk[c->dev].line[STREAMID(c->qid)]; 
1990/0319    
	switch(STREAMTYPE(c->qid)){ 
1990/11211    
	lp = &dk[c->dev].line[STREAMID(c->qid.path)]; 
	switch(STREAMTYPE(c->qid.path)){ 
1990/0312    
	case Daddrqid: 
		return stringread(c, a, n, lp->addr); 
	case Draddrqid: 
1990/11161/sys/src/9/port/devdk.c:868,8741990/11211/sys/src/9/port/devdk.c:870,876
1990/0312    
	case Duserqid: 
		return stringread(c, a, n, lp->ruser); 
	} 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0312    
} 
 
long	  
1990/11161/sys/src/9/port/devdk.c:879,8851990/11211/sys/src/9/port/devdk.c:881,887
1990/0312    
	char *field[5]; 
	int m; 
 
	t = STREAMTYPE(c->qid); 
1990/11211    
	t = STREAMTYPE(c->qid.path); 
1990/0312    
 
	/* 
	 *  get data dispatched as quickly as possible 
1990/11161/sys/src/9/port/devdk.c:895,9171990/11211/sys/src/9/port/devdk.c:897,919
1990/0312    
		m = getfields(buf, field, 5, ' '); 
		if(strcmp(field[0], "connect")==0){ 
			if(m < 2) 
				error(0, Ebadarg); 
1990/11211    
				error(Ebadarg); 
1990/0312    
			dkcall(Dial, c, field[1], 0, 0); 
		} else if(strcmp(field[0], "announce")==0){ 
			if(m < 2) 
				error(0, Ebadarg); 
1990/11211    
				error(Ebadarg); 
1990/0312    
			dkcall(Announce, c, field[1], 0, 0); 
		} else if(strcmp(field[0], "redial")==0){ 
			if(m < 4) 
				error(0, Ebadarg); 
1990/11211    
				error(Ebadarg); 
1990/0312    
			dkcall(Redial, c, field[1], field[2], field[3]); 
		} else if(strcmp(field[0], "accept")==0){ 
			if(m < 2) 
				error(0, Ebadarg); 
1990/11211    
				error(Ebadarg); 
1990/0312    
			dkanswer(c, strtoul(field[1], 0, 0), 0); 
		} else if(strcmp(field[0], "reject")==0){ 
			if(m < 3) 
				error(0, Ebadarg); 
1990/11211    
				error(Ebadarg); 
1990/0312    
			dkanswer(c, strtoul(field[1], 0, 0), strtoul(field[2], 0, 0)); 
		} else 
			return streamwrite(c, a, n, 0); 
1990/11161/sys/src/9/port/devdk.c:918,9521990/11211/sys/src/9/port/devdk.c:920,940
1990/0312    
		return n; 
	} 
 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0312    
} 
 
void	  
dkremove(Chan *c) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0312    
} 
 
void	  
dkwstat(Chan *c, char *dp) 
{ 
	error(0, Eperm); 
1990/11211    
	error(Eperm); 
1990/0312    
} 
 
void	  
dkerrstr(Error *e, char *buf) 
{ 
	rooterrstr(e, buf); 
} 
                 
void	  
dkuserstr(Error *e, char *buf) 
{ 
	extern consuserstr(Error *, char *); 
                 
	consuserstr(e, buf); 
} 
                 
/* 
1990/1101    
 *  open the common signalling channel 
 */ 
1990/11161/sys/src/9/port/devdk.c:962,9681990/11211/sys/src/9/port/devdk.c:950,956
1990/1101    
		nexterror(); 
	} 
	c = dkattach(dp->name); 
	c->qid = STREAMQID(line, Sdataqid); 
1990/11211    
	c->qid.path = STREAMQID(line, Sdataqid); 
1990/1101    
	dkopen(c, ORDWR); 
	poperror(); 
 
1990/11161/sys/src/9/port/devdk.c:1022,10281990/11211/sys/src/9/port/devdk.c:1010,1016
1990/1101    
	Chan *csc; 
1990/0707    
	char *bang, *dot; 
1990/1101    
	 
1990/0312    
	line = STREAMID(c->qid); 
1990/11211    
	line = STREAMID(c->qid.path); 
1990/0312    
	dp = &dk[c->dev]; 
	lp = &dp->line[line]; 
 
1990/11161/sys/src/9/port/devdk.c:1030,10361990/11211/sys/src/9/port/devdk.c:1018,1024
1990/0312    
	 *  only dial on virgin lines 
	 */ 
1990/0511    
	if(lp->state != Lopened) 
1990/0312    
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
 
	DPRINT("dkcall(line=%d, type=%d, dest=%s)\n", line, type, addr); 
 
1990/11161/sys/src/9/port/devdk.c:1040,10481990/11211/sys/src/9/port/devdk.c:1028,1036
1990/0707    
	 *	- change ! into . to delimit service 
1990/0312    
	 */ 
	if(strchr(addr, '\n')) 
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	if(strlen(addr)+strlen(u->p->pgrp->user)+2 >= sizeof(dialstr)) 
		error(0, Ebadarg); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	strcpy(dialstr, addr); 
1990/0707    
	bang = strchr(dialstr, '!'); 
	if(bang){ 
1990/11161/sys/src/9/port/devdk.c:1109,11151990/11211/sys/src/9/port/devdk.c:1097,1103
1990/0312    
	if(type==Redial){ 
		if(streamread(dc, &dialtone, 1L) != 1L){ 
			lp->state = Lconnected; 
			error(0, Ebadarg); 
1990/11211    
			error(Ebadarg); 
1990/0312    
		} 
	} 
 
1990/11161/sys/src/9/port/devdk.c:1142,11501990/11211/sys/src/9/port/devdk.c:1130,1138
1990/0312    
	DPRINT("got reply %d\n", lp->state); 
	if(lp->state != Lconnected) { 
		if(lp->err >= DKERRS) 
			error(0, dkerr[0]); 
1990/11211    
			error(dkerr[0]); 
1990/0312    
		else 
			error(0, dkerr[lp->err]); 
1990/11211    
			error(dkerr[lp->err]); 
1990/0312    
	} 
 
	/* 
1990/11161/sys/src/9/port/devdk.c:1202,12081990/11211/sys/src/9/port/devdk.c:1190,1196
1990/0312    
	/* 
	 *  open the data file 
	 */ 
1990/1101    
	dc = dkopenline(dp, STREAMID(c->qid)); 
1990/11211    
	dc = dkopenline(dp, STREAMID(c->qid.path)); 
1990/0312    
	if(waserror()){ 
		close(dc); 
		nexterror(); 
1990/11161/sys/src/9/port/devdk.c:1218,12241990/11211/sys/src/9/port/devdk.c:1206,1212
1990/0312    
		n = streamread(dc, dialstr, sizeof(dialstr)-1); 
		DPRINT("returns %d\n", n); 
		if(n <= 0) 
			error(0, Eio); 
1990/11211    
			error(Eio); 
1990/0312    
		dialstr[n] = 0; 
		DPRINT("dialstr = %s\n", dialstr); 
 
1990/11161/sys/src/9/port/devdk.c:1228,12341990/11211/sys/src/9/port/devdk.c:1216,1222
1990/0312    
		n = getfields(dialstr, line, 12, '\n'); 
		if (n < 2) { 
			DPRINT("bad dialstr from dk (1 line)\n"); 
			error(0, Eio); 
1990/11211    
			error(Eio); 
1990/0312    
		} 
 
		/* 
1990/11161/sys/src/9/port/devdk.c:1332,13381990/11211/sys/src/9/port/devdk.c:1320,1326
1990/0312    
		default: 
			print("bad message from dk(>4 line)\n"); 
			qunlock(lp); 
			error(0, Ebadarg); 
1990/11211    
			error(Ebadarg); 
1990/0312    
		} 
 
		sprint(lp->other, "w(%d)", W_TRAF(lp->window)); 
1990/11161/sys/src/9/port/devdk.c:1372,13781990/11211/sys/src/9/port/devdk.c:1360,1366
1990/0312    
		close(dc); 
		nexterror(); 
	} 
	dc->qid = STREAMQID(STREAMID(c->qid), Sdataqid); 
1990/11211    
	dc->qid.path = STREAMQID(STREAMID(c->qid.path), Sdataqid); 
1990/0312    
	dkopen(dc, ORDWR); 
 
	/* 
1990/11161/sys/src/9/port/devdk.c:1395,14011990/11211/sys/src/9/port/devdk.c:1383,1389
1990/0312    
	long wins; 
	Line *lp; 
 
	lp = &dk[c->dev].line[STREAMID(c->qid)]; 
1990/11211    
	lp = &dk[c->dev].line[STREAMID(c->qid.path)]; 
1990/0312    
	if(lp->window == 0) 
		lp->window = 64; 
	sprint(buf, "init %d %d", lp->window, Streamhi); 
1990/11161/sys/src/9/port/devdk.c:1444,14501990/11211/sys/src/9/port/devdk.c:1432,1438
1990/0312    
		n = streamread(dp->csc, (char *)&d, (long)sizeof(d)); 
		if(n != sizeof(d)){ 
1990/1101    
			if(n == 0) 
				error(0, Ehungup); 
1990/11211    
				error(Ehungup); 
1990/0312    
			print("strange csc message %d\n", n); 
			continue; 
		} 
1990/11161/sys/src/9/port/devdk.c:1663,16691990/11211/sys/src/9/port/devdk.c:1651,1657
1990/1101    
 
1990/0312    
	for(;;){ 
1990/1101    
		if(dp->opened==0) 
			error(0, Ehungup); 
1990/11211    
			error(Ehungup); 
1990/1101    
 
1990/0312    
		/* 
1990/1101    
		 * send keep alive 


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