19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <bio.h>
49a747e4fSDavid du Colombier #include <thread.h>
59a747e4fSDavid du Colombier #include <ctype.h>
69a747e4fSDavid du Colombier #include <plumb.h>
79a747e4fSDavid du Colombier #include "dat.h"
89a747e4fSDavid du Colombier
99a747e4fSDavid du Colombier
109a747e4fSDavid du Colombier char*
formathtml(char * body,int * np)119a747e4fSDavid du Colombier formathtml(char *body, int *np)
129a747e4fSDavid du Colombier {
139a747e4fSDavid du Colombier int i, j, p[2], q[2];
149a747e4fSDavid du Colombier Exec *e;
159a747e4fSDavid du Colombier char buf[1024];
169a747e4fSDavid du Colombier Channel *sync;
179a747e4fSDavid du Colombier
189a747e4fSDavid du Colombier e = emalloc(sizeof(struct Exec));
199a747e4fSDavid du Colombier if(pipe(p) < 0 || pipe(q) < 0)
209a747e4fSDavid du Colombier error("can't create pipe: %r");
219a747e4fSDavid du Colombier
229a747e4fSDavid du Colombier e->p[0] = p[0];
239a747e4fSDavid du Colombier e->p[1] = p[1];
249a747e4fSDavid du Colombier e->q[0] = q[0];
259a747e4fSDavid du Colombier e->q[1] = q[1];
26d9306527SDavid du Colombier e->argv = emalloc(3*sizeof(char*));
279a747e4fSDavid du Colombier e->argv[0] = estrdup("htmlfmt");
28d9306527SDavid du Colombier e->argv[1] = estrdup("-cutf-8");
29d9306527SDavid du Colombier e->argv[2] = nil;
309a747e4fSDavid du Colombier e->prog = "/bin/htmlfmt";
319a747e4fSDavid du Colombier sync = chancreate(sizeof(int), 0);
329a747e4fSDavid du Colombier e->sync = sync;
339a747e4fSDavid du Colombier proccreate(execproc, e, EXECSTACK);
349a747e4fSDavid du Colombier recvul(sync);
359a747e4fSDavid du Colombier close(p[0]);
369a747e4fSDavid du Colombier close(q[1]);
379a747e4fSDavid du Colombier
389a747e4fSDavid du Colombier if((i=write(p[1], body, *np)) != *np){
399a747e4fSDavid du Colombier fprint(2, "Mail: warning: htmlfmt failed: wrote %d of %d: %r\n", i, *np);
409a747e4fSDavid du Colombier close(p[1]);
419a747e4fSDavid du Colombier close(q[0]);
429a747e4fSDavid du Colombier return body;
439a747e4fSDavid du Colombier }
449a747e4fSDavid du Colombier close(p[1]);
459a747e4fSDavid du Colombier
469a747e4fSDavid du Colombier free(body);
479a747e4fSDavid du Colombier body = nil;
489a747e4fSDavid du Colombier i = 0;
499a747e4fSDavid du Colombier for(;;){
509a747e4fSDavid du Colombier j = read(q[0], buf, sizeof buf);
519a747e4fSDavid du Colombier if(j <= 0)
529a747e4fSDavid du Colombier break;
539a747e4fSDavid du Colombier body = realloc(body, i+j+1);
549a747e4fSDavid du Colombier if(body == nil)
559a747e4fSDavid du Colombier error("realloc failed: %r");
569a747e4fSDavid du Colombier memmove(body+i, buf, j);
579a747e4fSDavid du Colombier i += j;
589a747e4fSDavid du Colombier body[i] = '\0';
599a747e4fSDavid du Colombier }
609a747e4fSDavid du Colombier close(q[0]);
619a747e4fSDavid du Colombier
629a747e4fSDavid du Colombier *np = i;
639a747e4fSDavid du Colombier return body;
649a747e4fSDavid du Colombier }
659a747e4fSDavid du Colombier
669a747e4fSDavid du Colombier char*
readbody(char * type,char * dir,int * np)679a747e4fSDavid du Colombier readbody(char *type, char *dir, int *np)
689a747e4fSDavid du Colombier {
699a747e4fSDavid du Colombier char *body;
709a747e4fSDavid du Colombier
719a747e4fSDavid du Colombier body = readfile(dir, "body", np);
72*95fdf19cSDavid du Colombier if(body != nil && strcmp(type, "text/html") == 0)
739a747e4fSDavid du Colombier return formathtml(body, np);
749a747e4fSDavid du Colombier return body;
759a747e4fSDavid du Colombier }
76