diff options
-rw-r--r-- | notemap.c | 27 |
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; |