about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-04-12 16:43:08 -0400
committerJune McEnroe <june@causal.agency>2020-04-12 16:43:08 -0400
commitc5db1246fbafe62fc125f13664dd0e10204aa0b1 (patch)
treeb05e2bc24a392a61e07b9d8594ea2c17f821de5e
parentAvoid mutating header/body for mbox output (diff)
downloadbubger-c5db1246fbafe62fc125f13664dd0e10204aa0b1.tar.gz
bubger-c5db1246fbafe62fc125f13664dd0e10204aa0b1.zip
Factor out path functions
-rw-r--r--archive.h23
-rw-r--r--concat.c49
-rw-r--r--export.c32
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