FreeCalypso > hg > falcon-mail-tools
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; +}