xref: /plan9/acme/mail/src/html.c (revision 95fdf19ce7a8b273bf38b8060fb3ebbec5fd23fc)
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