diff options
author | June McEnroe <june@causal.agency> | 2020-04-12 16:10:38 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-04-12 16:19:34 -0400 |
commit | 1a4c574a4d7964761cdd7e1c917cbba32124d0f7 (patch) | |
tree | 43935973bee0cf6a143ac4440d1d999eb240204e | |
parent | Fetch and parse BODYSTRUCTURE (diff) | |
download | bubger-1a4c574a4d7964761cdd7e1c917cbba32124d0f7.tar.gz bubger-1a4c574a4d7964761cdd7e1c917cbba32124d0f7.zip |
Avoid mutating header/body for mbox output
-rw-r--r-- | archive.h | 4 | ||||
-rw-r--r-- | mbox.c | 33 |
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); } |