#include <h/mime.h>
#include <h/mhparse.h>
#include <h/mhcachesbr.h>
+#include "h/done.h"
#include <h/utils.h>
-#include "../sbr/m_mktemp.h"
+#include "sbr/m_maildir.h"
+#include "sbr/m_mktemp.h"
#include "mhfree.h"
#include "mhoutsbr.h"
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;
* 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;
int
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;
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;
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);
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;
}
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;
header_encoding = CE_8BIT;
break;
default:
- adios (NULL, "Internal error: algorithm %s", cp);
+ die("Internal error: algorithm %s", cp);
}
continue;
}
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:
}
}
if (compfile)
- adios (NULL, "only one composition file allowed");
- else
- compfile = cp;
+ die("only one composition file allowed");
+ compfile = cp;
}
/*
*/
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);
* 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);
}
/* 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);
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 {
/* 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);
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);
-}