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

1991/1024/port/devip.c (diff list | history)

1991/1023/sys/src/9/port/devip.c:181,1871991/1024/sys/src/9/port/devip.c:181,187 (short | long | prev | next)
1991/0424    
			error(Eprotonosup); 
 
		if(cp->backlog == 0) 
			cp->backlog = 1; 
1991/1024    
			cp->backlog = 3; 
1991/0424    
 
		streamopen(c, &ipinfo); 
		if(c->stream->devq->next->info != cp->stproto) 
1991/1023/sys/src/9/port/devip.c:226,2321991/1024/sys/src/9/port/devip.c:226,232
1991/0424    
	base = ipconv[c->dev]; 
	etab = &base[conf.ip]; 
	for(new = base; new < etab; new++) { 
1991/1023    
		new = ipincoming(c->dev); 
1991/1024    
		new = ipincoming(base); 
1991/1023    
		if(new == 0) 
			error(Enodev); 
 
1991/1023/sys/src/9/port/devip.c:243,2531991/1024/sys/src/9/port/devip.c:243,252
1991/1023    
} 
 
Ipconv * 
ipincoming(int dev) 
1991/1024    
ipincoming(Ipconv *base) 
1991/1023    
{ 
	Ipconv *base, *new, *etab; 
1991/1024    
	Ipconv *new, *etab; 
1991/1023    
 
	base = ipconv[dev]; 
	etab = &base[conf.ip]; 
	for(new = base; new < etab; new++) { 
1991/0424    
		if(new->ref == 0 && canqlock(new)) { 
1991/1023/sys/src/9/port/devip.c:335,4201991/1024/sys/src/9/port/devip.c:334,426
1991/0424    
ipwrite(Chan *c, char *a, long n, ulong offset) 
{ 
	int 	m, backlog, type; 
	char 	*field[5], buf[256]; 
	Ipconv  *cp; 
1991/1024    
	char 	*field[5], *ctlarg[5], buf[256]; 
1991/0424    
	Port	port, base; 
1991/1024    
	Ipconv  *cp; 
1991/0424    
 
	type = STREAMTYPE(c->qid.path); 
	if (type == Sdataqid) 
		return streamwrite(c, a, n, 0);  
 
	if (type == Sctlqid) { 
		cp = &ipconv[c->dev][STREAMID(c->qid.path)]; 
1991/1024    
	if (type != Sctlqid) 
		error(Eperm); 
1991/0424    
 
		strncpy(buf, a, sizeof buf); 
		m = getfields(buf, field, 5, ' '); 
1991/1024    
	cp = &ipconv[c->dev][STREAMID(c->qid.path)]; 
1991/0424    
 
		if(strcmp(field[0], "connect") == 0) { 
1991/1015    
			if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) || 
			   (cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed)) 
					error(Edevbusy); 
1991/1024    
	m = n; 
	if(m > sizeof(buf)-1) 
		m = sizeof(buf)-1; 
	strncpy(buf, a, m); 
	buf[m] = '\0'; 
1991/0516    
 
1991/0424    
			if(m != 2) 
1991/0516    
				error(Ebadarg); 
1991/1024    
	m = getfields(buf, field, 5, ' '); 
	if(m < 1) 
		errors("bad ip control"); 
1991/0424    
 
			switch(getfields(field[1], field, 5, '!')) { 
			default: 
1991/0516    
				error(Ebadarg); 
1991/0424    
			case 2: 
				base = PORTALLOC; 
				break; 
			case 3: 
				if(strcmp(field[2], "r") != 0) 
1991/0516    
					error(Eperm); 
1991/0424    
				base = PRIVPORTALLOC; 
				break; 
			} 
			cp->dst = ipparse(field[0]); 
			cp->pdst = atoi(field[1]); 
1991/1024    
	if(strcmp(field[0], "connect") == 0) { 
		if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) || 
		   (cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed)) 
				error(Edevbusy); 
1991/0424    
 
			/* If we have no local port assign one */ 
			qlock(&ipalloc); 
			if(cp->psrc == 0) 
				cp->psrc = nextport(ipconv[c->dev], base); 
			qunlock(&ipalloc); 
1991/1024    
		if(m != 2) 
			error(Ebadarg); 
1991/0424    
 
1991/1024    
		switch(m = getfields(field[1], ctlarg, 5, '!')) { 
		default: 
			error(Ebadarg); 
		case 2: 
			base = PORTALLOC; 
			break; 
		case 3: 
			if(strcmp(ctlarg[2], "r") != 0) 
				error(Eperm); 
			base = PRIVPORTALLOC; 
			break; 
1991/0424    
		} 
		else if(strcmp(field[0], "announce") == 0 || 
			strcmp(field[0], "reserve") == 0) { 
1991/1015    
			if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) || 
			   (cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed)) 
1991/0516    
					error(Edevbusy); 
1991/1024    
		cp->dst = ipparse(ctlarg[0]); 
		cp->pdst = atoi(ctlarg[1]); 
1991/0516    
 
1991/0424    
			if(m != 2) 
1991/0516    
				error(Ebadarg); 
1991/0424    
			port = atoi(field[1]); 
1991/1024    
		/* If we have no local port assign one */ 
		qlock(&ipalloc); 
		if(cp->psrc == 0) 
			cp->psrc = nextport(ipconv[c->dev], base); 
		qunlock(&ipalloc); 
1991/0424    
 
			qlock(&ipalloc); 
			if(portused(ipconv[c->dev], port)) { 
				qunlock(&ipalloc);	 
1991/0516    
				error(Einuse); 
1991/0424    
			} 
			cp->psrc = port; 
			cp->ptype = *field[0]; 
			qunlock(&ipalloc); 
		} 
		else if(strcmp(field[0], "backlog") == 0) { 
			if(m != 2) 
1991/0516    
				error(Ebadarg); 
1991/0424    
			backlog = atoi(field[1]); 
			if(backlog == 0) 
1991/0516    
				error(Ebadarg); 
1991/0424    
			if(backlog > 5) 
				backlog = 5; 
			cp->backlog = backlog; 
		} 
		else 
			return streamwrite(c, a, n, 0); 
1991/1024    
	} 
	else if(strcmp(field[0], "announce") == 0 || 
		strcmp(field[0], "reserve") == 0) { 
		if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) || 
		   (cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed)) 
				error(Edevbusy); 
1991/0424    
 
		return n; 
1991/1024    
		if(m != 2) 
			error(Ebadarg); 
 
		port = atoi(field[1]); 
 
		qlock(&ipalloc); 
		if(portused(ipconv[c->dev], port)) { 
			qunlock(&ipalloc);	 
			error(Einuse); 
		} 
		cp->psrc = port; 
		cp->ptype = *field[0]; 
		qunlock(&ipalloc); 
1991/0424    
	} 
1991/1024    
	else if(strcmp(field[0], "backlog") == 0) { 
		if(m != 2) 
			error(Ebadarg); 
		backlog = atoi(field[1]); 
		if(backlog == 0) 
			error(Ebadarg); 
		if(backlog > 5) 
			backlog = 5; 
		cp->backlog = backlog; 
	} 
	else 
		return streamwrite(c, a, n, 0); 
1991/0424    
 
1991/0516    
	error(Eperm); 
1991/1024    
	return n; 
1991/0424    
} 
 
 
1991/1023/sys/src/9/port/devip.c:690,6961991/1024/sys/src/9/port/devip.c:696,702
1991/0424    
				pushq(c->stream, new->stproto); 
				new->ref--; 
				qunlock(&s->listenq); 
1991/1023    
                 
1991/1024    
print("ip listener!\n"); 
1991/0424    
				return; 
			} 
		} 


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