| 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,187 – 1991/1024/sys/src/9/port/devip.c:181,187 (short | long | prev | next) | ||
| 1991/0424 | error(Eprotonosup); if(cp->backlog == 0) | |
| 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,232 – 1991/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 |
| |
| 1991/1024 | new = ipincoming(base); | |
| 1991/1023 | if(new == 0) error(Enodev); | |
| 1991/1023/sys/src/9/port/devip.c:243,253 – 1991/1024/sys/src/9/port/devip.c:243,252 | ||
| 1991/1023 | } Ipconv * | |
| 1991/1024 | ipincoming(Ipconv *base) | |
| 1991/1023 | { | |
| 1991/1024 | Ipconv *new, *etab; | |
| 1991/1023 |
| |
| 1991/0424 | if(new->ref == 0 && canqlock(new)) { | |
| 1991/1023/sys/src/9/port/devip.c:335,420 – 1991/1024/sys/src/9/port/devip.c:334,426 | ||
| 1991/0424 | ipwrite(Chan *c, char *a, long n, ulong offset) { int m, backlog, type; | |
| 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); | |
| 1991/1024 | if (type != Sctlqid) error(Eperm); | |
| 1991/0424 |
| |
| 1991/1024 | cp = &ipconv[c->dev][STREAMID(c->qid.path)]; | |
| 1991/0424 |
| |
| 1991/1015 |
| |
| 1991/1024 | m = n; if(m > sizeof(buf)-1) m = sizeof(buf)-1; strncpy(buf, a, m); buf[m] = '\0'; | |
| 1991/0516 | ||
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/1024 | m = getfields(buf, field, 5, ' '); if(m < 1) errors("bad ip control"); | |
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 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 |
| |
| 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 | } | |
| 1991/1015 |
| |
| 1991/0516 |
| |
| 1991/1024 | cp->dst = ipparse(ctlarg[0]); cp->pdst = atoi(ctlarg[1]); | |
| 1991/0516 | ||
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 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 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/0424 |
| |
| 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 |
| |
| 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 |
| |
| 1991/1024 | return n; | |
| 1991/0424 | } | |
| 1991/1023/sys/src/9/port/devip.c:690,696 – 1991/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; } } | |