shithub: Nail

Download patch

ref: f07f9eee353fe4e8407878fd16e42cc7485cf45b
parent: 04958e2fa0963c0787388f06733cd9a0d5b0661f
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Nov 3 23:59:14 EST 2020

htmlfmt html messages

--- a/comp.c
+++ b/comp.c
@@ -43,14 +43,13 @@
 		fprint(2, "open body: %r\n");
 		return;
 	}
-	if(pipe(c->fd) == -1){
-		fprint(2, "pipe: %r\n");
-		close(fd);
-		return;
-	}
+	if(pipe(c->fd) == -1)
+		sysfatal("pipe: %r\n");
 
+	c->sync = chancreate(sizeof(ulong), 0);
 	proccreate(execmarshal, c, Stack);
 	recvul(c->sync);
+	chanfree(c->sync);
 	close(c->fd[0]);
 
 	buf = emalloc(Bufsz);
@@ -142,7 +141,6 @@
 	int i;
 
 	c = emalloc(sizeof(Comp));
-	c->sync = chancreate(sizeof(ulong), 0);
 	if(r != nil)
 		path = esmprint("%s%s%s.%d", mbox.path, r->name, "Reply", ncompose++);
 	else
--- a/mail.h
+++ b/mail.h
@@ -84,6 +84,11 @@
 	Mesg	*hnext;
 	char	quitting;
 
+	/* exec setup */
+	Channel *sync;
+	char	*path;
+	int	fd[2];
+
 	Mesg	*parent;
 	Mesg	**child;
 	int	nchild;
--- a/mesg.c
+++ b/mesg.c
@@ -174,6 +174,34 @@
 }
 
 static void
+execfmt(void *pm)
+{
+	Mesg *m;
+
+	m = pm;
+	rfork(RFFDG);
+	dup(m->fd[1], 1);
+	close(m->fd[0]);
+	close(m->fd[1]);
+	sendul(m->sync, 0);
+	procexecl(nil, "/bin/htmlfmt", "-a", "-cutf-8", m->path, nil);
+}
+
+static int
+htmlfmt(Mesg *m, char *path)
+{
+	if(pipe(m->fd) == -1)
+		sysfatal("pipe: %r");
+	m->sync = chancreate(sizeof(ulong), 0);
+	m->path = path;
+	proccreate(execfmt, m, Stack);
+	recvul(m->sync);
+	chanfree(m->sync);
+	close(m->fd[1]);
+	return m->fd[0];
+}
+
+static void
 copy(int wfd, int rfd)
 {
 	char *buf;
@@ -205,8 +233,8 @@
 
 	b = readparts(m);
 	path = estrjoin(mbox.path, b->name, "body", nil);
-	if(strcmp(b->type, "text/html"))
-		rfd = open(path, OREAD);//htmlfmt(path);
+	if(strcmp(b->type, "text/html") == 0)
+		rfd = htmlfmt(m, path);
 	else
 		rfd = open(path, OREAD);
 	free(path);
@@ -216,11 +244,16 @@
 	}
 
 	home = getenv("home");
+	if(m->nattachments != 0)
+		fprint(wfd, "\n\n");
 	for(i = 0; i < m->nattachments; i++){
 		a = m->attachments[i];
 		if(a == b)
 			continue;
-		fprint(wfd, "===> %s (%s)\n", a->name, a->type);
+		name = a->name;
+		if(strncmp(a->name, m->name, strlen(m->name)) == 0)
+			name += strlen(m->name);
+		fprint(wfd, "===> %s (%s)\n", name, a->type);
 		if(a->disposition != nil && strcmp(a->disposition, "inline") == 0){
 			path = estrjoin(mbox.path, b->name, "body", nil);
 			if((rfd = open(path, OREAD)) != -1){