]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/upas/Mail/html.c
upas/fs: fix more locking bugs, remove debugging clutter, remove planb mbox code
[plan9front.git] / sys / src / cmd / upas / Mail / html.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <thread.h>
5 #include <ctype.h>
6 #include <plumb.h>
7 #include "dat.h"
8
9
10 char*
11 formathtml(char *body, int *np)
12 {
13         int i, j, p[2], q[2];
14         Exec *e;
15         char buf[1024];
16         Channel *sync;
17
18         e = emalloc(sizeof(struct Exec));
19         if(pipe(p) < 0 || pipe(q) < 0)
20                 error("can't create pipe: %r");
21
22         e->p[0] = p[0];
23         e->p[1] = p[1];
24         e->q[0] = q[0];
25         e->q[1] = q[1];
26         e->argv = emalloc(3*sizeof(char*));
27         e->argv[0] = estrdup("htmlfmt");
28         e->argv[1] = estrdup("-cutf-8");
29         e->argv[2] = nil;
30         e->prog = "/bin/htmlfmt";
31         sync = chancreate(sizeof(int), 0);
32         e->sync = sync;
33         proccreate(execproc, e, EXECSTACK);
34         recvul(sync);
35         close(p[0]);
36         close(q[1]);
37
38         if((i=write(p[1], body, *np)) != *np){
39                 fprint(2, "Mail: warning: htmlfmt failed: wrote %d of %d: %r\n", i, *np);
40                 close(p[1]);
41                 close(q[0]);
42                 return body;
43         }
44         close(p[1]);
45
46         free(body);
47         body = nil;
48         i = 0;
49         for(;;){
50                 j = read(q[0], buf, sizeof buf);
51                 if(j <= 0)
52                         break;
53                 body = realloc(body, i+j+1);
54                 if(body == nil)
55                         error("realloc failed: %r");
56                 memmove(body+i, buf, j);
57                 i += j;
58                 body[i] = '\0';
59         }
60         close(q[0]);
61
62         *np = i;
63         return body;
64 }
65
66 char*
67 readbody(char *type, char *dir, int *np)
68 {
69         char *body;
70         
71         body = readfile(dir, "body", np);
72         if(body != nil && strcmp(type, "text/html") == 0)
73                 return formathtml(body, np);
74         return body;
75 }