master ohmu/acme2k / src / cmd / acme / mail / html.c
ohmu  ·  2026-09-21
 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 <9pclient.h>
 8#include "dat.h"
 9
10char*
11formathtml(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 = "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
66char*
67readbody(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}