| plan 9 kernel history: overview | file list | diff list |
1990/11211/port/devdk.c (diff list | history)
| 1990/11161/sys/src/9/port/devdk.c:232,238 – 1990/11211/sys/src/9/port/devdk.c:232,238 (short | long | prev | next) | ||
| 1990/0312 | } | |
| 1990/1101 | if(freep == 0){ unlock(&dklock); | |
| 1990/11211 | error(Enoifc); | |
| 1990/1101 | } dp = freep; dp->opened = 0; | |
| 1990/11161/sys/src/9/port/devdk.c:388,394 – 1990/11211/sys/src/9/port/devdk.c:388,394 | ||
| 1990/1101 | lock(dp); if(dp->opened==0 || streamenter(dp->s)<0){ unlock(dp); | |
| 1990/11211 | error(Ehungup); | |
| 1990/1101 | } unlock(dp); | |
| 1990/1104 | lp->rq = q; | |
| 1990/11161/sys/src/9/port/devdk.c:499,505 – 1990/11211/sys/src/9/port/devdk.c:499,505 | ||
| 1990/0312 | if(bp->type != M_DATA){ freeb(bp); | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } lp = (Line *)q->ptr; | |
| 1990/11161/sys/src/9/port/devdk.c:540,546 – 1990/11211/sys/src/9/port/devdk.c:540,546 | ||
| 1990/0312 | ||
| 1990/1101 | if(WR(q)->ptr){ | |
| 1990/0312 | freeb(bp); | |
| 1990/1101 |
| |
| 1990/11211 | error(Egreg); | |
| 1990/0312 | } /* | |
| 1990/11161/sys/src/9/port/devdk.c:571,581 – 1990/11211/sys/src/9/port/devdk.c:571,581 | ||
| 1990/0312 | break; default: freeb(bp); | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } freeb(bp); | |
| 1990/1101 | if(ncsc <= 0 || lines <= ncsc) | |
| 1990/0312 |
| |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | /* | |
| 1990/1101 | * set up | |
| 1990/11161/sys/src/9/port/devdk.c:584,590 – 1990/11211/sys/src/9/port/devdk.c:584,590 | ||
| 1990/1101 | lock(dp); if(dp->opened){ unlock(dp); | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } | |
| 1990/1101 | dp->ncsc = ncsc; dp->lines = lines; | |
| 1990/11161/sys/src/9/port/devdk.c:653,663 – 1990/11211/sys/src/9/port/devdk.c:653,663 | ||
| 1990/0312 | * the per stream directory structure */ Dirtab dksubdir[]={ | |
| 1990/11211 | "addr", {Daddrqid}, 0, 0600, "listen", {Dlistenqid}, 0, 0600, "other", {Dotherqid}, 0, 0600, "raddr", {Draddrqid}, 0, 0600, "ruser", {Duserqid}, 0, 0600, | |
| 1990/0312 | }; /* | |
| 1990/11161/sys/src/9/port/devdk.c:687,693 – 1990/11211/sys/src/9/port/devdk.c:687,694 | ||
| 1990/0312 | */ for(i = 1; i < Nline; i++) { sprint(dkdir[i].name, "%d", i); | |
| 1990/11211 | dkdir[i].qid.path = CHDIR|STREAMQID(i, Dlineqid); dkdir[i].qid.vers = 0; | |
| 1990/0312 | dkdir[i].length = 0; dkdir[i].perm = 0600; } | |
| 1990/11161/sys/src/9/port/devdk.c:696,702 – 1990/11211/sys/src/9/port/devdk.c:697,704 | ||
| 1990/0312 | * the clone device */ strcpy(dkdir[0].name, "clone"); | |
| 1990/11211 | dkdir[0].qid.path = Dcloneqid; dkdir[0].qid.vers = 0; | |
| 1990/0312 | dkdir[0].length = 0; dkdir[0].perm = 0600; } | |
| 1990/11161/sys/src/9/port/devdk.c:731,737 – 1990/11211/sys/src/9/port/devdk.c:733,739 | ||
| 1990/0312 | int dkwalk(Chan *c, char *name) { | |
| 1990/11211 | if(c->qid.path == CHDIR) | |
| 1990/0312 | return devwalk(c, name, dkdir, dk[c->dev].lines, devgen); else return devwalk(c, name, dksubdir, Nsubdir, streamgen); | |
| 1990/11161/sys/src/9/port/devdk.c:740,746 – 1990/11211/sys/src/9/port/devdk.c:742,748 | ||
| 1990/0312 | void dkstat(Chan *c, char *dp) { | |
| 1990/11211 | if(c->qid.path == CHDIR) | |
| 1990/0312 | devstat(c, dp, dkdir, dk[c->dev].lines, devgen); else devstat(c, dp, dksubdir, Nsubdir, streamgen); | |
| 1990/11161/sys/src/9/port/devdk.c:764,776 – 1990/11211/sys/src/9/port/devdk.c:766,778 | ||
| 1990/0312 | Dk *dp; int line; | |
| 1990/0319 |
| |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1990/0312 | /* | |
| 1990/0319 | * directories are read only */ if(omode != OREAD) | |
| 1990/11211 | error(Ebadarg); } else switch(STREAMTYPE(c->qid.path)){ | |
| 1990/0319 | case Dcloneqid: | |
| 1990/1101 | dp = &dk[c->dev]; | |
| 1990/0319 | /* | |
| 1990/11161/sys/src/9/port/devdk.c:783,794 – 1990/11211/sys/src/9/port/devdk.c:785,796 | ||
| 1990/0312 | qunlock(lp); continue; } | |
| 1990/11211 | c->qid.path = STREAMQID(lp-dp->line, Sctlqid); | |
| 1990/0312 | break; } } if(lp == end) | |
| 1990/11211 | error(Enodev); | |
| 1990/1101 | lp->state = Lopened; qunlock(lp); | |
| 1990/0312 | streamopen(c, &dkinfo); | |
| 1990/11161/sys/src/9/port/devdk.c:800,806 – 1990/11211/sys/src/9/port/devdk.c:802,808 | ||
| 1990/0312 | * channel on which the call arrived. */ line = dklisten(c); | |
| 1990/11211 | c->qid.path = STREAMQID(line, Sctlqid); | |
| 1990/0312 | streamopen(c, &dkinfo); pushq(c->stream, &urpinfo); dkwindow(c); | |
| 1990/11161/sys/src/9/port/devdk.c:813,819 – 1990/11211/sys/src/9/port/devdk.c:815,821 | ||
| 1990/0319 | * read only files */ if(omode != OREAD) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0319 | break; default: /* | |
| 1990/11161/sys/src/9/port/devdk.c:834,840 – 1990/11211/sys/src/9/port/devdk.c:836,842 | ||
| 1990/0312 | void dkcreate(Chan *c, char *name, int omode, ulong perm) { | |
| 1990/11211 | error(Eperm); | |
| 1990/0312 | } void | |
| 1990/11161/sys/src/9/port/devdk.c:852,866 – 1990/11211/sys/src/9/port/devdk.c:854,868 | ||
| 1990/0319 | if(c->stream) | |
| 1990/0312 | return streamread(c, a, n); | |
| 1990/0319 |
| |
| 1990/11211 | if(c->qid.path & CHDIR){ if(c->qid.path == CHDIR) | |
| 1990/0319 | return devdirread(c, a, n, dkdir, dk[c->dev].lines, devgen); else return devdirread(c, a, n, dksubdir, Nsubdir, streamgen); } | |
| 1990/0312 |
| |
| 1990/0319 |
| |
| 1990/11211 | lp = &dk[c->dev].line[STREAMID(c->qid.path)]; switch(STREAMTYPE(c->qid.path)){ | |
| 1990/0312 | case Daddrqid: return stringread(c, a, n, lp->addr); case Draddrqid: | |
| 1990/11161/sys/src/9/port/devdk.c:868,874 – 1990/11211/sys/src/9/port/devdk.c:870,876 | ||
| 1990/0312 | case Duserqid: return stringread(c, a, n, lp->ruser); } | |
| 1990/11211 | error(Eperm); | |
| 1990/0312 | } long | |
| 1990/11161/sys/src/9/port/devdk.c:879,885 – 1990/11211/sys/src/9/port/devdk.c:881,887 | ||
| 1990/0312 | char *field[5]; int m; | |
| 1990/11211 | t = STREAMTYPE(c->qid.path); | |
| 1990/0312 | /* * get data dispatched as quickly as possible | |
| 1990/11161/sys/src/9/port/devdk.c:895,917 – 1990/11211/sys/src/9/port/devdk.c:897,919 | ||
| 1990/0312 | m = getfields(buf, field, 5, ' '); if(strcmp(field[0], "connect")==0){ if(m < 2) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | dkcall(Dial, c, field[1], 0, 0); } else if(strcmp(field[0], "announce")==0){ if(m < 2) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | dkcall(Announce, c, field[1], 0, 0); } else if(strcmp(field[0], "redial")==0){ if(m < 4) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | dkcall(Redial, c, field[1], field[2], field[3]); } else if(strcmp(field[0], "accept")==0){ if(m < 2) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | dkanswer(c, strtoul(field[1], 0, 0), 0); } else if(strcmp(field[0], "reject")==0){ if(m < 3) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | dkanswer(c, strtoul(field[1], 0, 0), strtoul(field[2], 0, 0)); } else return streamwrite(c, a, n, 0); | |
| 1990/11161/sys/src/9/port/devdk.c:918,952 – 1990/11211/sys/src/9/port/devdk.c:920,940 | ||
| 1990/0312 | return n; } | |
| 1990/11211 | error(Eperm); | |
| 1990/0312 | } void dkremove(Chan *c) { | |
| 1990/11211 | error(Eperm); | |
| 1990/0312 | } void dkwstat(Chan *c, char *dp) { | |
| 1990/11211 | error(Eperm); | |
| 1990/0312 | } | |
| 1990/1101 | * open the common signalling channel */ | |
| 1990/11161/sys/src/9/port/devdk.c:962,968 – 1990/11211/sys/src/9/port/devdk.c:950,956 | ||
| 1990/1101 | nexterror(); } c = dkattach(dp->name); | |
| 1990/11211 | c->qid.path = STREAMQID(line, Sdataqid); | |
| 1990/1101 | dkopen(c, ORDWR); poperror(); | |
| 1990/11161/sys/src/9/port/devdk.c:1022,1028 – 1990/11211/sys/src/9/port/devdk.c:1010,1016 | ||
| 1990/1101 | Chan *csc; | |
| 1990/0707 | char *bang, *dot; | |
| 1990/1101 | ||
| 1990/0312 |
| |
| 1990/11211 | line = STREAMID(c->qid.path); | |
| 1990/0312 | dp = &dk[c->dev]; lp = &dp->line[line]; | |
| 1990/11161/sys/src/9/port/devdk.c:1030,1036 – 1990/11211/sys/src/9/port/devdk.c:1018,1024 | ||
| 1990/0312 | * only dial on virgin lines */ | |
| 1990/0511 | if(lp->state != Lopened) | |
| 1990/0312 |
| |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | DPRINT("dkcall(line=%d, type=%d, dest=%s)\n", line, type, addr); | |
| 1990/11161/sys/src/9/port/devdk.c:1040,1048 – 1990/11211/sys/src/9/port/devdk.c:1028,1036 | ||
| 1990/0707 | * - change ! into . to delimit service | |
| 1990/0312 | */ if(strchr(addr, '\n')) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | if(strlen(addr)+strlen(u->p->pgrp->user)+2 >= sizeof(dialstr)) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | strcpy(dialstr, addr); | |
| 1990/0707 | bang = strchr(dialstr, '!'); if(bang){ | |
| 1990/11161/sys/src/9/port/devdk.c:1109,1115 – 1990/11211/sys/src/9/port/devdk.c:1097,1103 | ||
| 1990/0312 | if(type==Redial){ if(streamread(dc, &dialtone, 1L) != 1L){ lp->state = Lconnected; | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } } | |
| 1990/11161/sys/src/9/port/devdk.c:1142,1150 – 1990/11211/sys/src/9/port/devdk.c:1130,1138 | ||
| 1990/0312 | DPRINT("got reply %d\n", lp->state); if(lp->state != Lconnected) { if(lp->err >= DKERRS) | |
| 1990/11211 | error(dkerr[0]); | |
| 1990/0312 | else | |
| 1990/11211 | error(dkerr[lp->err]); | |
| 1990/0312 | } /* | |
| 1990/11161/sys/src/9/port/devdk.c:1202,1208 – 1990/11211/sys/src/9/port/devdk.c:1190,1196 | ||
| 1990/0312 | /* * open the data file */ | |
| 1990/1101 |
| |
| 1990/11211 | dc = dkopenline(dp, STREAMID(c->qid.path)); | |
| 1990/0312 | if(waserror()){ close(dc); nexterror(); | |
| 1990/11161/sys/src/9/port/devdk.c:1218,1224 – 1990/11211/sys/src/9/port/devdk.c:1206,1212 | ||
| 1990/0312 | n = streamread(dc, dialstr, sizeof(dialstr)-1); DPRINT("returns %d\n", n); if(n <= 0) | |
| 1990/11211 | error(Eio); | |
| 1990/0312 | dialstr[n] = 0; DPRINT("dialstr = %s\n", dialstr); | |
| 1990/11161/sys/src/9/port/devdk.c:1228,1234 – 1990/11211/sys/src/9/port/devdk.c:1216,1222 | ||
| 1990/0312 | n = getfields(dialstr, line, 12, '\n'); if (n < 2) { DPRINT("bad dialstr from dk (1 line)\n"); | |
| 1990/11211 | error(Eio); | |
| 1990/0312 | } /* | |
| 1990/11161/sys/src/9/port/devdk.c:1332,1338 – 1990/11211/sys/src/9/port/devdk.c:1320,1326 | ||
| 1990/0312 | default: print("bad message from dk(>4 line)\n"); qunlock(lp); | |
| 1990/11211 | error(Ebadarg); | |
| 1990/0312 | } sprint(lp->other, "w(%d)", W_TRAF(lp->window)); | |
| 1990/11161/sys/src/9/port/devdk.c:1372,1378 – 1990/11211/sys/src/9/port/devdk.c:1360,1366 | ||
| 1990/0312 | close(dc); nexterror(); } | |
| 1990/11211 | dc->qid.path = STREAMQID(STREAMID(c->qid.path), Sdataqid); | |
| 1990/0312 | dkopen(dc, ORDWR); /* | |
| 1990/11161/sys/src/9/port/devdk.c:1395,1401 – 1990/11211/sys/src/9/port/devdk.c:1383,1389 | ||
| 1990/0312 | long wins; Line *lp; | |
| 1990/11211 | lp = &dk[c->dev].line[STREAMID(c->qid.path)]; | |
| 1990/0312 | if(lp->window == 0) lp->window = 64; sprint(buf, "init %d %d", lp->window, Streamhi); | |
| 1990/11161/sys/src/9/port/devdk.c:1444,1450 – 1990/11211/sys/src/9/port/devdk.c:1432,1438 | ||
| 1990/0312 | n = streamread(dp->csc, (char *)&d, (long)sizeof(d)); if(n != sizeof(d)){ | |
| 1990/1101 | if(n == 0) | |
| 1990/11211 | error(Ehungup); | |
| 1990/0312 | print("strange csc message %d\n", n); continue; } | |
| 1990/11161/sys/src/9/port/devdk.c:1663,1669 – 1990/11211/sys/src/9/port/devdk.c:1651,1657 | ||
| 1990/1101 | ||
| 1990/0312 | for(;;){ | |
| 1990/1101 | if(dp->opened==0) | |
| 1990/11211 | error(Ehungup); | |
| 1990/1101 | ||
| 1990/0312 | /* | |
| 1990/1101 | * send keep alive | |