about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-04-12 16:10:38 -0400
committerJune McEnroe <june@causal.agency>2020-04-12 16:19:34 -0400
commit1a4c574a4d7964761cdd7e1c917cbba32124d0f7 (patch)
tree43935973bee0cf6a143ac4440d1d999eb240204e
parentFetch and parse BODYSTRUCTURE (diff)
downloadbubger-1a4c574a4d7964761cdd7e1c917cbba32124d0f7.tar.gz
bubger-1a4c574a4d7964761cdd7e1c917cbba32124d0f7.zip
Avoid mutating header/body for mbox output
-rw-r--r--archive.h4
-rw-r--r--mbox.c33
2 files changed, 19 insertions, 18 deletions
diff --git a/archive.h b/archive.h
index 820ca37..8fd9693 100644
--- a/archive.h
+++ b/archive.h
@@ -145,8 +145,8 @@ char *templateURL(const char *template, const struct Variable vars[]);
 	"MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding"
 
 int mboxFrom(FILE *file);
-int mboxHeader(FILE *file, char *header);
-int mboxBody(FILE *file, char *body);
+int mboxHeader(FILE *file, const char *header);
+int mboxBody(FILE *file, const char *body);
 
 int htmlMessageHead(FILE *file, const struct Envelope *envelope);
 int htmlMessageTail(FILE *file);
diff --git a/mbox.c b/mbox.c
index f8684de..3412129 100644
--- a/mbox.c
+++ b/mbox.c
@@ -27,28 +27,29 @@ int mboxFrom(FILE *file) {
 	return (n < 0 ? n : 0);
 }
 
-int mboxHeader(FILE *file, char *header) {
-	for (char *crlf; (crlf = strstr(header, "\r\n")); header = &crlf[2]) {
-		*crlf = '\0';
-		int n = fprintf(file, "%s\n", header);
-		if (n < 0) return n;
+int mboxHeader(FILE *file, const char *header) {
+	for (const char *crlf; (crlf = strstr(header, "\r\n")); header = &crlf[2]) {
+		if (crlf - header) {
+			size_t n = fwrite(header, crlf - header, 1, file);
+			if (!n) return -1;
+		}
+		if (fprintf(file, "\n") < 0) return -1;
 	}
 	return 0;
 }
 
-int mboxBody(FILE *file, char *body) {
-	int n;
-	for (char *crlf; (crlf = strstr(body, "\r\n")); body = &crlf[2]) {
-		*crlf = '\0';
-		char *from = body;
+int mboxBody(FILE *file, const char *body) {
+	for (const char *crlf; (crlf = strstr(body, "\r\n")); body = &crlf[2]) {
+		const char *from = body;
 		while (*from == '>') from++;
 		if (!strncmp(from, "From ", 5)) {
-			n = fprintf(file, ">%s\n", body);
-		} else {
-			n = fprintf(file, "%s\n", body);
+			if (fprintf(file, ">") < 0) return -1;
+		}
+		if (crlf - body) {
+			size_t n = fwrite(body, crlf - body, 1, file);
+			if (!n) return -1;
 		}
-		if (n < 0) return n;
+		if (fprintf(file, "\n") < 0) return -1;
 	}
-	n = fprintf(file, "\n");
-	return (n < 0 ? n : 0);
+	return (fprintf(file, "\n" ) < 0 ? -1 : 0);
 }