#include <h/mh.h>
#include <fcntl.h>
-#include <h/signals.h>
#include <h/md5.h>
#include <h/mts.h>
#include <h/tws.h>
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);
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);
extern char *cache_private;
int debugsw = 0;
-int verbosw = 0;
int listsw = 0;
int rfc934sw = 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;
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;
case QUOTEDPRINTSW:
header_encoding = CE_QUOTED;
break;
+ case UTF8SW:
+ header_encoding = CE_8BIT;
+ break;
default:
adios (NULL, "Internal error: algorithm %s", cp);
}
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)
get_temp_dir());
}
- /* copy standard input to temporary file */
+ /* save a copy of the name for later removal */
strncpy (infile, cp, sizeof(infile));
- while (fgets (buffer, BUFSIZ, stdin))
- fputs (buffer, fp);
- fclose (fp);
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");
+ }
+ }
+ fclose (fp);
+
/* 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
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);
}
*/
/* 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
* 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));
* temporary files.
*/
if (unlink_infile)
- unlink (infile);
+ (void) m_unlink (infile);
if (unlink_outfile)
- unlink (outfile);
+ (void) m_unlink (outfile);
exit (status);
}