Blob
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"10 char*11 formathtml(char *body, int *np)12 {13 int i, j, p[2], q[2];14 Exec *e;15 char buf[1024];16 Channel *sync;18 e = emalloc(sizeof(struct Exec));19 if(pipe(p) < 0 || pipe(q) < 0)20 error("can't create pipe: %r");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]);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]);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]);62 *np = i;63 return body;64 }66 char*67 readbody(char *type, char *dir, int *np)68 {69 char *body;71 body = readfile(dir, "body", np);72 if(body != nil && strcmp(type, "text/html") == 0)73 return formathtml(body, np);74 return body;75 }