Blame


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