ref: 04c4a9ca8b06e34a203f7ddacc2263cf2077e1aa
dir: /sys/src/cmd/upas/Mail/html.c/
#include <u.h> #include <libc.h> #include <bio.h> #include <thread.h> #include <ctype.h> #include <plumb.h> #include "dat.h" char* formathtml(char *body, int *np) { int i, j, p[2], q[2]; Exec *e; char buf[1024]; e = emalloc(sizeof(Exec)); if(pipe(p) < 0 || pipe(q) < 0) error("can't create pipe: %r"); e->p[0] = p[0]; e->p[1] = p[1]; e->q[0] = q[0]; e->q[1] = q[1]; e->argv = emalloc(4*sizeof(char*)); e->argv[0] = estrdup("htmlfmt"); e->argv[1] = estrdup("-a"); e->argv[2] = estrdup("-cutf-8"); e->argv[3] = nil; e->prog = "/bin/htmlfmt"; e->sync = chancreate(sizeof(int), 0); proccreate(execproc, e, EXECSTACK); recvul(e->sync); close(p[0]); close(q[1]); if((i=write(p[1], body, *np)) != *np){ fprint(2, "Mail: warning: htmlfmt failed: wrote %d of %d: %r\n", i, *np); close(p[1]); close(q[0]); return body; } close(p[1]); free(body); body = nil; i = 0; for(;;){ j = read(q[0], buf, sizeof buf); if(j <= 0) break; body = realloc(body, i+j+1); if(body == nil) error("realloc failed: %r"); memmove(body+i, buf, j); i += j; body[i] = '\0'; } close(q[0]); *np = i; return body; } char* readbody(char *type, char *dir, int *np) { char *body; body = readfile(dir, "body", np); if(body != nil && strcmp(type, "text/html") == 0) return formathtml(body, np); return body; }