18 static Dirtab consdir[]={
19 ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555,
20 "cons", {Qcons}, 0, 0660,
21 "consctl", {Qconsctl}, 0, 0220,
22 "snarf", {Qsnarf}, 0, 0600,
26 consattach(char *spec)
28 return devattach('c', spec);
32 conswalk(Chan *c, Chan *nc, char **name, int nname)
34 return devwalk(c, nc, name,nname, consdir, nelem(consdir), devgen);
38 consstat(Chan *c, uchar *dp, int n)
40 return devstat(c, dp, n, consdir, nelem(consdir), devgen);
44 consopen(Chan *c, int omode)
47 c = devopen(c, omode, consdir, nelem(consdir), devgen);
48 switch((ulong)c->qid.path){
52 if((c->mode&3) == OWRITE || (c->mode&3) == ORDWR)
53 c->aux = smalloc(sizeof(Snarf));
60 setsnarf(char *buf, int n, int *vers)
68 for(i = 0; i < nelem(consdir); i++){
69 if(consdir[i].qid.type == Qsnarf){
70 consdir[i].qid.vers = snarf.vers;
85 switch((ulong)c->qid.path){
86 /* last close of control file turns off raw */
89 /* odd behavior but really ok: replace snarf buffer when /dev/snarf is closed */
94 setsnarf(t->buf, t->n, 0);
95 t->buf = nil; /* setsnarf took it */
103 consread(Chan *c, void *buf, long n, vlong off)
107 switch((ulong)c->qid.path){
111 if(off + n > snarf.n)
113 memmove(buf, snarf.buf+off, n);
120 return devdirread(c, buf, n, consdir, nelem(consdir), devgen);
127 print("consread 0x%llux\n", c->qid.path);
130 return -1; /* never reached */
134 conswrite(Chan *c, void *va, long n, vlong)
139 switch((ulong)c->qid.path){
150 /* always append only */
151 if(t->n > MAXSNARF) /* avoid thrashing when people cut huge text */
152 error("snarf buffer too big");
153 a = realloc(t->buf, t->n + n + 1);
155 error("snarf buffer too big");
157 memmove(t->buf+t->n, va, n);
162 print("conswrite: 0x%llux\n", c->qid.path);