aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorC. McEnroe <june@causal.agency>2020-05-05 14:05:57 -0400
committerC. McEnroe <june@causal.agency>2020-05-05 14:05:57 -0400
commite235e694cd6f73e7b8f73c4da7c5d2a8fbac4e84 (patch)
treeff4fd502788be7c29fb3ed8674be8a875ed257b6
parentClean up notemap with dataCheck (diff)
downloadnotemap-e235e694cd6f73e7b8f73c4da7c5d2a8fbac4e84.tar.gz
notemap-e235e694cd6f73e7b8f73c4da7c5d2a8fbac4e84.zip
Encode the path as Subject with Q
-rw-r--r--notemap.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/notemap.c b/notemap.c
index b448a2a..61112e5 100644
--- a/notemap.c
+++ b/notemap.c
@@ -153,15 +153,8 @@ static char *format(const char *from, const char *uuid, const char *path) {
localtime(&status.st_mtime)
);
- char subj[78 - (sizeof("Subject: ") - 1)] = {0};
- for (size_t i = 0; i < sizeof(subj) - 1; ++i) {
- if (!path[i]) break;
- subj[i] = (path[i] & 0x80 ? '?' : path[i]);
- }
-
#define HEADERS \
"From: <%s>\r\n" \
- "Subject: %s\r\n" \
"Date: %s\r\n" \
"X-Universally-Unique-Identifier: %s\r\n" \
"X-Uniform-Type-Identifier: com.apple.mail-note\r\n" \
@@ -169,13 +162,15 @@ static char *format(const char *from, const char *uuid, const char *path) {
"MIME-Version: 1.0\r\n" \
"Content-Type: text/plain; charset=\"utf-8\"\r\n" \
"Content-Transfer-Encoding: quoted-printable\r\n" \
- "\r\n"
+ "Subject: =?utf-8?Q?"
+#define HEADERS_END "?=\r\n\r\n"
size_t max = sizeof(HEADERS)
+ strlen(from)
- + strlen(subj)
+ strlen(date)
+ strlen(uuid)
+ + 3 * strlen(path)
+ + sizeof(HEADERS_END)
+ 3 * status.st_size
+ 3 * status.st_size / 76;
char *buf = malloc(max);
@@ -183,8 +178,18 @@ static char *format(const char *from, const char *uuid, const char *path) {
FILE *msg = fmemopen(buf, max, "w");
if (!msg) err(EX_OSERR, "fmemopen");
- fprintf(msg, HEADERS, from, subj, date, uuid);
-#undef HEADERS
+ fprintf(msg, HEADERS, from, date, uuid);
+
+ for (const char *ch = path; *ch; ++ch) {
+ if ((uint8_t)*ch & 0x80) {
+ fprintf(msg, "=%02hhX", (uint8_t)*ch);
+ } else if (*ch == ' ') {
+ fprintf(msg, "_");
+ } else {
+ fprintf(msg, "%c", *ch);
+ }
+ }
+ fprintf(msg, HEADERS_END);
int ch;
int len = 0;