From: Ken Hornstein Date: Thu, 31 Oct 2013 15:37:52 +0000 (-0400) Subject: Support the -headerencoding switch to select the header encoding algorithm. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/5bd029a1d22319286aa9cabc8c8045fd814d69d1?ds=sidebyside;hp=--cc Support the -headerencoding switch to select the header encoding algorithm. --- 5bd029a1d22319286aa9cabc8c8045fd814d69d1 diff --git a/h/mhparse.h b/h/mhparse.h index b5a73627..1dfd7ed8 100644 --- a/h/mhparse.h +++ b/h/mhparse.h @@ -285,6 +285,21 @@ extern struct str2init str2methods[]; */ int pidcheck (int); CT parse_mime (char *); + +/* + * Translate a composition file into a MIME data structure. Arguments are: + * + * infile - Name of input filename + * directives - A flag to control whether or not build directives are + * processed by default. + * encoding - The default encoding to use when doing RFC 2047 header + * encoding. Must be one of CE_UNKNOWN, CE_BASE64, or + * CE_QUOTED; + * + * Returns a CT structure describing the resulting MIME message. + */ +CT build_mime (char *infile, int directives, int encoding); + int add_header (CT, char *, char *); int get_ctinfo (char *, CT, int); int params_external (CT, int); diff --git a/man/mhbuild.man b/man/mhbuild.man index ab757d34..6f50006b 100644 --- a/man/mhbuild.man +++ b/man/mhbuild.man @@ -17,6 +17,9 @@ mhbuild \- translate MIME composition draft .RB [ \-contentid " | " \-nocontentid ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-check " | " \-nocheck ] +.RB [ \-headerencoding +.IR encoding\-algorithm +.RB " | " \-autoheaderencoding ] .RB [ \-version ] .RB [ \-help ] .ad @@ -28,11 +31,8 @@ a valid MIME message. .PP .B mhbuild creates multi-media messages as specified in RFC 2045 -to RFC 2049. Currently -.B mhbuild -only supports encodings in -message bodies, and does not support the encoding of message headers as -specified in RFC 2047. +to RFC 2049. This includes the encoding of message headers as specified +by RFC 2047. .PP If you specify the name of the composition file as \*(lq-\*(rq, then @@ -77,6 +77,20 @@ switch is present, then the listing will show any \*(lqextra\*(rq information that is present in the message, such as comments in the \*(lqContent-Type\*(rq header. +.PP +The +.B \-headerencoding +switch will indicate which algorithm to use when encoding any message headers +that contain 8\-bit characters. The valid arguments are +.I base64 +for based\-64 encoding and +.I quoted +for quoted\-printable encoding. The +.B \-autoheaderencoding +switch will instruct +.B mhbuild +to automatically pick the encoding algorithm based on the frequency of +8\-bit characters. .SS "Translating the Composition File" .B mhbuild is essentially a filter to aid in the composition of MIME @@ -714,4 +728,5 @@ is checked. .RB ` \-contentid ' .RB ` \-nocheck ' .RB ` \-noverbose ' +.RB ` \-autoheaderencoding ' .fi diff --git a/uip/mhbuild.c b/uip/mhbuild.c index 91132ce3..1a3ce1df 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -37,6 +37,8 @@ X("wcache policy", 0, WCACHESW) \ X("contentid", 0, CONTENTIDSW) \ X("nocontentid", 0, NCONTENTIDSW) \ + X("headerencoding", 0, HEADERENCSW) \ + X("autoheaderencoding", 0, AUTOHEADERENCSW) \ X("version", 0, VERSIONSW) \ X("help", 0, HELPSW) \ X("debug", -5, DEBUGSW) \ @@ -49,6 +51,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 */ @@ -78,7 +91,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*); @@ -97,6 +109,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; @@ -205,6 +218,32 @@ 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); + } + } + + case AUTOHEADERENCSW: + header_encoding = CE_UNKNOWN; + continue; + case VERBSW: verbosw++; continue; @@ -280,7 +319,7 @@ main (int argc, char **argv) unlink_infile = 1; /* build the content structures for MIME message */ - ct = build_mime (infile, directives); + ct = build_mime (infile, directives, header_encoding); cts[0] = ct; cts[1] = NULL; @@ -314,7 +353,7 @@ main (int argc, char **argv) */ /* build the content structures for MIME message */ - ct = build_mime (compfile, directives); + ct = build_mime (compfile, directives, header_encoding); cts[0] = ct; cts[1] = NULL; diff --git a/uip/mhbuildsbr.c b/uip/mhbuildsbr.c index 79268399..e4499170 100644 --- a/uip/mhbuildsbr.c +++ b/uip/mhbuildsbr.c @@ -69,11 +69,6 @@ int find_cache (CT, int, int *, char *, char *, int); void free_ctinfo (CT); void free_encoding (CT, int); -/* - * prototypes - */ -CT build_mime (char *, int); - /* * static prototypes */ @@ -128,7 +123,7 @@ static void directive_pop(void) */ CT -build_mime (char *infile, int directives) +build_mime (char *infile, int directives, int header_encoding) { int compnum, state; char buf[BUFSIZ], name[NAMESZ]; @@ -234,7 +229,7 @@ finish_field: */ for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) { - if (encode_rfc2047(hp->name, &hp->value, CE_UNKNOWN, NULL)) { + if (encode_rfc2047(hp->name, &hp->value, header_encoding, NULL)) { adios(NULL, "Unable to encode header \"%s\"", hp->name); } }