X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhoutsbr.c;h=87e7943c26b5b186d02a2209ab48bc16d6959e20;hp=939275f61f81ed5592de27b42e7b1bfaf058c882;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=5b792c4424571f05bc2008e3109797d18d7d00d1 diff --git a/uip/mhoutsbr.c b/uip/mhoutsbr.c index 939275f..87e7943 100644 --- a/uip/mhoutsbr.c +++ b/uip/mhoutsbr.c @@ -9,56 +9,11 @@ #include #include -#include -#include #include -#include -#include #include #include #include -#ifdef HAVE_SYS_WAIT_H -# include -#endif - - -extern int ebcdicsw; - -static char ebcdicsafe[0x100] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; static char nib2b64[0x40+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -68,17 +23,16 @@ static char nib2b64[0x40+1] = */ int output_message(CT, char *); int output_message_fp(CT, FILE *, char *); -int writeBase64aux(FILE *, FILE *); /* ** static prototypes */ static int output_content(CT, FILE *); static void output_headers(CT, FILE *); -static int writeExternalBody(CT, FILE *); static int write8Bit(CT, FILE *); static int writeQuoted(CT, FILE *); static int writeBase64(CT, FILE *); +static int writeBase64aux(FILE *, FILE *); /* @@ -132,14 +86,6 @@ output_content(CT ct, FILE *out) output_headers(ct, out); /* - ** If this is the internal content structure for a - ** "message/external", then we are done with the - ** headers (since it has no body). - */ - if (ct->c_ctexbody) - return OK; - - /* ** Now output the content bodies. */ switch (ct->c_type) { @@ -148,9 +94,6 @@ output_content(CT ct, FILE *out) struct multipart *m; struct part *part; - if (ct->c_rfc934) - putc('\n', out); - m = (struct multipart *) ct->c_ctparams; for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; @@ -165,19 +108,7 @@ output_content(CT ct, FILE *out) case CT_MESSAGE: putc('\n', out); - if (ct->c_subtype == MESSAGE_EXTERNAL) { - struct exbody *e; - - e = (struct exbody *) ct->c_ctparams; - if (output_content(e->eb_content, out) == NOTOK) - return NOTOK; - - /* output phantom body for access-type "mail-server" */ - if (e->eb_body) - writeExternalBody(ct, out); - } else { - result = write8Bit(ct, out); - } + result = write8Bit(ct, out); break; /* @@ -240,78 +171,6 @@ output_headers(CT ct, FILE *out) /* -** Write the phantom body for access-type "mail-server". -*/ - -static int -writeExternalBody(CT ct, FILE *out) -{ - char **ap, **ep, *cp; - struct exbody *e = (struct exbody *) ct->c_ctparams; - - putc('\n', out); - for (cp = e->eb_body; *cp; cp++) { - CT ct2 = e->eb_content; - CI ci2 = &ct2->c_ctinfo; - - if (*cp == '\\') { - switch (*++cp) { - case 'I': - if (ct2->c_id) { - char *dp = trimcpy(ct2->c_id); - - fputs(dp, out); - free(dp); - } - continue; - - case 'N': - for (ap = ci2->ci_attrs, ep = ci2->ci_values; - *ap; ap++, ep++) - if (!mh_strcasecmp(*ap, "name")) { - fprintf(out, "%s", *ep); - break; - } - continue; - - case 'T': - fprintf(out, "%s/%s", ci2->ci_type, - ci2->ci_subtype); - for (ap = ci2->ci_attrs, ep = ci2->ci_values; - *ap; ap++, ep++) - fprintf(out, "; %s=\"%s\"", *ap, *ep); - continue; - - case 'n': - putc('\n', out); - continue; - - case 't': - putc('\t', out); - continue; - - case '\0': - cp--; - break; - - case '\\': - case '"': - break; - - default: - putc('\\', out); - break; - } - } - putc(*cp, out); - } - putc('\n', out); - - return OK; -} - - -/* ** Output a content without any transfer encoding */ @@ -369,7 +228,7 @@ writeQuoted(CT ct, FILE *out) n = 0; } for (; *cp; cp++) { - if (n > CPERLIN - 3) { + if (n + 1 >= CPERLIN) { fputs("=\n", out); n = 0; } @@ -382,8 +241,16 @@ writeQuoted(CT ct, FILE *out) break; default: - if (*cp < '!' || *cp > '~' || (ebcdicsw && !ebcdicsafe[*cp & 0xff])) + if (*cp < '!' || *cp > '~') { goto three_print; + } + if (n == 0 && *cp == '.') { + /* + ** encode dot at start of line, + ** because it could be alone ... + */ + goto three_print; + } putc(*cp, out); n++; break; @@ -432,10 +299,10 @@ writeBase64(CT ct, FILE *out) } -int +static int writeBase64aux(FILE *in, FILE *out) { - int cc, n; + unsigned int cc, n; char inbuf[3]; n = BPERLIN;