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

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

2001/0515/sys/src/9/port/devssl.c:66,722001/0527/sys/src/9/port/devssl.c:66,72 (short | long | prev | next)
1995/1213    
	OneWay	out; 
1996/1029    
 
	/* protections */ 
	char	user[NAMELEN]; 
2001/0527    
	char	*user; 
1996/1029    
	int	perm; 
1995/1213    
}; 
 
2001/0515/sys/src/9/port/devssl.c:73,792001/0527/sys/src/9/port/devssl.c:73,80
1996/1029    
Lock	dslock; 
int	dshiwat; 
2000/0913    
int	maxdstate = 128; 
1996/1029    
Dstate** dstate; 
2001/0527    
char	**dsname; 
Dstate	**dstate; 
1998/0417    
char	*encalgs; 
char	*hashalgs; 
1996/1029    
 
2001/0515/sys/src/9/port/devssl.c:123,1642001/0527/sys/src/9/port/devssl.c:124,177
2000/0325    
}; 
 
1997/0327    
static int 
1996/1029    
sslgen(Chan *c, Dirtab *d, int nd, int s, Dir *dp) 
2001/0527    
sslgen(Chan *c, char*, Dirtab *d, int nd, int s, Dir *dp) 
1996/1029    
{ 
	Qid q; 
	Dstate *ds; 
	char name[16], *p, *nm; 
2001/0527    
	int ft; 
1996/1029    
 
	USED(nd); 
	USED(d); 
2001/0527    
 
	q.type = QTFILE; 
1996/1029    
	q.vers = 0; 
	switch(TYPE(c->qid)) { 
2001/0527    
 
	ft = TYPE(c->qid); 
	switch(ft) { 
1996/1029    
	case Qtopdir: 
1999/1230    
		if(s == DEVDOTDOT){ 
			q.path = QID(0, Qtopdir)|CHDIR; 
2000/0325    
			devdir(c, q, "#D", 0, eve, CHDIR|0555, dp); 
2001/0527    
			q.path = QID(0, Qtopdir); 
			q.type = QTDIR; 
			devdir(c, q, "#D", 0, eve, 0555, dp); 
1999/1230    
			return 1; 
		} 
1998/0417    
		if(s > 0) 
			return -1; 
		q.path = QID(0, Qprotodir)|CHDIR; 
2000/0325    
		devdir(c, q, "ssl", 0, eve, CHDIR|0555, dp); 
2001/0527    
		q.path = QID(0, Qprotodir); 
		q.type = QTDIR; 
		devdir(c, q, "ssl", 0, eve, 0555, dp); 
1998/0417    
		return 1; 
	case Qprotodir: 
1999/1230    
		if(s == DEVDOTDOT){ 
			q.path = QID(0, Qtopdir)|CHDIR; 
2000/0325    
			devdir(c, q, ".", 0, eve, CHDIR|0555, dp); 
2001/0527    
			q.path = QID(0, Qtopdir); 
			q.type = QTDIR; 
			devdir(c, q, ".", 0, eve, 0555, dp); 
1999/1230    
			return 1; 
		} 
1996/1029    
		if(s < dshiwat) { 
			sprint(name, "%d", s); 
			q.path = QID(s, Qconvdir)|CHDIR; 
2001/0527    
			q.path = QID(s, Qconvdir); 
			q.type = QTDIR; 
1996/1029    
			ds = dstate[s]; 
			if(ds != 0) 
				nm = ds->user; 
			else 
				nm = eve; 
2000/0325    
			devdir(c, q, name, 0, nm, CHDIR|0555, dp); 
2001/0527    
			if(dsname[s] == nil){ 
				sprint(name, "%d", s); 
				kstrdup(&dsname[s], name); 
			} 
			devdir(c, q, dsname[s], 0, nm, 0555, dp); 
1996/1029    
			return 1; 
		} 
		if(s > dshiwat) 
2001/0515/sys/src/9/port/devssl.c:168,1752001/0527/sys/src/9/port/devssl.c:181,189
1996/1029    
		return 1; 
	case Qconvdir: 
1999/1230    
		if(s == DEVDOTDOT){ 
			q.path = QID(0, Qprotodir)|CHDIR; 
2000/0325    
			devdir(c, q, "ssl", 0, eve, CHDIR|0555, dp); 
2001/0527    
			q.path = QID(0, Qprotodir); 
			q.type = QTDIR; 
			devdir(c, q, "ssl", 0, eve, 0555, dp); 
1999/1230    
			return 1; 
		} 
1996/1029    
		ds = dstate[CONV(c->qid)]; 
2001/0515/sys/src/9/port/devssl.c:212,2222001/0527/sys/src/9/port/devssl.c:226,232
2000/0325    
		return 1; 
	default: 
		ds = dstate[CONV(c->qid)]; 
2001/0515    
		if(ds != nil) 
			nm = ds->user; 
		else 
			nm = eve; 
		devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, nm, 0660, dp); 
2001/0527    
		devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, ds->user, 0660, dp); 
1996/1029    
		return 1; 
	} 
	return -1; 
2001/0515/sys/src/9/port/devssl.c:228,2482001/0527/sys/src/9/port/devssl.c:238,259
1996/1029    
	Chan *c; 
 
	c = devattach('D', spec); 
	c->qid.path = QID(0, Qtopdir)|CHDIR; 
2001/0527    
	c->qid.path = QID(0, Qtopdir); 
1996/1029    
	c->qid.vers = 0; 
2001/0527    
	c->qid.type = QTDIR; 
1996/1029    
	return c; 
1995/1213    
} 
 
1997/0327    
static int 
1995/1213    
sslwalk(Chan *c, char *name) 
2001/0527    
static Walkqid* 
sslwalk(Chan *c, Chan *nc, char **name, int nname) 
1995/1213    
{ 
1996/1029    
	return devwalk(c, name, 0, 0, sslgen); 
2001/0527    
	return devwalk(c, nc, name, nname, nil, 0, sslgen); 
1995/1213    
} 
 
1997/0327    
static void 
1995/1213    
sslstat(Chan *c, char *db) 
2001/0527    
static int 
sslstat(Chan *c, uchar *db, int n) 
1995/1213    
{ 
1996/1029    
	devstat(c, db, 0, 0, sslgen); 
2001/0527    
	return devstat(c, db, n, nil, 0, sslgen); 
1995/1213    
} 
 
1997/0327    
static Chan* 
2001/0515/sys/src/9/port/devssl.c:250,2552001/0527/sys/src/9/port/devssl.c:261,267
1995/1213    
{ 
1996/1029    
	Dstate *s, **pp; 
	int perm; 
2001/0527    
	int ft; 
1995/1213    
 
1996/1029    
	perm = 0; 
	omode &= 3; 
2001/0515/sys/src/9/port/devssl.c:265,2712001/0527/sys/src/9/port/devssl.c:277,284
1996/1029    
		break; 
1995/1213    
	} 
1996/1029    
 
	switch(TYPE(c->qid)) { 
2001/0527    
	ft = TYPE(c->qid); 
	switch(ft) { 
1996/1029    
	default: 
		panic("sslopen"); 
	case Qtopdir: 
2001/0515/sys/src/9/port/devssl.c:315,3282001/0527/sys/src/9/port/devssl.c:328,340
1996/1029    
	return c; 
1995/1213    
} 
 
1997/0327    
static void 
1995/1213    
sslwstat(Chan *c, char *dp) 
2001/0527    
static int 
sslwstat(Chan *c, uchar *db, int n) 
1995/1213    
{ 
1996/1029    
	Dir d; 
2001/0527    
	Dir *dir; 
1996/1029    
	Dstate *s; 
2001/0527    
	int m; 
1996/1029    
 
	convM2D(dp, &d); 
                 
	s = dstate[CONV(c->qid)]; 
	if(s == 0) 
		error(Ebadusefd); 
2001/0515/sys/src/9/port/devssl.c:329,3362001/0527/sys/src/9/port/devssl.c:341,354
1996/1029    
	if(strcmp(s->user, up->user) != 0) 
		error(Eperm); 
 
	memmove(s->user, d.uid, NAMELEN); 
	s->perm = d.mode; 
2001/0527    
	dir = smalloc(sizeof(Dir)+n); 
	m = convM2D(db, n, &dir[0], (char*)&dir[1]); 
	if(m > 0){ 
		kstrdup(&s->user, dir->uid); 
		s->perm = dir->mode; 
	} 
	free(dir); 
	return m; 
1995/1213    
} 
 
1997/0327    
static void 
2001/0515/sys/src/9/port/devssl.c:337,3442001/0527/sys/src/9/port/devssl.c:355,364
1995/1213    
sslclose(Chan *c) 
{ 
	Dstate *s; 
2001/0527    
	int ft; 
1995/1213    
 
1996/1029    
	switch(TYPE(c->qid)) { 
2001/0527    
	ft = TYPE(c->qid); 
	switch(ft) { 
1996/1029    
	case Qctl: 
	case Qdata: 
	case Qsecretin: 
2001/0515/sys/src/9/port/devssl.c:358,3632001/0527/sys/src/9/port/devssl.c:378,385
1996/1029    
		dstate[CONV(c->qid)] = 0; 
		unlock(&dslock); 
 
2001/0527    
		if(s->user != nil) 
			free(s->user); 
1996/1029    
		sslhangup(s); 
1995/1213    
		if(s->c) 
1997/0327    
			cclose(s->c); 
2001/0515/sys/src/9/port/devssl.c:506,5162001/0527/sys/src/9/port/devssl.c:528,538
1996/1029    
} 
 
2000/0913    
/* 
2001/0504    
 *  We can't let Eintrs lose data, since doing so will get 
 *  us out of sync with the sender and break the reliablity 
 *  of the channel.  Eintr only happens during the reads in 
 *  consume.  Therefore we put back any bytes consumed before 
 *  the last call to ensure. 
2001/0527    
 *  We can't let Eintr's lose data since the program 
 *  doing the read may be able to handle it.  The only 
 *  places Eintr is possible is during the read's in consume. 
 *  Therefore, we make sure we can always put back the bytes 
 *  consumed before the last ensure. 
2000/0913    
 */ 
1997/0327    
static Block* 
1998/0327    
sslbread(Chan *c, long n, ulong) 
2001/0515/sys/src/9/port/devssl.c:529,5382001/0527/sys/src/9/port/devssl.c:551,558
1995/1217    
 
2000/0913    
	nconsumed = 0; 
1995/1217    
	if(waserror()){ 
2001/0504    
		if(strcmp(up->error, Eintr) == 0 && !waserror()){ 
2001/0527    
		if(strcmp(up->error, Eintr) != 0) 
2000/0913    
			regurgitate(s.s, consumed, nconsumed); 
2001/0504    
			poperror(); 
		} 
1996/0531    
		qunlock(&s.s->in.q); 
1995/1217    
		nexterror(); 
1995/1213    
	} 
2001/0515/sys/src/9/port/devssl.c:627,6412001/0527/sys/src/9/port/devssl.c:647,664
1996/1029    
	int i; 
	char buf[128]; 
1998/0319    
	ulong offset = off; 
2001/0527    
	int ft; 
1995/1213    
 
1996/1029    
	if(c->qid.path & CHDIR) 
2001/0527    
	if(c->qid.type & QTDIR) 
1996/1029    
		return devdirread(c, a, n, 0, 0, sslgen); 
 
	switch(TYPE(c->qid)) { 
2001/0527    
	ft = TYPE(c->qid); 
	switch(ft) { 
1996/1029    
	default: 
		error(Ebadusefd); 
	case Qctl: 
1998/0825    
		sprint(buf, "%lud", CONV(c->qid)); 
2001/0527    
		ft = CONV(c->qid); 
		sprint(buf, "%d", ft); 
1996/1029    
		return readstr(offset, a, n, buf); 
	case Qdata: 
		b.b = sslbread(c, n, offset); 
2001/0515/sys/src/9/port/devssl.c:642,6492001/0527/sys/src/9/port/devssl.c:665,674
1996/1029    
		break; 
1998/0417    
	case Qencalgs: 
		return readstr(offset, a, n, encalgs); 
2001/0527    
		break; 
1998/0417    
	case Qhashalgs: 
		return readstr(offset, a, n, hashalgs); 
2001/0527    
		break; 
1995/1213    
	} 
 
1996/0223    
	if(waserror()){ 
2001/0515/sys/src/9/port/devssl.c:777,7832001/0527/sys/src/9/port/devssl.c:802,810
1995/1213    
 
1997/0618    
		s.s->out.mid++; 
 
2001/0527    
		m = BLEN(nb); 
1997/0327    
		devtab[s.s->c->type]->bwrite(s.s->c, nb, s.s->c->offset); 
2001/0527    
		s.s->c->offset += m; 
1995/1215    
	} 
1996/0531    
	qunlock(&s.s->out.q); 
1995/1215    
	poperror(); 
2001/0515/sys/src/9/port/devssl.c:1149,11542001/0527/sys/src/9/port/devssl.c:1176,1184
1998/0417    
	if((dstate = smalloc(sizeof(Dstate*) * maxdstate)) == 0) 
		panic("sslinit"); 
 
2001/0527    
	if((dsname = smalloc(sizeof(char*) * maxdstate)) == 0) 
		panic("sslinit"); 
 
1998/0417    
	n = 1; 
	for(e = encrypttab; e->name != nil; e++) 
		n += strlen(e->name) + 1; 
2001/0515/sys/src/9/port/devssl.c:1185,11912001/0527/sys/src/9/port/devssl.c:1215,1220
1997/0327    
	devreset, 
	sslinit, 
	sslattach, 
	devclone, 
	sslwalk, 
	sslstat, 
	sslopen, 
2001/0515/sys/src/9/port/devssl.c:1394,13992001/0527/sys/src/9/port/devssl.c:1423,1429
1996/1029    
dsclone(Chan *ch) 
{ 
	Dstate **pp, **ep, **np; 
2001/0527    
	char **names; 
1996/1029    
	int newmax; 
 
	if(waserror()) { 
2001/0515/sys/src/9/port/devssl.c:1417,14222001/0527/sys/src/9/port/devssl.c:1447,1453
1996/1029    
		newmax = 2 * maxdstate; 
		if(newmax > Maxdstate) 
			newmax = Maxdstate; 
2001/0527    
 
1996/1029    
		np = smalloc(sizeof(Dstate*) * newmax); 
		if(np == 0) 
			error(Enomem); 
2001/0515/sys/src/9/port/devssl.c:1423,14292001/0527/sys/src/9/port/devssl.c:1454,1466
1996/1029    
		memmove(np, dstate, sizeof(Dstate*) * maxdstate); 
		dstate = np; 
		pp = &dstate[maxdstate]; 
		memset(pp, 0, sizeof(Dstate*)*(newmax - maxdstate)); 
2001/0527    
 
		names = smalloc(sizeof(char*) * newmax); 
		if(names == 0) 
			error(Enomem); 
		memmove(names, dsname, sizeof(char*) * maxdstate); 
		dsname = names; 
 
1996/1029    
		maxdstate = newmax; 
		dsnew(ch, pp); 
	} 
2001/0515/sys/src/9/port/devssl.c:1446,14522001/0527/sys/src/9/port/devssl.c:1483,1489
1996/1029    
	memset(s, 0, sizeof(*s)); 
	s->state = Sincomplete; 
	s->ref = 1; 
	strncpy(s->user, up->user, sizeof(s->user)); 
2001/0527    
	kstrdup(&s->user, up->user); 
1996/1029    
	s->perm = 0660; 
	t = TYPE(ch->qid); 
	if(t == Qclonus) 


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