19 static Dirtab consdir[]={
20 ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555,
21 "cons", {Qcons}, 0, 0660,
22 "consctl", {Qconsctl}, 0, 0220,
23 "snarf", {Qsnarf}, 0, 0600,
24 "winname", {Qwinname}, 0, 0000,
28 consattach(char *spec)
30 return devattach('c', spec);
34 conswalk(Chan *c, Chan *nc, char **name, int nname)
36 return devwalk(c, nc, name,nname, consdir, nelem(consdir), devgen);
40 consstat(Chan *c, uchar *dp, int n)
42 return devstat(c, dp, n, consdir, nelem(consdir), devgen);
46 consopen(Chan *c, int omode)
49 c = devopen(c, omode, consdir, nelem(consdir), devgen);
50 switch((ulong)c->qid.path){
54 if((c->mode&3) == OWRITE || (c->mode&3) == ORDWR)
55 c->aux = smalloc(sizeof(Snarf));
62 setsnarf(char *buf, int n, int *vers)
70 for(i = 0; i < nelem(consdir); i++){
71 if(consdir[i].qid.type == Qsnarf){
72 consdir[i].qid.vers = snarf.vers;
87 switch((ulong)c->qid.path){
88 /* last close of control file turns off raw */
91 /* odd behavior but really ok: replace snarf buffer when /dev/snarf is closed */
96 setsnarf(t->buf, t->n, 0);
97 t->buf = nil; /* setsnarf took it */
105 consread(Chan *c, void *buf, long n, vlong off)
109 switch((ulong)c->qid.path){
113 if(off + n > snarf.n)
115 memmove(buf, snarf.buf+off, n);
122 return devdirread(c, buf, n, consdir, nelem(consdir), devgen);
129 print("consread 0x%llux\n", c->qid.path);
132 return -1; /* never reached */
136 conswrite(Chan *c, void *va, long n, vlong)
141 switch((ulong)c->qid.path){
152 /* always append only */
153 if(t->n > MAXSNARF) /* avoid thrashing when people cut huge text */
154 error("snarf buffer too big");
155 a = realloc(t->buf, t->n + n + 1);
157 error("snarf buffer too big");
159 memmove(t->buf+t->n, va, n);
164 print("conswrite: 0x%llux\n", c->qid.path);