diff f-demime/main.c @ 0:7e0d08176f32

f-demime starting code
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 06 May 2023 06:14:03 +0000
parents
children 612c4d0df768
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/f-demime/main.c	Sat May 06 06:14:03 2023 +0000
@@ -0,0 +1,100 @@
+/*
+ * This module contains the main() function for f-demime.  The following
+ * functions are called to pass input to further processing:
+ *
+ * begin_new_message(): called after processing a "From " line
+ * message_input_line(): called for all message lines after the "From " line
+ * finish_msg_body(): called when hitting EOF or a new "From " line
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <time.h>
+#include "defs.h"
+
+char *att_filename_buf, *att_filename_base, *att_filename_tail;
+unsigned input_lineno;
+
+static void
+get_attachment_dir()
+{
+	static char varname[] = "FDEMIME_ATT_DIR";
+	char *env, *cp;
+	unsigned dir_name_len;
+	time_t curtime;
+	struct tm *tm;
+
+	env = getenv(varname);
+	if (!env) {
+		fprintf(stderr,
+			"error: required environment variable %s is not set\n",
+			varname);
+		exit(1);
+	}
+	if (!env[0]) {
+		fprintf(stderr,
+			"error: empty string value for %s is not allowed\n",
+			varname);
+		exit(1);
+	}
+	dir_name_len = strlen(env);
+	att_filename_buf = malloc(dir_name_len + 31);	/* Y10K extra margin */
+	if (!att_filename_buf) {
+		fprintf(stderr,
+		"error: unable to malloc buffer for attachment filenames\n");
+		exit(1);
+	}
+	strcpy(att_filename_buf, env);
+	cp = att_filename_buf + dir_name_len;
+	*cp++ = '/';
+	att_filename_base = cp;
+	time(&curtime);
+	tm = gmtime(&curtime);
+	sprintf(cp, "%u%02u%02ua", tm->tm_year + 1900, tm->tm_mon + 1,
+		tm->tm_mday);
+	att_filename_tail = index(cp, '\0');
+}
+
+main(argc, argv)
+	char **argv;
+{
+	char linebuf[LINE_BUF_SIZE], *cp;
+
+	if (argc > 3) {
+		fprintf(stderr, "usage: %s [infile [outfile]]\n", argv[0]);
+		exit(1);
+	}
+	get_attachment_dir();
+	if (argc > 1 && !freopen(argv[1], "r", stdin)) {
+		perror(argv[1]);
+		exit(1);
+	}
+	if (argc > 2 && !freopen(argv[2], "w", stdout)) {
+		perror(argv[2]);
+		exit(1);
+	}
+	for (input_lineno = 1; fgets(linebuf, sizeof linebuf, stdin);
+	     input_lineno++) {
+		cp = index(linebuf, '\n');
+		if (cp) {
+			*cp = '\0';
+			if (cp > linebuf && cp[-1] == '\r')
+				*--cp = '\0';
+		} else {
+			fprintf(stderr,
+		"f-demime warning: input line %u too long or unterminated\n",
+				input_lineno);
+		}
+		if (!strncmp(linebuf, "From ", 5)) {
+			finish_msg_body();
+			puts(linebuf);
+			begin_new_message();
+			continue;
+		}
+		message_input_line(linebuf);
+	}
+	finish_msg_body();
+	exit(0);
+}