Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <event.h>
5 #include <bio.h>
6 #include "page.h"
8 void*
9 emalloc(int sz)
10 {
11 void *v;
12 v = malloc(sz);
13 if(v == nil) {
14 fprint(2, "out of memory allocating %d\n", sz);
15 wexits("mem");
16 }
17 memset(v, 0, sz);
18 return v;
19 }
21 void*
22 erealloc(void *v, int sz)
23 {
24 v = realloc(v, sz);
25 if(v == nil) {
26 fprint(2, "out of memory allocating %d\n", sz);
27 wexits("mem");
28 }
29 return v;
30 }
32 char*
33 estrdup(char *s)
34 {
35 char *t;
36 if((t = strdup(s)) == nil) {
37 fprint(2, "out of memory in strdup(%.10s)\n", s);
38 wexits("mem");
39 }
40 return t;
41 }
43 int
44 opentemp(char *template)
45 {
46 int fd, i;
47 char *p;
49 p = estrdup(template);
50 fd = -1;
51 for(i=0; i<10; i++){
52 mktemp(p);
53 if(access(p, 0) < 0 && (fd=create(p, ORDWR|ORCLOSE, 0400)) >= 0)
54 break;
55 strcpy(p, template);
56 }
57 if(fd < 0){
58 fprint(2, "couldn't make temporary file\n");
59 wexits("Ecreat");
60 }
61 strcpy(template, p);
62 free(p);
64 return fd;
65 }
67 /*
68 * spool standard input to /tmp.
69 * we've already read the initial in bytes into ibuf.
70 */
71 int
72 spooltodisk(uchar *ibuf, int in, char **name)
73 {
74 uchar buf[8192];
75 int fd, n;
76 char temp[40];
78 strcpy(temp, "/tmp/pagespoolXXXXXXXXX");
79 fd = opentemp(temp);
80 if(name)
81 *name = estrdup(temp);
83 if(write(fd, ibuf, in) != in){
84 fprint(2, "error writing temporary file\n");
85 wexits("write temp");
86 }
88 while((n = read(stdinfd, buf, sizeof buf)) > 0){
89 if(write(fd, buf, n) != n){
90 fprint(2, "error writing temporary file\n");
91 wexits("write temp0");
92 }
93 }
94 seek(fd, 0, 0);
95 return fd;
96 }
98 /*
99 * spool standard input into a pipe.
100 * we've already ready the first in bytes into ibuf
101 */
102 int
103 stdinpipe(uchar *ibuf, int in)
105 uchar buf[8192];
106 int n;
107 int p[2];
108 if(pipe(p) < 0){
109 fprint(2, "pipe fails: %r\n");
110 wexits("pipe");
113 switch(rfork(RFPROC|RFFDG)){
114 case -1:
115 fprint(2, "fork fails: %r\n");
116 wexits("fork");
117 default:
118 close(p[1]);
119 return p[0];
120 case 0:
121 break;
124 close(p[0]);
125 write(p[1], ibuf, in);
126 while((n = read(stdinfd, buf, sizeof buf)) > 0)
127 write(p[1], buf, n);
129 _exits(0);
130 return -1; /* not reached */