Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <thread.h>
5 #include <bio.h>
6 #include <cursor.h>
7 #include "page.h"
9 void*
10 emalloc(int sz)
11 {
12 void *v;
13 v = malloc(sz);
14 if(v == nil) {
15 fprint(2, "out of memory allocating %d\n", sz);
16 wexits("mem");
17 }
18 memset(v, 0, sz);
19 return v;
20 }
22 void*
23 erealloc(void *v, int sz)
24 {
25 v = realloc(v, sz);
26 if(v == nil) {
27 fprint(2, "out of memory allocating %d\n", sz);
28 wexits("mem");
29 }
30 return v;
31 }
33 char*
34 estrdup(char *s)
35 {
36 char *t;
37 if((t = strdup(s)) == nil) {
38 fprint(2, "out of memory in strdup(%.10s)\n", s);
39 wexits("mem");
40 }
41 return t;
42 }
44 /*
45 * spool standard input to /tmp.
46 * we've already read the initial in bytes into ibuf.
47 */
48 int
49 spooltodisk(uchar *ibuf, int in, char **name)
50 {
51 uchar buf[8192];
52 int fd, n;
54 strcpy(tempfile, "/tmp/pagespoolXXXXXXXXX");
55 fd = opentemp(tempfile, ORDWR);
56 if(name)
57 *name = estrdup(tempfile);
59 if(write(fd, ibuf, in) != in){
60 fprint(2, "error writing temporary file\n");
61 wexits("write temp");
62 }
64 while((n = read(stdinfd, buf, sizeof buf)) > 0){
65 if(write(fd, buf, n) != n){
66 fprint(2, "error writing temporary file\n");
67 wexits("write temp0");
68 }
69 }
70 seek(fd, 0, 0);
71 return fd;
72 }
74 typedef struct StdinArg StdinArg;
76 struct StdinArg {
77 Channel *cp;
78 uchar *ibuf;
79 int in;
80 };
82 /*
83 * spool standard input into a pipe.
84 * we've already ready the first in bytes into ibuf
85 */
86 static void
87 _stdinpipe(void *a)
88 {
89 uchar buf[8192];
90 StdinArg *arg;
91 int p[2];
92 int n;
94 arg = a;
96 if(pipe(p) < 0){
97 fprint(2, "pipe fails: %r\n");
98 wexits("pipe");
99 }
101 send(arg->cp, &p[0]);
103 write(p[1], arg->ibuf, arg->in);
104 while((n = read(stdinfd, buf, sizeof buf)) > 0)
105 write(p[1], buf, n);
107 close(p[1]);
108 threadexits(0);
111 int
112 stdinpipe(uchar *ibuf, int in) {
113 StdinArg arg;
114 int fd;
116 arg.ibuf = ibuf;
117 arg.in = in;
118 arg.cp = chancreate(sizeof(int), 0);
119 proccreate(_stdinpipe, &arg, mainstacksize);
120 recv(arg.cp, &fd);
121 chanfree(arg.cp);
123 return fd;