| plan 9 kernel history: overview | file list | diff list |
1999/0910/port/devsdp.c (diff list | history)
| 1999/0909/sys/src/9/port/devsdp.c:74,80 – 1999/0910/sys/src/9/port/devsdp.c:74,81 (short | long | prev | next) | ||
| 1999/0909 | CDial, CAccept, | |
| 1999/0902 | COpen, | |
| 1999/0910 | CLocalClose, CRemoteClose, | |
| 1999/0906 | CClosed, | |
| 1999/0902 | }; | |
| 1999/0909/sys/src/9/port/devsdp.c:86,93 – 1999/0910/sys/src/9/port/devsdp.c:87,94 | ||
| 1999/0901 | ||
| 1999/0902 | int state; | |
| 1999/0906 | int dataopen; | |
| 1999/0910 | int reader; // reader proc has been started | |
| 1999/0901 | ||
| 1999/0906 |
| |
| 1999/0909/sys/src/9/port/devsdp.c:95,103 – 1999/0910/sys/src/9/port/devsdp.c:96,106 | ||
| 1999/0906 | ulong dialid; ulong acceptid; | |
| 1999/0910 | QLock readlk; // protects readproc | |
| 1999/0907 | Proc *readproc; | |
| 1999/0910 | ||
| 1999/0902 | Chan *chan; // packet channel | |
| 1999/0910 | char *channame; | |
| 1999/0902 | ||
| 1999/0907 | char owner[NAMELEN]; /* protections */ | |
| 1999/0901 | int perm; | |
| 1999/0909/sys/src/9/port/devsdp.c:131,138 – 1999/0910/sys/src/9/port/devsdp.c:134,141 | ||
| 1999/0906 | enum { | |
| 1999/0909 | ConOpenRequest, | |
| 1999/0906 | ConOpenAck, | |
| 1999/0910 | ConOpenAckAck, | |
| 1999/0906 | ConClose, | |
| 1999/0909 | ConReset, | |
| 1999/0906 | }; | |
| 1999/0909/sys/src/9/port/devsdp.c:186,192 – 1999/0910/sys/src/9/port/devsdp.c:189,196 | ||
| 1999/0909 | [CDial] "Dial", [CAccept] "Accept", | |
| 1999/0908 | [COpen] "Open", | |
| 1999/0910 | [CLocalClose] "LocalClose", [CRemoteClose] "RemoteClose", | |
| 1999/0908 | [CClosed] "Closed", }; | |
| 1999/0824 | ||
| 1999/0909/sys/src/9/port/devsdp.c:203,208 – 1999/0910/sys/src/9/port/devsdp.c:207,213 | ||
| 1999/0907 | static Block *readdata(Conv *c, int n); static void convoput(Conv *c, int type, Block *b); static void convoput2(Conv *c, int op, ulong dialid, ulong acceptid); | |
| 1999/0910 | static void convreader(void *a); | |
| 1999/0824 | ||
| 1999/0907 | ||
| 1999/0824 | static void | |
| 1999/0909/sys/src/9/port/devsdp.c:328,335 – 1999/0910/sys/src/9/port/devsdp.c:333,344 | ||
| 1999/0907 | if(strcmp(up->user, c->owner) != 0 || (perm & c->perm) != perm) | |
| 1999/0902 | error(Eperm); c->ref++; | |
| 1999/0907 |
| |
| 1999/0910 | if(TYPE(ch->qid) == Qdata) { if(c->dataopen == 0) if(c->readproc != nil) postnote(c->readproc, 1, "interrupt", 0); | |
| 1999/0907 | c->dataopen++; | |
| 1999/0910 | } | |
| 1999/0902 | qunlock(c); poperror(); break; | |
| 1999/0909/sys/src/9/port/devsdp.c:377,386 – 1999/0910/sys/src/9/port/devsdp.c:386,395 | ||
| 1999/0907 | break; | |
| 1999/0909 | case CAccept: | |
| 1999/0907 | case COpen: | |
| 1999/0910 | convsetstate(c, CLocalClose); | |
| 1999/0907 | break; | |
| 1999/0910 | case CLocalClose: panic("local close already happened"); | |
| 1999/0907 | } } qunlock(c); | |
| 1999/0909/sys/src/9/port/devsdp.c:474,493 – 1999/0910/sys/src/9/port/devsdp.c:483,504 | ||
| 1999/0824 | error("short write"); arg0 = cb->f[0]; | |
| 1999/0901 | print("cmd = %s\n", arg0); | |
| 1999/0906 |
| |
| 1999/0910 | if(strcmp(arg0, "accept") == 0) { | |
| 1999/0906 | if(cb->nf != 2) | |
| 1999/0910 | error("usage: accect file"); | |
| 1999/0906 | if(c->chan != nil) | |
| 1999/0910 | error("already connected"); | |
| 1999/0906 | c->chan = namec(cb->f[1], Aopen, ORDWR, 0); | |
| 1999/0909 |
| |
| 1999/0910 | c->channame = malloc(strlen(cb->f[1])+1); strcpy(c->channame, cb->f[1]); | |
| 1999/0906 | } else if(strcmp(arg0, "dial") == 0) { | |
| 1999/0910 | if(cb->nf != 2) error("usage: accect file"); if(c->chan != nil) error("already connected"); c->chan = namec(cb->f[1], Aopen, ORDWR, 0); c->channame = malloc(strlen(cb->f[1])+1); strcpy(c->channame, cb->f[1]); | |
| 1999/0909 | convsetstate(c, CDial); | |
| 1999/0906 | } else if(strcmp(arg0, "drop") == 0) { if(cb->nf != 2) | |
| 1999/0909/sys/src/9/port/devsdp.c:584,590 – 1999/0910/sys/src/9/port/devsdp.c:595,601 | ||
| 1999/0901 | break; } if(canqlock(c)){ | |
| 1999/0902 |
| |
| 1999/0910 | if(c->state == CClosed && c->reader == 0) | |
| 1999/0901 | break; qunlock(c); } | |
| 1999/0909/sys/src/9/port/devsdp.c:597,603 – 1999/0910/sys/src/9/port/devsdp.c:608,617 | ||
| 1999/0901 | ||
| 1999/0902 | c->ref++; | |
| 1999/0906 | c->state = CInit; | |
| 1999/0902 | ||
| 1999/0910 | if(!waserror()) { kproc("convreader", convreader, c); c->reader = 1; } | |
| 1999/0907 | strncpy(c->owner, up->user, sizeof(c->owner)); | |
| 1999/0901 | c->perm = 0660; qunlock(c); | |
| 1999/0909/sys/src/9/port/devsdp.c:647,657 – 1999/0910/sys/src/9/port/devsdp.c:661,673 | ||
| 1999/0909 | case CAccept: if(convretry(c)) convoput2(c, ConOpenAck, c->dialid, c->acceptid); | |
| 1999/0910 | else convoput2(c, ConReset, c->dialid, c->acceptid); | |
| 1999/0909 | break; | |
| 1999/0906 | case COpen: | |
| 1999/0909 | // check for control packet and keepalive | |
| 1999/0906 | break; | |
| 1999/0910 | case CLocalClose: | |
| 1999/0906 | if(convretry(c)) | |
| 1999/0907 | convoput2(c, ConClose, c->dialid, c->acceptid); | |
| 1999/0906 | break; | |
| 1999/0909/sys/src/9/port/devsdp.c:730,744 – 1999/0910/sys/src/9/port/devsdp.c:746,763 | ||
| 1999/0909 | assert(c->state == CDial || c->state == CAccept); if(c->state == CDial) { convretryinit(c); | |
| 1999/0907 |
| |
| 1999/0910 | convoput2(c, ConOpenAckAck, c->dialid, c->acceptid); | |
| 1999/0906 | } // setup initial key and auth method break; | |
| 1999/0909 |
| |
| 1999/0910 | case CLocalClose: assert(c->state == CAccept || c->state == COpen); | |
| 1999/0909 | convretryinit(c); | |
| 1999/0907 | convoput2(c, ConClose, c->dialid, c->acceptid); | |
| 1999/0906 | break; | |
| 1999/0910 | case CRemoteClose: convoput2(c, ConReset, c->dialid, c->acceptid); break; | |
| 1999/0906 | case CClosed: | |
| 1999/0907 | if(c->readproc) postnote(c->readproc, 1, "interrupt", 0); | |
| 1999/0909/sys/src/9/port/devsdp.c:748,753 – 1999/0910/sys/src/9/port/devsdp.c:767,776 | ||
| 1999/0907 | cclose(c->chan); c->chan = nil; } | |
| 1999/0910 | if(c->channame) { free(c->channame); c->channame = nil; } | |
| 1999/0907 | strcpy(c->owner, "network"); c->perm = 0660; c->dialid = 0; | |
| 1999/0909/sys/src/9/port/devsdp.c:778,813 – 1999/0910/sys/src/9/port/devsdp.c:801,808 | ||
| 1999/0907 | } | |
| 1999/0906 | ||
| 1999/0907 |
| |
| 1999/0909/sys/src/9/port/devsdp.c:853,860 – 1999/0910/sys/src/9/port/devsdp.c:848,853 | ||
| 1999/0907 | c->in.controlseq = cseq; b->rp += 4; | |
| 1999/0909/sys/src/9/port/devsdp.c:895,957 – 1999/0910/sys/src/9/port/devsdp.c:888,983 | ||
| 1999/0907 | dialid = nhgetl(con->dialid); acceptid = nhgetl(con->acceptid); | |
| 1999/0910 | switch(c->state) { default: panic("unknown state: %d", c->state); case CInit: break; case CDial: if(dialid != c->dialid) goto Reset; break; case CAccept: case COpen: case CLocalClose: case CRemoteClose: if(dialid != c->dialid || acceptid != c->acceptid) goto Reset; break; case CClosed: goto Reset; } print("conviput2: %s: %d %uld %uld\n", convstatename[c->state], con->op, dialid, acceptid); | |
| 1999/0907 | switch(con->op) { | |
| 1999/0909 | case ConOpenRequest: switch(c->state) { | |
| 1999/0910 | return; | |
| 1999/0909 | case CAccept: case COpen: | |
| 1999/0910 | // duplicate ConOpenRequest that we ignore return; | |
| 1999/0909 | } | |
| 1999/0907 | break; case ConOpenAck: | |
| 1999/0909 | switch(c->state) { case CDial: | |
| 1999/0907 |
| |
| 1999/0910 | return; case COpen: // duplicate that we have to ack convoput2(c, ConOpenAckAck, acceptid, dialid); return; } break; case ConOpenAckAck: switch(c->state) { | |
| 1999/0909 | case CAccept: | |
| 1999/0910 | return; case COpen: // duplicate that we ignore return; | |
| 1999/0909 | } | |
| 1999/0907 | break; case ConClose: | |
| 1999/0909 |
| |
| 1999/0910 | convoput2(c, ConReset, dialid, acceptid); | |
| 1999/0909 | switch(c->state) { | |
| 1999/0910 | case CInit: | |
| 1999/0909 | case CDial: | |
| 1999/0907 |
| |
| 1999/0909 | case CAccept: | |
| 1999/0910 | case CLocalClose: convsetstate(c, CClosed); return; | |
| 1999/0909 | case COpen: | |
| 1999/0907 |
| |
| 1999/0910 | convsetstate(c, CRemoteClose); return; case CRemoteClose: return; | |
| 1999/0909 | } | |
| 1999/0910 | return; case ConReset: switch(c->state) { case CInit: case CDial: case CAccept: case COpen: case CLocalClose: | |
| 1999/0909 | convsetstate(c, CClosed); | |
| 1999/0907 |
| |
| 1999/0910 | return; case CRemoteClose: return; } return; | |
| 1999/0907 | } | |
| 1999/0910 | Reset: // invalid connection message - reset to sender convoput2(c, ConReset, dialid, acceptid); | |
| 1999/0907 | } // assume hold conv lock | |
| 1999/0909/sys/src/9/port/devsdp.c:1003,1014 – 1999/0910/sys/src/9/port/devsdp.c:1029,1073 | ||
| 1999/0906 | devtab[c->chan->type]->write(c->chan, &con, sizeof(con), 0); | |
| 1999/0907 | } | |
| 1999/0910 | static Block * convreadblock(Conv *c, int n) { Block *b; Chan *ch = nil; qlock(&c->readlk); if(waserror()) { c->readproc = nil; if(ch) cclose(ch); qunlock(&c->readlk); nexterror(); } qlock(c); if(c->state == CClosed) { qunlock(c); error("closed"); } c->readproc = up; ch = c->chan; incref(ch); qunlock(c); b = devtab[ch->type]->bread(ch, n, 0); c->readproc = nil; cclose(ch); poperror(); qunlock(&c->readlk); return b; } | |
| 1999/0907 | static int readready(void *a) { Conv *c = a; | |
| 1999/0910 | return (c->state == CClosed) || c->in.controlpkt != nil; | |
| 1999/0907 | } static Block * | |
| 1999/0909/sys/src/9/port/devsdp.c:1016,1024 – 1999/0910/sys/src/9/port/devsdp.c:1075,1084 | ||
| 1999/0907 | { Block *b; | |
| 1999/0910 | USED(n); | |
| 1999/0907 | for(;;) { qlock(c); | |
| 1999/0910 | if(c->state == CInit || c->state == CClosed) { | |
| 1999/0907 | qunlock(c); return nil; } | |
| 1999/0909/sys/src/9/port/devsdp.c:1031,1064 – 1999/0910/sys/src/9/port/devsdp.c:1091,1099 | ||
| 1999/0907 | } qunlock(c); | |
| 1999/0910 | sleep(&c->in.controlready, readready, c); | |
| 1999/0907 | } | |
| 1999/0910 | return 0; | |
| 1999/0907 | } static Block * | |
| 1999/0909/sys/src/9/port/devsdp.c:1068,1075 – 1999/0910/sys/src/9/port/devsdp.c:1103,1108 | ||
| 1999/0907 | for(;;) { b = convreadblock(c, n); | |
| 1999/0909/sys/src/9/port/devsdp.c:1081,1084 – 1999/0910/sys/src/9/port/devsdp.c:1114,1147 | ||
| 1999/0907 | if(b != nil) return b; } | |
| 1999/0910 | } static void convreader(void *a) { Conv *c = a; Block *b; qlock(c); assert(c->reader == 1); while(c->dataopen == 0) { qunlock(c); b = nil; if(!waserror()) { b = convreadblock(c, 2000); poperror(); } qlock(c); if(b == nil) { convsetstate(c, CClosed); break; } if(!waserror()) { conviput(c, b, 1); poperror(); } } c->reader = 0; qunlock(c); pexit("hangup", 1); | |
| 1999/0906 | } | |