| #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; |
| } |