about summary refs log tree commit diff
path: root/concat.c
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 /concat.c
parentAvoid mutating header/body for mbox output (diff)
downloadbubger-c5db1246fbafe62fc125f13664dd0e10204aa0b1.tar.gz
bubger-c5db1246fbafe62fc125f13664dd0e10204aa0b1.zip
Factor out path functions
Diffstat (limited to 'concat.c')
-rw-r--r--concat.c49
1 files changed, 19 insertions, 30 deletions
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);