X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhoutsbr.c;h=21c2e26318b68f5d5011bcc73f29f2d6a3188ff3;hp=e3549586521bb40847c17f6a63e2a9e32c7d1de9;hb=55eda7c77fdf33b0a7175968471df55e2600379c;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1 diff --git a/uip/mhoutsbr.c b/uip/mhoutsbr.c index e354958..21c2e26 100644 --- a/uip/mhoutsbr.c +++ b/uip/mhoutsbr.c @@ -1,113 +1,67 @@ /* - * mhoutsbr.c -- routines to output MIME messages - * -- given a Content structure - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ +** mhoutsbr.c -- routines to output MIME messages +** -- given a Content structure +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +*/ #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+/"; /* - * prototypes - */ -int output_message (CT, char *); -int output_message_fp (CT, FILE *, char *); -int writeBase64aux (FILE *, FILE *); +** prototypes +*/ +int output_message(CT, char *); +int output_message_fp(CT, FILE *, char *); /* - * 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 prototypes +*/ +static int output_content(CT, FILE *); +static void output_headers(CT, FILE *); +static int write8Bit(CT, FILE *); +static int writeQuoted(CT, FILE *); +static int writeBase64(CT, FILE *); +static int writeBase64aux(FILE *, FILE *); /* - * Main routine to output a MIME message contained - * in a Content structure, to a file. Any necessary - * transfer encoding is added. - */ +** Main routine to output a MIME message contained +** in a Content structure, to a file. Any necessary +** transfer encoding is added. +*/ int -output_message_fp (CT ct, FILE *fp, char *file) +output_message_fp(CT ct, FILE *fp, char *file) { - if (output_content (ct, fp) == NOTOK) + if (output_content(ct, fp) == NOTOK) return NOTOK; - if (fflush (fp)) { - advise ((file?file:""), "error writing to"); + if (fflush(fp)) { + advise((file?file:""), "error writing to"); return NOTOK; } return OK; } int -output_message (CT ct, char *file) +output_message(CT ct, char *file) { FILE *fp; int status; - if ((fp = fopen (file, "w")) == NULL) { - advise (file, "unable to open for writing"); + if ((fp = fopen(file, "w")) == NULL) { + advise(file, "unable to open for writing"); return NOTOK; } status = output_message_fp(ct, fp, file); @@ -117,101 +71,78 @@ output_message (CT ct, char *file) /* - * Output a Content structure to a file. - */ +** Output a Content structure to a file. +*/ static int -output_content (CT ct, FILE *out) +output_content(CT ct, FILE *out) { int result = 0; CI ci = &ct->c_ctinfo; /* - * Output all header fields for this content - */ - output_headers (ct, out); + ** Output all header fields for this content + */ + 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. - */ + ** Now output the content bodies. + */ switch (ct->c_type) { case CT_MULTIPART: { 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; - fprintf (out, "\n--%s\n", ci->ci_values[0]); - if (output_content (p, out) == NOTOK) + fprintf(out, "\n--%s\n", ci->ci_values[0]); + if (output_content(p, out) == NOTOK) return NOTOK; } - fprintf (out, "\n--%s--\n", ci->ci_values[0]); + fprintf(out, "\n--%s--\n", ci->ci_values[0]); } break; 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); - } + putc('\n', out); + result = write8Bit(ct, out); break; /* - * Handle discrete types (text/application/audio/image/video) - */ + ** Handle discrete types (text/application/audio/image/video) + */ default: switch (ct->c_encoding) { case CE_7BIT: - putc ('\n', out); - result = write8Bit (ct, out); + putc('\n', out); + result = write8Bit(ct, out); break; case CE_8BIT: - putc ('\n', out); - result = write8Bit (ct, out); + putc('\n', out); + result = write8Bit(ct, out); break; case CE_QUOTED: - putc ('\n', out); - result = writeQuoted (ct, out); + putc('\n', out); + result = writeQuoted(ct, out); break; case CE_BASE64: - putc ('\n', out); - result = writeBase64 (ct, out); + putc('\n', out); + result = writeBase64(ct, out); break; case CE_BINARY: - advise (NULL, "can't handle binary transfer encoding in content"); + advise(NULL, "can't handle binary transfer encoding in content"); result = NOTOK; break; default: - advise (NULL, "unknown transfer encoding in content"); + advise(NULL, "unknown transfer encoding in content"); result = NOTOK; break; } @@ -223,97 +154,28 @@ output_content (CT ct, FILE *out) /* - * Output all the header fields for a content - */ +** Output all the header fields for a content +*/ static void -output_headers (CT ct, FILE *out) +output_headers(CT ct, FILE *out) { HF hp; hp = ct->c_first_hf; while (hp) { - fprintf (out, "%s:%s", hp->name, hp->value); + fprintf(out, "%s:%s", hp->name, hp->value); hp = hp->next; } } /* - * 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 - */ +** Output a content without any transfer encoding +*/ static int -write8Bit (CT ct, FILE *out) +write8Bit(CT ct, FILE *out) { int fd; char c, *file, buffer[BUFSIZ]; @@ -324,12 +186,12 @@ write8Bit (CT ct, FILE *out) return NOTOK; c = '\n'; - while (fgets (buffer, sizeof(buffer) - 1, ce->ce_fp)) { - c = buffer[strlen (buffer) - 1]; - fputs (buffer, out); + while (fgets(buffer, sizeof(buffer) - 1, ce->ce_fp)) { + c = buffer[strlen(buffer) - 1]; + fputs(buffer, out); } if (c != '\n') - putc ('\n', out); + putc('\n', out); (*ct->c_ceclosefnx) (ct); return OK; @@ -337,11 +199,11 @@ write8Bit (CT ct, FILE *out) /* - * Output a content using quoted-printable - */ +** Output a content using quoted-printable +*/ static int -writeQuoted (CT ct, FILE *out) +writeQuoted(CT ct, FILE *out) { int fd; char *cp, *file; @@ -352,55 +214,54 @@ writeQuoted (CT ct, FILE *out) if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; - while (fgets (buffer, sizeof(buffer) - 1, ce->ce_fp)) { + while (fgets(buffer, sizeof(buffer) - 1, ce->ce_fp)) { int n; - cp = buffer + strlen (buffer) - 1; + cp = buffer + strlen(buffer) - 1; if ((c = *cp) == '\n') *cp = '\0'; - if (strncmp (cp = buffer, "From ", sizeof("From ") - 1) == 0) { - fprintf (out, "=%02X", *cp++ & 0xff); + if (strncmp(cp = buffer, "From ", sizeof("From ") - 1) == 0) { + fprintf(out, "=%02X", *cp++ & 0xff); n = 3; } else { n = 0; } for (; *cp; cp++) { if (n > CPERLIN - 3) { - fputs ("=\n", out); + fputs("=\n", out); n = 0; } switch (*cp) { - case ' ': - case '\t': - putc (*cp, out); - n++; - break; - - default: - if (*cp < '!' || *cp > '~' - || (ebcdicsw && !ebcdicsafe[*cp & 0xff])) - goto three_print; - putc (*cp, out); - n++; - break; - - case '=': + case ' ': + case '\t': + putc(*cp, out); + n++; + break; + + default: + if (*cp < '!' || *cp > '~') + goto three_print; + putc(*cp, out); + n++; + break; + + case '=': three_print: - fprintf (out, "=%02X", *cp & 0xff); - n += 3; - break; + fprintf(out, "=%02X", *cp & 0xff); + n += 3; + break; } } if (c == '\n') { if (cp > buffer && (*--cp == ' ' || *cp == '\t')) - fputs ("=\n", out); + fputs("=\n", out); - putc ('\n', out); + putc('\n', out); } else { - fputs ("=\n", out); + fputs("=\n", out); } } @@ -410,11 +271,11 @@ three_print: /* - * Output a content using base64 - */ +** Output a content using base64 +*/ static int -writeBase64 (CT ct, FILE *out) +writeBase64(CT ct, FILE *out) { int fd, result; char *file; @@ -424,20 +285,20 @@ writeBase64 (CT ct, FILE *out) if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; - result = writeBase64aux (ce->ce_fp, out); + result = writeBase64aux(ce->ce_fp, out); (*ct->c_ceclosefnx) (ct); return result; } -int -writeBase64aux (FILE *in, FILE *out) +static int +writeBase64aux(FILE *in, FILE *out) { - int cc, n; + unsigned int cc, n; char inbuf[3]; n = BPERLIN; - while ((cc = fread (inbuf, sizeof(*inbuf), sizeof(inbuf), in)) > 0) { + while ((cc = fread(inbuf, sizeof(*inbuf), sizeof(inbuf), in)) > 0) { unsigned long bits; char *bp; char outbuf[4]; @@ -459,20 +320,20 @@ writeBase64aux (FILE *in, FILE *out) outbuf[2] = '='; } - fwrite (outbuf, sizeof(*outbuf), sizeof(outbuf), out); + fwrite(outbuf, sizeof(*outbuf), sizeof(outbuf), out); if (cc < sizeof(inbuf)) { - putc ('\n', out); + putc('\n', out); return OK; } if (--n <= 0) { n = BPERLIN; - putc ('\n', out); + putc('\n', out); } } if (n != BPERLIN) - putc ('\n', out); + putc('\n', out); return OK; }