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

f-demime starting code
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 06 May 2023 06:14:03 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/f-demime/initconv.c	Sat May 06 06:14:03 2023 +0000
@@ -0,0 +1,124 @@
+/*
+ * This module contains functions that implement initiation of various
+ * conversions performed by f-demime.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "defs.h"
+
+extern enum msg_state msg_state;
+extern char cont_te_buf[HDR_BUF_SIZE];
+extern int got_cont_type, got_cont_te;
+extern char *att_filename_base;
+extern int qpdec_err_flag;
+
+void (*dec_outf)();
+FILE *tempfile;
+int text_is_utf8;
+
+static int
+create_tempfile()
+{
+	char template[16];
+	int fd;
+
+	strcpy(template, "/tmp/fdemXXXXXX");
+	fd = mkstemp(template);
+	if (fd < 0) {
+		perror("mkstemp");
+		return(-1);
+	}
+	unlink(template);
+	tempfile = fdopen(fd, "r+w");
+	if (!tempfile) {
+		perror("fdopen");
+		close(fd);
+		return(-1);
+	}
+	return(0);
+}
+
+static int
+init_tempfile()
+{
+	int rc;
+
+	rc = create_tempfile();
+	if (!rc)
+		return(0);
+	if (got_cont_te)
+		fputs(cont_te_buf, stdout);
+	puts("X-Fdemime-Error: unable to create temp file for conversion");
+	putchar('\n');
+	msg_state = MSG_STATE_BODY_PASS;
+	return(-1);
+}
+
+static void
+implicit_text_plain()
+{
+	if (!got_cont_type)
+		puts("Content-Type: text/plain (f-demime implied)");
+}
+
+static void
+grok_charset_attr(csa)
+	char *csa;
+{
+	text_is_utf8 = !strcasecmp(csa, "UTF-8") || !strcmp(csa, "csUTF8");
+}
+
+void
+init_base64_text_plain(charset_attr)
+	char *charset_attr;
+{
+	implicit_text_plain();
+	if (init_tempfile() < 0)
+		return;
+	grok_charset_attr(charset_attr);
+	base64_dec_init();
+	ptext_conv_init();
+	msg_state = MSG_STATE_PTEXT_B64;
+}
+
+void
+init_qp_text_plain(charset_attr)
+	char *charset_attr;
+{
+	implicit_text_plain();
+	if (init_tempfile() < 0)
+		return;
+	grok_charset_attr(charset_attr);
+	qpdec_err_flag = 0;
+	ptext_conv_init();
+	msg_state = MSG_STATE_PTEXT_QP;
+}
+
+void
+init_base64_text_other()
+{
+	if (init_tempfile() < 0)
+		return;
+	base64_dec_init();
+	b2q_conv_init();
+	msg_state = MSG_STATE_B64_TO_QP;
+}
+
+void
+init_base64_nontext()
+{
+	fputs(cont_te_buf, stdout);
+	if (init_attach_out() < 0) {
+		puts("X-Fdemime-Error: unable to create save file");
+		putchar('\n');
+		msg_state = MSG_STATE_BODY_PASS;
+		return;
+	}
+	printf("X-Fdemime-Saved: %s\n", att_filename_base);
+	base64_dec_init();
+	msg_state = MSG_STATE_BLOB_B64;
+}