X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/30d2bc627c8010e4fbe4774d86bed189a57210e2..052d7bfb0a9a541c6975c3ed679dd3ac9e5c0886:/uip/mhbuild.c?ds=sidebyside diff --git a/uip/mhbuild.c b/uip/mhbuild.c index 18844b56..b39cc809 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -1,6 +1,4 @@ - -/* - * mhbuild.c -- expand/translate MIME composition files +/* mhbuild.c -- expand/translate MIME composition files * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -9,7 +7,6 @@ #include #include -#include #include #include #include @@ -17,6 +14,10 @@ #include #include #include +#include "../sbr/m_maildir.h" +#include "../sbr/m_mktemp.h" +#include "mhfree.h" +#include "mhoutsbr.h" #define MHBUILD_SWITCHES \ X("auto", 0, AUTOSW) \ @@ -35,15 +36,19 @@ X("norfc934mode", 0, NRFC934SW) \ X("verbose", 0, VERBSW) \ X("noverbose", 0, NVERBSW) \ + X("disposition", 0, DISPOSW) \ + X("nodisposition", 0, NDISPOSW) \ X("rcache policy", 0, RCACHESW) \ X("wcache policy", 0, WCACHESW) \ X("contentid", 0, CONTENTIDSW) \ X("nocontentid", 0, NCONTENTIDSW) \ X("headerencoding encoding-algorithm", 0, HEADERENCSW) \ X("autoheaderencoding", 0, AUTOHEADERENCSW) \ + X("maxunencoded", 0, MAXUNENCSW) \ X("version", 0, VERSIONSW) \ X("help", 0, HELPSW) \ X("debug", -5, DEBUGSW) \ + X("dist", 0, DISTSW) \ #define X(sw, minchars, id) id, DEFINE_SWITCH_ENUM(MHBUILD); @@ -53,9 +58,11 @@ DEFINE_SWITCH_ENUM(MHBUILD); DEFINE_SWITCH_ARRAY(MHBUILD, switches); #undef X +/* utf-8 is for Email Address Internationalization, using SMTPUTF8. */ #define MIMEENCODING_SWITCHES \ X("base64", 0, BASE64SW) \ X("quoted-printable", 0, QUOTEDPRINTSW) \ + X("utf-8", 0, UTF8SW) \ #define X(sw, minchars, id) id, DEFINE_SWITCH_ENUM(MIMEENCODING); @@ -65,17 +72,7 @@ DEFINE_SWITCH_ENUM(MIMEENCODING); DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches); #undef X -/* mhbuildsbr.c */ -extern char *tmp; /* directory to place temp files */ - -/* mhcachesbr.c */ -extern int rcachesw; -extern int wcachesw; -extern char *cache_public; -extern char *cache_private; - int debugsw = 0; -int verbosw = 0; int listsw = 0; int rfc934sw = 0; @@ -92,18 +89,13 @@ static int unlink_outfile = 0; static void unlink_done (int) NORETURN; -/* mhbuildsbr.c */ -int output_message (CT, char *); -int output_message_fp (CT, FILE *, char*); - -/* mhlistsbr.c */ -int list_all_messages (CT *, int, int, int, int); - int main (int argc, char **argv) { - int sizesw = 1, headsw = 1, directives = 1, autobuild = 0; + int sizesw = 1, headsw = 1, directives = 1, autobuild = 0, dist = 0; + int verbosw = 0, dispo = 0; + size_t maxunencoded = MAXTEXTPERLN; int *icachesw; char *cp, buf[BUFSIZ]; char buffer[BUFSIZ], *compfile = NULL; @@ -112,16 +104,11 @@ main (int argc, char **argv) FILE *fp = NULL; FILE *fp_out = NULL; int header_encoding = CE_UNKNOWN; + size_t n; - done=unlink_done; - -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); + if (nmh_init(argv[0], 2)) { return 1; } - /* read user profile/context */ - context_read(); + done=unlink_done; arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -174,9 +161,9 @@ main (int argc, char **argv) do_cache: ; if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); - switch (*icachesw = smatch (cp, caches)) { + switch (*icachesw = smatch (cp, cache_policy)) { case AMBIGSW: - ambigsw (cp, caches); + ambigsw (cp, cache_policy); done (1); case UNKWNSW: adios (NULL, "%s unknown", cp); @@ -251,6 +238,9 @@ main (int argc, char **argv) case QUOTEDPRINTSW: header_encoding = CE_QUOTED; break; + case UTF8SW: + header_encoding = CE_8BIT; + break; default: adios (NULL, "Internal error: algorithm %s", cp); } @@ -261,15 +251,33 @@ main (int argc, char **argv) header_encoding = CE_UNKNOWN; continue; + case MAXUNENCSW: + if (!(cp = *argp++) || *cp == '-') + adios (NULL, "missing argument to %s", argp[-2]); + if ((maxunencoded = atoi(cp)) < 1) + adios (NULL, "Invalid argument for %s: %s", argp[-2], cp); + if (maxunencoded > 998) + adios (NULL, "limit of -maxunencoded is 998"); + continue; + case VERBSW: verbosw++; continue; case NVERBSW: verbosw = 0; continue; + case DISPOSW: + dispo = 1; + continue; + case NDISPOSW: + dispo = 0; + continue; case DEBUGSW: debugsw = 1; continue; + case DISTSW: + dist = 1; + continue; } } if (compfile) @@ -307,16 +315,6 @@ main (int argc, char **argv) cache_private = ".cache"; cache_private = getcpy (m_maildir (cache_private)); - /* - * Check for storage directory. If defined, we - * will store temporary files there. Else we - * store them in standard nmh directory. - */ - if ((cp = context_find (nmhstorage)) && *cp) - tmp = concat (cp, "/", invo_name, NULL); - else - tmp = add (m_maildir (invo_name), NULL); - if (!context_find ("path")) free (path ("./", TFOLDER)); @@ -328,15 +326,26 @@ main (int argc, char **argv) * Process the composition file from standard input. */ if (compfile[0] == '-' && compfile[1] == '\0') { + if ((cp = m_mktemp2(NULL, invo_name, NULL, &fp)) == NULL) { + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); + } + + /* save a copy of the name for later removal */ + strncpy (infile, cp, sizeof(infile)); + unlink_infile = 1; + /* copy standard input to temporary file */ - strncpy (infile, m_mktemp(invo_name, NULL, &fp), sizeof(infile)); - while (fgets (buffer, BUFSIZ, stdin)) - fputs (buffer, fp); + while ((n = fread(buffer, 1, sizeof(buffer), stdin)) > 0) { + if (fwrite(buffer, 1, n, fp) != n) { + adios (NULL, "error copying to temporary file"); + } + } fclose (fp); - unlink_infile = 1; /* build the content structures for MIME message */ - ct = build_mime (infile, autobuild, directives, header_encoding); + ct = build_mime (infile, autobuild, dist, directives, header_encoding, + maxunencoded, verbosw); /* * If ct == NULL, that means that -auto was set and a MIME version @@ -347,17 +356,17 @@ main (int argc, char **argv) if (! (fp = fopen(infile, "r"))) { adios(NULL, "Unable to open %s for reading", infile); } - while (fgets(buffer, BUFSIZ, fp)) - fputs(buffer, stdout); + while ((n = fread(buffer, 1, sizeof(buffer), fp)) > 0) { + if (fwrite(buffer, 1, n, stdout) != n) { + adios(NULL, "error copying %s to stdout", infile); + } + } } else { /* output the message */ output_message_fp (ct, stdout, NULL); free_content (ct); } - unlink (infile); - unlink_infile = 0; - done (0); } @@ -366,7 +375,8 @@ main (int argc, char **argv) */ /* build the content structures for MIME message */ - ct = build_mime (compfile, autobuild, directives, header_encoding); + ct = build_mime (compfile, autobuild, dist, directives, header_encoding, + maxunencoded, verbosw); /* * If ct == NULL, that means -auto was set and we found a MIME version @@ -380,8 +390,10 @@ main (int argc, char **argv) cts[1] = NULL; /* output MIME message to this temporary file */ - strncpy(outfile, m_mktemp2(compfile, invo_name, NULL, &fp_out), - sizeof(outfile)); + if ((cp = m_mktemp2(compfile, invo_name, NULL, &fp_out)) == NULL) { + adios(NULL, "unable to create temporary file in %s", get_temp_dir()); + } + strncpy(outfile, cp, sizeof(outfile)); unlink_outfile = 1; /* output the message */ @@ -392,7 +404,7 @@ main (int argc, char **argv) * List the message info */ if (listsw) - list_all_messages (cts, headsw, sizesw, verbosw, debugsw); + list_all_messages (cts, headsw, sizesw, verbosw, debugsw, dispo); /* Rename composition draft */ snprintf (buffer, sizeof(buffer), "%s.orig", m_backup (compfile)); @@ -414,7 +426,7 @@ main (int argc, char **argv) } -static void +static void NORETURN unlink_done (int status) { /* @@ -422,9 +434,9 @@ unlink_done (int status) * temporary files. */ if (unlink_infile) - unlink (infile); + (void) m_unlink (infile); if (unlink_outfile) - unlink (outfile); + (void) m_unlink (outfile); exit (status); }