diff options
-rw-r--r-- | archive.h | 23 | ||||
-rw-r--r-- | concat.c | 49 | ||||
-rw-r--r-- | export.c | 32 |
3 files changed, 53 insertions, 51 deletions
diff --git a/archive.h b/archive.h index 8fd9693..e9d4648 100644 --- a/archive.h +++ b/archive.h @@ -14,6 +14,9 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ +#include <inttypes.h> +#include <limits.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <time.h> @@ -139,6 +142,26 @@ int templateRender( ); char *templateURL(const char *template, const struct Variable vars[]); +static inline char * +pathUID(char path[static PATH_MAX], uint32_t uid, const char *type) { + snprintf(path, PATH_MAX, "UID/%" PRIu32 ".%s", uid, type); + return path; +} + +static inline char *pathMessage( + char path[static PATH_MAX], const char *messageID, const char *type +) { + snprintf(path, PATH_MAX, "message/%s.%s", messageID, type); + return path; +} + +static inline char *pathThread( + char path[static PATH_MAX], const char *messageID, const char *type +) { + snprintf(path, PATH_MAX, "thread/%s.%s", messageID, type); + return path; +} + #define MBOX_HEADERS \ "Date Subject From Sender Reply-To To Cc Bcc " \ "Message-Id In-Reply-To References " \ diff --git a/concat.c b/concat.c index eeab073..a2b767a 100644 --- a/concat.c +++ b/concat.c @@ -52,23 +52,11 @@ void concatFetch(FILE *imap, enum Atom tag, struct List threads) { fprintf(imap, " (UID ENVELOPE)\r\n"); } -static const char *uidPath(uint32_t uid, const char *type) { - static char buf[PATH_MAX]; - snprintf(buf, sizeof(buf), "UID/%" PRIu32 ".%s", uid, type); - return buf; -} - -static const char *threadPath(const char *messageID, const char *type) { - static char buf[PATH_MAX]; - snprintf(buf, sizeof(buf), "thread/%s.%s", messageID, type); - return buf; -} - static time_t uidNewest(struct List uids, const char *type) { + char path[PATH_MAX]; time_t newest = 0; for (size_t i = 0; i < uids.len; ++i) { - uint32_t uid = dataCheck(uids.ptr[i], Number).number; - const char *path = uidPath(uid, type); + pathUID(path, dataCheck(uids.ptr[i], Number).number, type); struct stat file; int error = stat(path, &file); if (error) err(EX_DATAERR, "%s", path); @@ -111,43 +99,44 @@ void concatData(struct List threads, struct List items) { listFlatten(&flat, thread); int error; - const char *path; struct stat file; + char dst[PATH_MAX]; + char src[PATH_MAX]; - path = threadPath(envelope.messageID, "mbox"); - error = stat(path, &file); + pathThread(dst, envelope.messageID, "mbox"); + error = stat(dst, &file); if (error || file.st_mtime < uidNewest(flat, "mbox")) { - FILE *mbox = fopen(path, "w"); - if (!mbox) err(EX_CANTCREAT, "%s", path); + FILE *mbox = fopen(dst, "w"); + if (!mbox) err(EX_CANTCREAT, "%s", dst); for (size_t i = 0; i < flat.len; ++i) { uint32_t uid = dataCheck(flat.ptr[i], Number).number; - error = concatFile(mbox, uidPath(uid, "mbox")); - if (error) err(EX_IOERR, "%s", path); + error = concatFile(mbox, pathUID(src, uid, "mbox")); + if (error) err(EX_IOERR, "%s", dst); } error = fclose(mbox); - if (error) err(EX_IOERR, "%s", path); + if (error) err(EX_IOERR, "%s", dst); } - path = threadPath(envelope.messageID, "atom"); - error = stat(path, &file); + pathThread(dst, envelope.messageID, "atom"); + error = stat(dst, &file); if (error || file.st_mtime < uidNewest(flat, "atom")) { - FILE *atom = fopen(path, "w"); - if (!atom) err(EX_CANTCREAT, "%s", path); + FILE *atom = fopen(dst, "w"); + if (!atom) err(EX_CANTCREAT, "%s", dst); error = atomFeedHead(atom, &envelope); - if (error) err(EX_IOERR, "%s", path); + if (error) err(EX_IOERR, "%s", dst); for (size_t i = 0; i < flat.len; ++i) { uint32_t uid = dataCheck(flat.ptr[i], Number).number; - error = concatFile(atom, uidPath(uid, "atom")); - if (error) err(EX_IOERR, "%s", path); + error = concatFile(atom, pathUID(src, uid, "atom")); + if (error) err(EX_IOERR, "%s", dst); } error = atomFeedTail(atom) || fclose(atom); - if (error) err(EX_IOERR, "%s", path); + if (error) err(EX_IOERR, "%s", dst); } listFree(flat); diff --git a/export.c b/export.c index 8fc82d8..9cc4a37 100644 --- a/export.c +++ b/export.c @@ -26,27 +26,16 @@ #include "archive.h" #include "imap.h" -static const char *uidPath(uint32_t uid, const char *type) { - static char buf[PATH_MAX]; - snprintf(buf, sizeof(buf), "UID/%" PRIu32 ".%s", uid, type); - return buf; -} - -static const char *messagePath(const char *messageID, const char *type) { - static char buf[PATH_MAX]; - snprintf(buf, sizeof(buf), "message/%s.%s", messageID, type); - return buf; -} - bool exportFetch(FILE *imap, enum Atom tag, struct List threads) { struct List uids = {0}; listFlatten(&uids, threads); + char path[PATH_MAX]; for (size_t i = uids.len - 1; i < uids.len; --i) { uint32_t uid = dataCheck(uids.ptr[i], Number).number; int error = 0 - || access(uidPath(uid, "atom"), F_OK) - || access(uidPath(uid, "html"), F_OK) - || access(uidPath(uid, "mbox"), F_OK); + || access(pathUID(path, uid, "atom"), F_OK) + || access(pathUID(path, uid, "html"), F_OK) + || access(pathUID(path, uid, "mbox"), F_OK); if (!error) uids.ptr[i] = uids.ptr[--uids.len]; } if (!uids.len) { @@ -69,11 +58,11 @@ bool exportFetch(FILE *imap, enum Atom tag, struct List threads) { static void exportEnvelope( uint32_t uid, struct Envelope *envelope, char *header, char *body ) { - const char *path; - FILE *file; int error; + FILE *file; + char path[PATH_MAX]; - path = uidPath(uid, "mbox"); + pathUID(path, uid, "mbox"); file = fopen(path, "w"); if (!file) err(EX_CANTCREAT, "%s", path); error = 0 @@ -83,12 +72,13 @@ static void exportEnvelope( || fclose(file); if (error) err(EX_IOERR, "%s", path); - const char *dest = messagePath(envelope->messageID, "mbox"); + char dest[PATH_MAX]; + pathMessage(dest, envelope->messageID, "mbox"); unlink(dest); error = link(path, dest); if (error) err(EX_CANTCREAT, "%s", dest); - path = uidPath(uid, "html"); + pathUID(path, uid, "html"); file = fopen(path, "w"); if (!file) err(EX_CANTCREAT, "%s", path); error = 0 @@ -97,7 +87,7 @@ static void exportEnvelope( || fclose(file); if (error) err(EX_IOERR, "%s", path); - path = uidPath(uid, "atom"); + pathUID(path, uid, "atom"); file = fopen(path, "w"); if (!file) err(EX_CANTCREAT, "%s", path); error = 0 |