summary refs log tree commit diff
path: root/concat.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--concat.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/concat.c b/concat.c
index 3e0dec6..c59a828 100644
--- a/concat.c
+++ b/concat.c
@@ -27,7 +27,6 @@
 
 #include <err.h>
 #include <inttypes.h>
-#include <limits.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -82,8 +81,7 @@ void concatData(
 	errx(EX_TEMPFAIL, "no thread with root UID %" PRIu32, uid);
 }
 
-static const char *uidPath(uint32_t uid, const char *type) {
-	static char buf[PATH_MAX];
+static char *uidPath(uint32_t uid, const char *type) {
 	char str[32];
 	snprintf(str, sizeof(str), "%" PRIu32, uid);
 	struct Variable vars[] = {
@@ -91,18 +89,18 @@ static const char *uidPath(uint32_t uid, const char *type) {
 		{ "type", type },
 		{0},
 	};
-	templateBuffer(buf, sizeof(buf), PATH_UID, vars, escapePath);
-	return buf;
+	return templateString(PATH_UID, vars, escapePath);
 }
 
 static time_t uidNewest(struct List uids, const char *type) {
 	time_t newest = 0;
 	for (size_t i = 0; i < uids.len; ++i) {
-		const char *path = uidPath(dataCheck(uids.ptr[i], Number).number, type);
+		char *path = uidPath(dataCheck(uids.ptr[i], Number).number, type);
 		struct stat status;
 		int error = stat(path, &status);
 		if (error) err(EX_DATAERR, "%s", path);
 		if (status.st_mtime > newest) newest = status.st_mtime;
+		free(path);
 	}
 	return newest;
 }
@@ -129,22 +127,22 @@ static int concatHTML(FILE *file, struct List thread) {
 				|| htmlSubthreadClose(file);
 		} else {
 			uint32_t uid = dataCheck(thread.ptr[i], Number).number;
-			error = concatFile(file, uidPath(uid, "html"));
+			char *path = uidPath(uid, "html");
+			error = concatFile(file, path);
+			free(path);
 		}
 		if (error) return error;
 	}
 	return 0;
 }
 
-static const char *threadPath(const char *messageID, const char *type) {
-	static char buf[PATH_MAX];
+static char *threadPath(const char *messageID, const char *type) {
 	struct Variable vars[] = {
 		{ "messageID", messageID },
 		{ "type", type },
 		{0},
 	};
-	templateBuffer(buf, sizeof(buf), PATH_THREAD, vars, escapePath);
-	return buf;
+	return templateString(PATH_THREAD, vars, escapePath);
 }
 
 const char *concatHead;
@@ -155,7 +153,7 @@ static void concatThread(struct List thread, const struct Envelope *envelope) {
 
 	int error;
 	FILE *file;
-	const char *path;
+	char *path;
 	struct stat status;
 
 	path = threadPath(envelope->messageID, "mbox");
@@ -166,13 +164,16 @@ static void concatThread(struct List thread, const struct Envelope *envelope) {
 
 		for (size_t i = 0; i < flat.len; ++i) {
 			uint32_t uid = dataCheck(flat.ptr[i], Number).number;
-			error = concatFile(file, uidPath(uid, "mbox"));
+			char *src = uidPath(uid, "mbox");
+			error = concatFile(file, src);
 			if (error) err(EX_IOERR, "%s", path);
+			free(src);
 		}
 
 		error = fclose(file);
 		if (error) err(EX_IOERR, "%s", path);
 	}
+	free(path);
 
 	path = threadPath(envelope->messageID, "atom");
 	error = stat(path, &status);
@@ -185,13 +186,16 @@ static void concatThread(struct List thread, const struct Envelope *envelope) {
 
 		for (size_t i = 0; i < flat.len; ++i) {
 			uint32_t uid = dataCheck(flat.ptr[i], Number).number;
-			error = concatFile(file, uidPath(uid, "atom"));
+			char *src = uidPath(uid, "atom");
+			error = concatFile(file, src);
 			if (error) err(EX_IOERR, "%s", path);
+			free(src);
 		}
 
 		error = atomThreadClose(file) || fclose(file);
 		if (error) err(EX_IOERR, "%s", path);
 	}
+	free(path);
 
 	path = threadPath(envelope->messageID, "html");
 	error = stat(path, &status);
@@ -214,6 +218,7 @@ static void concatThread(struct List thread, const struct Envelope *envelope) {
 			|| fclose(file);
 		if (error) err(EX_IOERR, "%s", path);
 	}
+	free(path);
 
 	listFree(flat);
 }
@@ -252,8 +257,10 @@ void concatIndex(struct List threads, const struct Envelope *envelopes) {
 	listFlatten(&flat, threads);
 	for (size_t i = flat.len - 1; i < flat.len; --i) {
 		uint32_t uid = dataCheck(flat.ptr[i], Number).number;
-		error = concatFile(file, uidPath(uid, "atom"));
+		char *src = uidPath(uid, "atom");
+		error = concatFile(file, src);
 		if (error) err(EX_IOERR, "%s", path);
+		free(src);
 	}
 	listFree(flat);
 
@@ -265,9 +272,10 @@ void concatIndex(struct List threads, const struct Envelope *envelopes) {
 
 	for (size_t i = 0; i < threads.len; ++i) {
 		struct stat status;
-		const char *path = threadPath(envelopes[i].messageID, "html");
+		char *path = threadPath(envelopes[i].messageID, "html");
 		int error = stat(path, &status);
 		if (error) err(EX_DATAERR, "%s", path);
+		free(path);
 
 		order[i].index = i;
 		order[i].created = envelopes[i].time;