X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/bf4e14adcab829c23f134253dea686789eb21d6a..986abcee996d486db0b9c753974f3cb0eac2e9b2:/uip/mhbuild.c diff --git a/uip/mhbuild.c b/uip/mhbuild.c index db5362f8..c94002df 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -13,8 +13,12 @@ #include #include #include +#include "h/done.h" #include +#include "sbr/m_maildir.h" +#include "sbr/m_mktemp.h" #include "mhfree.h" +#include "mhoutsbr.h" #define MHBUILD_SWITCHES \ X("auto", 0, AUTOSW) \ @@ -69,12 +73,6 @@ DEFINE_SWITCH_ENUM(MIMEENCODING); DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches); #undef X -/* mhcachesbr.c */ -extern int rcachesw; -extern int wcachesw; -extern char *cache_public; -extern char *cache_private; - int debugsw = 0; int listsw = 0; @@ -85,15 +83,7 @@ int contentidsw = 1; * Temporary files */ static char infile[BUFSIZ]; -static int unlink_infile = 0; - static char outfile[BUFSIZ]; -static int unlink_outfile = 0; - -static void unlink_done (int) NORETURN; - -/* mhbuildsbr.c */ -int output_message_fp (CT, FILE *, char*); int @@ -112,9 +102,7 @@ main (int argc, char **argv) int header_encoding = CE_UNKNOWN; size_t n; - if (nmh_init(argv[0], 2)) { return 1; } - - done=unlink_done; + if (nmh_init(argv[0], true, false)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -122,9 +110,8 @@ main (int argc, char **argv) while ((cp = *argp++)) { if (cp[0] == '-' && cp[1] == '\0') { if (compfile) - adios (NULL, "cannot specify both standard input and a file"); - else - compfile = cp; + die("cannot specify both standard input and a file"); + compfile = cp; listsw = 0; /* turn off -list if using standard in/out */ verbosw = 0; /* turn off -verbose listings */ break; @@ -135,7 +122,7 @@ main (int argc, char **argv) ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [switches] file", invo_name); @@ -166,13 +153,13 @@ main (int argc, char **argv) icachesw = &wcachesw; do_cache: ; if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - switch (*icachesw = smatch (cp, caches)) { + die("missing argument to %s", argp[-2]); + switch (*icachesw = smatch (cp, cache_policy)) { case AMBIGSW: - ambigsw (cp, caches); + ambigsw (cp, cache_policy); done (1); case UNKWNSW: - adios (NULL, "%s unknown", cp); + die("%s unknown", cp); default: break; } @@ -231,13 +218,13 @@ main (int argc, char **argv) int encoding; if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); switch (encoding = smatch (cp, encodingswitches)) { case AMBIGSW: ambigsw (cp, encodingswitches); done (1); case UNKWNSW: - adios (NULL, "%s unknown encoding algorithm", cp); + die("%s unknown encoding algorithm", cp); case BASE64SW: header_encoding = CE_BASE64; break; @@ -248,7 +235,7 @@ main (int argc, char **argv) header_encoding = CE_8BIT; break; default: - adios (NULL, "Internal error: algorithm %s", cp); + die("Internal error: algorithm %s", cp); } continue; } @@ -259,11 +246,11 @@ main (int argc, char **argv) case MAXUNENCSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if ((maxunencoded = atoi(cp)) < 1) - adios (NULL, "Invalid argument for %s: %s", argp[-2], cp); + die("Invalid argument for %s: %s", argp[-2], cp); if (maxunencoded > 998) - adios (NULL, "limit of -maxunencoded is 998"); + die("limit of -maxunencoded is 998"); continue; case VERBSW: @@ -287,9 +274,8 @@ main (int argc, char **argv) } } if (compfile) - adios (NULL, "only one composition file allowed"); - else - compfile = cp; + die("only one composition file allowed"); + compfile = cp; } /* @@ -297,7 +283,7 @@ main (int argc, char **argv) */ if ((cp = getenv ("MHBUILD"))) { if ((fp = fopen (cp, "r"))) { - readconfig ((struct node **) 0, fp, cp, 0); + readconfig(NULL, fp, cp, 0); fclose (fp); } else { admonish ("", "unable to read $MHBUILD profile (%s)", cp); @@ -308,7 +294,7 @@ main (int argc, char **argv) * Read the standard profile setup */ if ((fp = fopen (cp = etcpath ("mhn.defaults"), "r"))) { - readconfig ((struct node **) 0, fp, cp, 0); + readconfig(NULL, fp, cp, 0); fclose (fp); } @@ -319,32 +305,29 @@ main (int argc, char **argv) /* Check for private cache location */ if (!(cache_private = context_find (nmhprivcache))) cache_private = ".cache"; - cache_private = getcpy (m_maildir (cache_private)); + cache_private = mh_xstrdup(m_maildir(cache_private)); if (!context_find ("path")) free (path ("./", TFOLDER)); /* Check if we have a file to process */ if (!compfile) - adios (NULL, "need to specify a %s composition file", invo_name); + die("need to specify a %s composition file", invo_name); /* * 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", + die("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 */ while ((n = fread(buffer, 1, sizeof(buffer), stdin)) > 0) { if (fwrite(buffer, 1, n, fp) != n) { - adios (NULL, "error copying to temporary file"); + die("error copying to temporary file"); } } fclose (fp); @@ -360,11 +343,11 @@ main (int argc, char **argv) if (!ct) { if (! (fp = fopen(infile, "r"))) { - adios(NULL, "Unable to open %s for reading", infile); + die("Unable to open %s for reading", infile); } while ((n = fread(buffer, 1, sizeof(buffer), fp)) > 0) { if (fwrite(buffer, 1, n, stdout) != n) { - adios(NULL, "error copying %s to stdout", infile); + die("error copying %s to stdout", infile); } } } else { @@ -397,10 +380,9 @@ main (int argc, char **argv) /* output MIME message to this temporary file */ if ((cp = m_mktemp2(compfile, invo_name, NULL, &fp_out)) == NULL) { - adios(NULL, "unable to create temporary file in %s", get_temp_dir()); + die("unable to create temporary file"); } strncpy(outfile, cp, sizeof(outfile)); - unlink_outfile = 1; /* output the message */ output_message_fp (ct, fp_out, outfile); @@ -424,25 +406,12 @@ main (int argc, char **argv) rename (buffer, compfile); done (1); } - unlink_outfile = 0; + /* Remove from atexit(3) list of files to unlink. */ + if (!(m_unlink(outfile) == -1 && errno == ENOENT)) { + adios(outfile, "file exists after rename:"); + } free_content (ct); done (0); return 1; } - - -static void NORETURN -unlink_done (int status) -{ - /* - * Check if we need to remove stray - * temporary files. - */ - if (unlink_infile) - (void) m_unlink (infile); - if (unlink_outfile) - (void) m_unlink (outfile); - - exit (status); -}