|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <thread.h> | 
|  | #include <bio.h> | 
|  | #include <cursor.h> | 
|  | #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; | 
|  | } |