#include #include #include #include #include #include #include "page.h" void* emalloc(int sz) { void *v; v = malloc(sz); if(v == nil) { fprint(2, "out of memory allocating %d\n", sz); wexits("mem"); } memset(v, 0, sz); return v; } void* erealloc(void *v, int sz) { v = realloc(v, sz); if(v == nil) { fprint(2, "out of memory allocating %d\n", sz); wexits("mem"); } return v; } char* estrdup(char *s) { char *t; if((t = strdup(s)) == nil) { fprint(2, "out of memory in strdup(%.10s)\n", s); wexits("mem"); } return t; } /* * spool standard input to /tmp. * we've already read the initial in bytes into ibuf. */ int spooltodisk(uchar *ibuf, int in, char **name) { uchar buf[8192]; int fd, n; strcpy(tempfile, "/tmp/pagespoolXXXXXXXXX"); fd = opentemp(tempfile, ORDWR); if(name) *name = estrdup(tempfile); if(write(fd, ibuf, in) != in){ fprint(2, "error writing temporary file\n"); wexits("write temp"); } while((n = read(stdinfd, buf, sizeof buf)) > 0){ if(write(fd, buf, n) != n){ fprint(2, "error writing temporary file\n"); wexits("write temp0"); } } seek(fd, 0, 0); return fd; } typedef struct StdinArg StdinArg; struct StdinArg { Channel *cp; uchar *ibuf; int in; }; /* * spool standard input into a pipe. * we've already ready the first in bytes into ibuf */ static void _stdinpipe(void *a) { uchar buf[8192]; StdinArg *arg; int p[2]; int n; arg = a; if(pipe(p) < 0){ fprint(2, "pipe fails: %r\n"); wexits("pipe"); } send(arg->cp, &p[0]); write(p[1], arg->ibuf, arg->in); while((n = read(stdinfd, buf, sizeof buf)) > 0) write(p[1], buf, n); close(p[1]); threadexits(0); } int stdinpipe(uchar *ibuf, int in) { StdinArg arg; int fd; arg.ibuf = ibuf; arg.in = in; arg.cp = chancreate(sizeof(int), 0); proccreate(_stdinpipe, &arg, mainstacksize); recv(arg.cp, &fd); chanfree(arg.cp); return fd; }