| plan 9 kernel history: overview | file list | diff list |
1991/1023/port/devip.c (diff list | history)
| 1991/1019/sys/src/9/port/devip.c:226,231 – 1991/1023/sys/src/9/port/devip.c:226,255 (short | long | prev | next) | ||
| 1991/0424 | base = ipconv[c->dev]; etab = &base[conf.ip]; for(new = base; new < etab; new++) { | |
| 1991/1023 | new = ipincoming(c->dev); if(new == 0) error(Enodev); c->qid.path = CHDIR|STREAMQID(new-base, ipchanqid); devwalk(c, "ctl", 0, 0, streamgen); streamopen(c, &ipinfo); pushq(c->stream, new->stproto); new->ref--; return new; } error(Enodev); } Ipconv * ipincoming(int dev) { Ipconv *base, *new, *etab; base = ipconv[dev]; etab = &base[conf.ip]; for(new = base; new < etab; new++) { | |
| 1991/0424 | if(new->ref == 0 && canqlock(new)) { if(new->ref || | |
| 1991/1015 | (new->stproto == &tcpinfo && new->tcpctl.state != CLOSED) || | |
| 1991/1019/sys/src/9/port/devip.c:234,251 – 1991/1023/sys/src/9/port/devip.c:258,268 | ||
| 1991/0424 | continue; } new->ref++; | |
| 1991/1023 | return 0; | |
| 1991/0424 | } void | |
| 1991/1019/sys/src/9/port/devip.c:642,648 – 1991/1023/sys/src/9/port/devip.c:659,665 | ||
| 1991/0424 | } int | |
| 1991/1023 | iphavecon(Ipconv *s) | |
| 1991/0424 | { return s->curlog; } | |
| 1991/1019/sys/src/9/port/devip.c:655,682 – 1991/1023/sys/src/9/port/devip.c:672,696 | ||
| 1991/0424 | qlock(&s->listenq); for(;;) { | |
| 1991/1023 | sleep(&s->listenr, iphavecon, s); | |
| 1991/0424 |
| |
| 1991/1023 | new = base; for(etab = &base[conf.ip]; new < etab; new++) { if(new->newcon) { | |
| 1991/0424 | /* Remove the listen channel reference */ streamclose(c); s->curlog--; | |
| 1991/1023 | ||
| 1991/0424 | /* Attach the control channel to the new connection */ | |
| 1991/1023 | new->newcon = 0; | |
| 1991/0424 | c->qid.path = CHDIR|STREAMQID(new-base, ipchanqid); devwalk(c, "ctl", 0, 0, streamgen); streamopen(c, &ipinfo); pushq(c->stream, new->stproto); new->ref--; | |
| 1991/1023 | ||
| 1991/0424 | return; } } | |