| plan 9 kernel history: overview | file list | diff list |
1992/0622/port/devconc.c (diff list | history)
| 1992/0622/sys/src/9/port/devconc.c:1,490 – 1992/0627/sys/src/9/port/devconc.c:1,488 (short | long | prev | next) | ||
| 1992/0609 | #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "../port/error.h" | |
| 1992/0620 |
| |
| 1992/0627 | streamexit(cp->s, 1); | |
| 1992/0609 | qunlock(cp); } /* * this is only called by concstclose (hangup) */ static void concdevstiput(Queue *q, Block *bp) { PUTNEXT(q, bp); } static void concdevstoput(Queue *q, Block *bp) { Subdev *dp = q->ptr; Conc *cp; int chan; if(dp == 0){ DPRINT("concdevstoput: not config'd, dropped %d\n", BLEN(bp)); freeb(bp); return; } cp = dp->cp; qlock(cp); if(!putq(q, bp)){ /* send only whole messages */ qunlock(cp); return; } bp = grabq(q); qunlock(cp); if(BLEN(bp) < 2 || bp->type != M_DATA){ DPRINT("concdevstoput: dropped %d\n", BLEN(bp)); freeb(bp); return; } chan = bp->rptr[0] | (bp->rptr[1]<<8); chan += dp->chan0; bp->rptr[0] = chan; bp->rptr[1] = chan>>8; PUTNEXT(cp->wq, bp); } void concreset(void) { | |
| 1992/0622 | concs = xalloc(conf.nconc*sizeof(Conc)); | |
| 1992/0609 | newqinfo(&concinfo); } void concinit(void) { } Chan * concattach(char *spec) { Chan *c; Conc *cp; /* * find a concentrator with the same name (default conc) */ if(*spec == 0) spec = "conc"; cp = concalloc(spec, 0); if(cp == 0 || cp->ndev == 0) error("device not configured"); c = devattach('K', spec); c->dev = cp-concs; c->qid = (Qid){CHDIR, 0}; return c; } Chan * concclone(Chan *c, Chan *nc) { return devclone(c, nc); } #define TOPDIR (CHDIR+1) #define CHANDIR (CHDIR+2) static int concgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp) { Conc *cp; char buf[16]; cp = &concs[c->dev]; switch(c->qid.path){ case CHDIR: devdir(c, (Qid){TOPDIR,0}, concs[c->dev].name, 0, eve, 0555, dp); return i==0 ? 1 : -1; case TOPDIR: if(i<0 || i >= cp->ndev) return -1; sprint(buf, "%d", i); devdir(c, (Qid){STREAMQID(i,CHANDIR),0}, buf, 0, eve, 0555, dp); return 1; } return streamgen(c, 0, 0, i, dp); } int concwalk(Chan *c, char *name) { return devwalk(c, name, 0, 0, concgen); } void concstat(Chan *c, char *dp) { char buf[16], *name; Dir dir; if(c->qid.path&CHDIR)switch(c->qid.path){ case CHDIR: name = "."; break; case TOPDIR: name = concs[c->dev].name; break; default: sprint(name = buf, "%d", STREAMID(c->qid.path)); break; }else switch(STREAMTYPE(c->qid.path)){ case Sdataqid: name = "data"; break; case Sctlqid: name = "ctl"; break; default: name = "panic"; break; } devdir(c, c->qid, name, 0, eve, (c->qid.path&CHDIR)?0555:0600, &dir); convD2M(&dir, dp); } Chan * concopen(Chan *c, int omode) { if(c->qid.path & CHDIR){ if(omode != OREAD) error(Eperm); }else streamopen(c, &concdevinfo); c->mode = openmode(omode); c->flag |= COPEN; c->offset = 0; return c; } void conccreate(Chan *c, char *name, int omode, ulong perm) { USED(c); error(Eperm); } void concclose(Chan *c) { if(c->stream) streamclose(c); } long concread(Chan *c, void *a, long n, ulong offset) { if(c->stream) return streamread(c, a, n); if(c->qid.path & CHDIR) return devdirread(c, a, n, 0, 0, concgen); error(Eio); | |
| 1992/0611 | return -1; /* does not return */ | |
| 1992/0609 | } long concwrite(Chan *c, void *a, long n, ulong offset) { return streamwrite(c, a, n, 0); } void concremove(Chan *c) { USED(c); error(Eperm); } void concwstat(Chan *c, char *dp) { USED(c); error(Eperm); } | |