diff options
Diffstat (limited to 'acme/bin/source/win/_fs.c')
-rw-r--r-- | acme/bin/source/win/_fs.c | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/acme/bin/source/win/_fs.c b/acme/bin/source/win/_fs.c deleted file mode 100644 index 6791a21f2..000000000 --- a/acme/bin/source/win/_fs.c +++ /dev/null @@ -1,146 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> -#include <thread.h> -#include <9p.h> -#include "dat.h" - -Channel *fschan; -Channel *writechan; - -static File *devcons, *devnew; - -static void -fsread(Req *r) -{ - Fsevent e; - - if(r->fid->file == devnew){ - if(r->fid->aux==nil){ - respond(r, "phase error"); - return; - } - readstr(r, r->fid->aux); - respond(r, nil); - return; - } - - assert(r->fid->file == devcons); - e.type = 'r'; - e.r = r; - send(fschan, &e); -} - -static void -fsflush(Req *r) -{ - Fsevent e; - - e.type = 'f'; - e.r = r; - send(fschan, &e); -} - -static void -fswrite(Req *r) -{ - static Event *e[4]; - Event *ep; - int i, j, nb, wid, pid; - Rune rune; - char *s; - char tmp[UTFmax], *t; - static int n, partial; - - if(r->fid->file == devnew){ - if(r->fid->aux){ - respond(r, "already created a window"); - return; - } - s = emalloc(r->ifcall.count+1); - memmove(s, r->ifcall.data, r->ifcall.count); - s[r->ifcall.count] = 0; - pid = strtol(s, &t, 0); - if(*t==' ') - t++; - i = newpipewin(pid, t); - free(s); - s = emalloc(32); - sprint(s, "%lud", (ulong)i); - r->fid->aux = s; - r->ofcall.count = r->ifcall.count; - respond(r, nil); - return; - } - - assert(r->fid->file == devcons); - - if(e[0] == nil){ - for(i=0; i<nelem(e); i++){ - e[i] = emalloc(sizeof(Event)); - e[i]->c1 = 'S'; - } - } - - ep = e[n]; - n = (n+1)%nelem(e); - assert(r->ifcall.count <= 8192); /* is this guaranteed by lib9p? */ - nb = r->ifcall.count; - memmove(ep->b+partial, r->ifcall.data, nb); - nb += partial; - ep->b[nb] = '\0'; - if(strlen(ep->b) < nb){ /* nulls in data */ - t = ep->b; - for(i=j=0; i<nb; i++) - if(ep->b[i] != '\0') - t[j++] = ep->b[i]; - nb = j; - t[j] = '\0'; - } - /* process bytes into runes, transferring terminal partial runes into next buffer */ - for(i=j=0; i<nb && fullrune(ep->b+i, nb-i); i+=wid,j++) - wid = chartorune(&rune, ep->b+i); - memmove(tmp, ep->b+i, nb-i); - partial = nb-i; - ep->nb = i; - ep->nr = j; - ep->b[i] = '\0'; - if(i != 0){ - sendp(win->cevent, ep); - recvp(writechan); - } - partial = nb-i; - memmove(e[n]->b, tmp, partial); - r->ofcall.count = r->ifcall.count; - respond(r, nil); -} - -void -fsdestroyfid(Fid *fid) -{ - if(fid->aux) - free(fid->aux); -} - -Srv fs = { -.read= fsread, -.write= fswrite, -.flush= fsflush, -.destroyfid= fsdestroyfid, -.leavefdsopen= 1, -}; - -void -mountcons(void) -{ - fschan = chancreate(sizeof(Fsevent), 0); - writechan = chancreate(sizeof(void*), 0); - fs.tree = alloctree("win", "win", DMDIR|0555, nil); - devcons = createfile(fs.tree->root, "cons", "win", 0666, nil); - if(devcons == nil) - sysfatal("creating /dev/cons: %r"); - devnew = createfile(fs.tree->root, "wnew", "win", 0666, nil); - if(devnew == nil) - sysfatal("creating /dev/wnew: %r"); - threadpostmountsrv(&fs, nil, "/dev", MBEFORE); -} |