X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/2e768e3cc0ce768373d3320eca4cdd08b8cf646a..035c5db34:/uip/mhbuild.c?ds=inline diff --git a/uip/mhbuild.c b/uip/mhbuild.c index e91e3586..681c4fe8 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -11,8 +11,6 @@ #include #include #include -#include -#include #include #include #include @@ -21,6 +19,8 @@ #include #define MHBUILD_SWITCHES \ + X("auto", 0, AUTOSW) \ + X("noauto", 0, NAUTOSW) \ X("check", 0, CHECKSW) \ X("nocheck", 0, NCHECKSW) \ X("directives", 0, DIRECTIVES) \ @@ -39,9 +39,12 @@ X("wcache policy", 0, WCACHESW) \ X("contentid", 0, CONTENTIDSW) \ X("nocontentid", 0, NCONTENTIDSW) \ + X("headerencoding encoding-algorithm", 0, HEADERENCSW) \ + X("autoheaderencoding", 0, AUTOHEADERENCSW) \ X("version", 0, VERSIONSW) \ X("help", 0, HELPSW) \ X("debug", -5, DEBUGSW) \ + X("dist", -4, DISTSW) \ #define X(sw, minchars, id) id, DEFINE_SWITCH_ENUM(MHBUILD); @@ -51,6 +54,17 @@ DEFINE_SWITCH_ENUM(MHBUILD); DEFINE_SWITCH_ARRAY(MHBUILD, switches); #undef X +#define MIMEENCODING_SWITCHES \ + X("base64", 0, BASE64SW) \ + X("quoted-printable", 0, QUOTEDPRINTSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(MIMEENCODING); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches); +#undef X /* mhbuildsbr.c */ extern char *tmp; /* directory to place temp files */ @@ -80,7 +94,6 @@ static int unlink_outfile = 0; static void unlink_done (int) NORETURN; /* mhbuildsbr.c */ -CT build_mime (char *, int); int output_message (CT, char *); int output_message_fp (CT, FILE *, char*); @@ -91,7 +104,7 @@ int list_all_messages (CT *, int, int, int, int); int main (int argc, char **argv) { - int sizesw = 1, headsw = 1, directives = 1; + int sizesw = 1, headsw = 1, directives = 1, autobuild = 0, dist = 0; int *icachesw; char *cp, buf[BUFSIZ]; char buffer[BUFSIZ], *compfile = NULL; @@ -99,6 +112,7 @@ main (int argc, char **argv) CT ct, cts[2]; FILE *fp = NULL; FILE *fp_out = NULL; + int header_encoding = CE_UNKNOWN; done=unlink_done; @@ -139,6 +153,20 @@ main (int argc, char **argv) print_version(invo_name); done (0); + case AUTOSW: + /* -auto implies -nodirectives */ + autobuild = 1; + directives = 0; + continue; + case NAUTOSW: + /* + * We're turning directives back on since this is likely here + * to override a profile entry + */ + autobuild = 0; + directives = 1; + continue; + case RCACHESW: icachesw = &rcachesw; goto do_cache; @@ -207,6 +235,33 @@ main (int argc, char **argv) contentidsw = 0; continue; + case HEADERENCSW: { + int encoding; + + if (!(cp = *argp++) || *cp == '-') + adios (NULL, "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); + case BASE64SW: + header_encoding = CE_BASE64; + break; + case QUOTEDPRINTSW: + header_encoding = CE_QUOTED; + break; + default: + adios (NULL, "Internal error: algorithm %s", cp); + } + continue; + } + + case AUTOHEADERENCSW: + header_encoding = CE_UNKNOWN; + continue; + case VERBSW: verbosw++; continue; @@ -216,6 +271,9 @@ main (int argc, char **argv) case DEBUGSW: debugsw = 1; continue; + case DISTSW: + dist = 1; + continue; } } if (compfile) @@ -282,32 +340,28 @@ main (int argc, char **argv) unlink_infile = 1; /* build the content structures for MIME message */ - ct = build_mime (infile, directives); - cts[0] = ct; - cts[1] = NULL; - - /* output MIME message to this temporary file */ - strncpy (outfile, m_mktemp(invo_name, NULL, &fp_out), sizeof(outfile)); - unlink_outfile = 1; - - /* output the message */ - output_message_fp (ct, fp_out, outfile); - fclose(fp_out); - - /* output the temp file to standard output */ - if ((fp = fopen (outfile, "r")) == NULL) - adios (outfile, "unable to open"); - while (fgets (buffer, BUFSIZ, fp)) - fputs (buffer, stdout); - fclose (fp); + ct = build_mime (infile, autobuild, dist, directives, header_encoding); + + /* + * If ct == NULL, that means that -auto was set and a MIME version + * header was already seen. Just use the input file as the output + */ + + if (!ct) { + if (! (fp = fopen(infile, "r"))) { + adios(NULL, "Unable to open %s for reading", infile); + } + while (fgets(buffer, BUFSIZ, fp)) + fputs(buffer, stdout); + } else { + /* output the message */ + output_message_fp (ct, stdout, NULL); + free_content (ct); + } unlink (infile); unlink_infile = 0; - unlink (outfile); - unlink_outfile = 0; - - free_content (ct); done (0); } @@ -316,7 +370,16 @@ main (int argc, char **argv) */ /* build the content structures for MIME message */ - ct = build_mime (compfile, directives); + ct = build_mime (compfile, autobuild, dist, directives, header_encoding); + + /* + * If ct == NULL, that means -auto was set and we found a MIME version + * header. Simply exit and do nothing. + */ + + if (! ct) + done(0); + cts[0] = ct; cts[1] = NULL;