X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhbuildsbr.c;h=873b0e3a8c2e5ca877daebe63ecd041939b4d0fa;hp=1ca8091013ea46d581d4d6de138de799b9aee80c;hb=d39e2c447b0d163a5a63f480b23d06edb7a73aa0;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1 diff --git a/uip/mhbuildsbr.c b/uip/mhbuildsbr.c index 1ca8091..873b0e3 100644 --- a/uip/mhbuildsbr.c +++ b/uip/mhbuildsbr.c @@ -1,18 +1,18 @@ /* - * mhbuildsbr.c -- routines to expand/translate MIME composition files - * - * 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. - */ +** mhbuildsbr.c -- routines to expand/translate MIME composition files +** +** 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. +*/ /* - * This code was originally part of mhn.c. I split it into - * a separate program (mhbuild.c) and then later split it - * again (mhbuildsbr.c). But the code still has some of - * the mhn.c code in it. This program needs additional - * streamlining and removal of unneeded code. - */ +** This code was originally part of mhn.c. I split it into +** a separate program (mhbuild.c) and then later split it +** again (mhbuildsbr.c). But the code still has some of +** the mhn.c code in it. This program needs additional +** streamlining and removal of unneeded code. +*/ #include #include @@ -57,9 +57,9 @@ extern int rcachesw; /* mhcachesbr.c */ extern int wcachesw; /* mhcachesbr.c */ /* - * Directory to place tmp files. This must - * be set before these routines are called. - */ +** Directory to place tmp files. This must +** be set before these routines are called. +*/ char *tmp; pid_t xpid = 0; @@ -68,49 +68,49 @@ static char prefix[] = "----- =_aaaaaaaaaa"; /* mhmisc.c */ -int make_intermediates (char *); -void content_error (char *, CT, char *, ...); +int make_intermediates(char *); +void content_error(char *, CT, char *, ...); /* mhcachesbr.c */ -int find_cache (CT, int, int *, char *, char *, int); +int find_cache(CT, int, int *, char *, char *, int); /* ftpsbr.c */ -int ftp_get (char *, char *, char *, char *, char *, char *, int, int); +int ftp_get(char *, char *, char *, char *, char *, char *, int, int); /* mhfree.c */ -void free_content (CT); -void free_ctinfo (CT); -void free_encoding (CT, int); +void free_content(CT); +void free_ctinfo(CT); +void free_encoding(CT, int); /* - * prototypes - */ -CT build_mime (char *); +** prototypes +*/ +CT build_mime(char *); /* - * static prototypes - */ -static int init_decoded_content (CT); -static char *fgetstr (char *, int, FILE *); -static int user_content (FILE *, char *, char *, CT *); -static void set_id (CT, int); -static int compose_content (CT); -static int scan_content (CT); -static int build_headers (CT); -static char *calculate_digest (CT, int); +** static prototypes +*/ +static int init_decoded_content(CT); +static char *fgetstr(char *, int, FILE *); +static int user_content(FILE *, char *, char *, CT *); +static void set_id(CT, int); +static int compose_content(CT); +static int scan_content(CT); +static int build_headers(CT); +static char *calculate_digest(CT, int); /* - * Main routine for translating composition file - * into valid MIME message. It translates the draft - * into a content structure (actually a tree of content - * structures). This message then can be manipulated - * in various ways, including being output via - * output_message(). - */ +** Main routine for translating composition file +** into valid MIME message. It translates the draft +** into a content structure (actually a tree of content +** structures). This message then can be manipulated +** in various ways, including being output via +** output_message(). +*/ CT -build_mime (char *infile) +build_mime(char *infile) { int compnum, state; char buf[BUFSIZ], name[NAMESZ]; @@ -120,150 +120,156 @@ build_mime (char *infile) CT ct; FILE *in; - umask (~m_gmprot ()); + umask(~m_gmprot()); /* open the composition draft */ - if ((in = fopen (infile, "r")) == NULL) - adios (infile, "unable to open for reading"); + if ((in = fopen(infile, "r")) == NULL) + adios(infile, "unable to open for reading"); /* - * Allocate space for primary (outside) content - */ - if ((ct = (CT) calloc (1, sizeof(*ct))) == NULL) - adios (NULL, "out of memory"); + ** Allocate space for primary (outside) content + */ + if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL) + adios(NULL, "out of memory"); /* - * Allocate structure for handling decoded content - * for this part. We don't really need this, but - * allocate it to remain consistent. - */ - init_decoded_content (ct); + ** Allocate structure for handling decoded content + ** for this part. We don't really need this, but + ** allocate it to remain consistent. + */ + init_decoded_content(ct); /* - * Parse some of the header fields in the composition - * draft into the linked list of header fields for - * the new MIME message. - */ + ** Parse some of the header fields in the composition + ** draft into the linked list of header fields for + ** the new MIME message. + */ for (compnum = 1, state = FLD;;) { - switch (state = m_getfld (state, name, buf, sizeof(buf), in)) { + switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { case FLD: case FLDPLUS: case FLDEOF: compnum++; /* abort if draft has Mime-Version header field */ - if (!mh_strcasecmp (name, VRSN_FIELD)) - adios (NULL, "draft shouldn't contain %s: field", VRSN_FIELD); + if (!mh_strcasecmp(name, VRSN_FIELD)) + adios(NULL, "draft shouldn't contain %s: field", VRSN_FIELD); - /* abort if draft has Content-Transfer-Encoding header field */ - if (!mh_strcasecmp (name, ENCODING_FIELD)) - adios (NULL, "draft shouldn't contain %s: field", ENCODING_FIELD); + /* + ** abort if draft has Content-Transfer-Encoding + ** header field + */ + if (!mh_strcasecmp(name, ENCODING_FIELD)) + adios(NULL, "draft shouldn't contain %s: field", ENCODING_FIELD); /* ignore any Content-Type fields in the header */ - if (!mh_strcasecmp (name, TYPE_FIELD)) { + if (!mh_strcasecmp(name, TYPE_FIELD)) { while (state == FLDPLUS) - state = m_getfld (state, name, buf, sizeof(buf), in); + state = m_getfld(state, name, buf, + sizeof(buf), in); goto finish_field; } /* get copies of the buffers */ - np = add (name, NULL); - vp = add (buf, NULL); + np = getcpy(name); + vp = getcpy(buf); /* if necessary, get rest of field */ while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof(buf), in); - vp = add (buf, vp); /* add to previous value */ + state = m_getfld(state, name, buf, + sizeof(buf), in); + vp = add(buf, vp); /* add to prev value */ } /* Now add the header data to the list */ - add_header (ct, np, vp); + add_header(ct, np, vp); finish_field: - /* if this wasn't the last header field, then continue */ + /* if this wasn't the last hdr field, then continue */ if (state != FLDEOF) continue; /* else fall... */ case FILEEOF: - adios (NULL, "draft has empty body -- no directives!"); + adios(NULL, "draft has empty body -- no directives!"); /* NOTREACHED */ case BODY: case BODYEOF: - fseek (in, (long) (-strlen (buf)), SEEK_CUR); + fseek(in, (long) (-strlen(buf)), SEEK_CUR); break; case LENERR: case FMTERR: - adios (NULL, "message format error in component #%d", compnum); + adios(NULL, "message format error in component #%d", + compnum); default: - adios (NULL, "getfld() returned %d", state); + adios(NULL, "getfld() returned %d", state); } break; } /* - * Now add the MIME-Version header field - * to the list of header fields. - */ - np = add (VRSN_FIELD, NULL); - vp = concat (" ", VRSN_VALUE, "\n", NULL); - add_header (ct, np, vp); + ** Now add the MIME-Version header field + ** to the list of header fields. + */ + np = getcpy(VRSN_FIELD); + vp = concat(" ", VRSN_VALUE, "\n", NULL); + add_header(ct, np, vp); /* - * We initally assume we will find multiple contents in the - * draft. So create a multipart/mixed content to hold everything. - * We can remove this later, if it is not needed. - */ - if (get_ctinfo ("multipart/mixed", ct, 0) == NOTOK) - done (1); + ** We initally assume we will find multiple contents in the + ** draft. So create a multipart/mixed content to hold everything. + ** We can remove this later, if it is not needed. + */ + if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK) + done(1); ct->c_type = CT_MULTIPART; ct->c_subtype = MULTI_MIXED; - ct->c_file = add (infile, NULL); + ct->c_file = getcpy(infile); - if ((m = (struct multipart *) calloc (1, sizeof(*m))) == NULL) - adios (NULL, "out of memory"); + if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL) + adios(NULL, "out of memory"); ct->c_ctparams = (void *) m; pp = &m->mp_parts; /* - * read and parse the composition file - * and the directives it contains. - */ - while (fgetstr (buf, sizeof(buf) - 1, in)) { + ** read and parse the composition file + ** and the directives it contains. + */ + while (fgetstr(buf, sizeof(buf) - 1, in)) { struct part *part; CT p; - if (user_content (in, infile, buf, &p) == DONE) { - admonish (NULL, "ignoring spurious #end"); + if (user_content(in, infile, buf, &p) == DONE) { + admonish(NULL, "ignoring spurious #end"); continue; } if (!p) continue; - if ((part = (struct part *) calloc (1, sizeof(*part))) == NULL) - adios (NULL, "out of memory"); + if ((part = (struct part *) calloc(1, sizeof(*part))) == NULL) + adios(NULL, "out of memory"); *pp = part; pp = &part->mp_next; part->mp_part = p; } /* - * close the composition draft since - * it's not needed any longer. - */ - fclose (in); + ** close the composition draft since + ** it's not needed any longer. + */ + fclose(in); /* check if any contents were found */ if (!m->mp_parts) - adios (NULL, "no content directives found"); + adios(NULL, "no content directives found"); /* - * If only one content was found, then remove and - * free the outer multipart content. - */ + ** If only one content was found, then remove and + ** free the outer multipart content. + */ if (!m->mp_parts->mp_next) { CT p; @@ -276,56 +282,56 @@ finish_field: ct->c_first_hf = NULL; ct->c_last_hf = NULL; - free_content (ct); + free_content(ct); ct = p; } else { - set_id (ct, 1); + set_id(ct, 1); } /* - * Fill out, or expand directives. Parse and execute - * commands specified by profile composition strings. - */ - compose_content (ct); + ** Fill out, or expand directives. Parse and execute + ** commands specified by profile composition strings. + */ + compose_content(ct); if ((cp = strchr(prefix, 'a')) == NULL) - adios (NULL, "internal error(4)"); + adios(NULL, "internal error(4)"); /* - * Scan the contents. Choose a transfer encoding, and - * check if prefix for multipart boundary clashes with - * any of the contents. - */ - while (scan_content (ct) == NOTOK) { + ** Scan the contents. Choose a transfer encoding, and + ** check if prefix for multipart boundary clashes with + ** any of the contents. + */ + while (scan_content(ct) == NOTOK) { if (*cp < 'z') { (*cp)++; } else { if (*++cp == 0) - adios (NULL, "giving up trying to find a unique delimiter string"); + adios(NULL, "giving up trying to find a unique delimiter string"); else (*cp)++; } } /* Build the rest of the header field structures */ - build_headers (ct); + build_headers(ct); return ct; } /* - * Set up structures for placing unencoded - * content when building parts. - */ +** Set up structures for placing unencoded +** content when building parts. +*/ static int -init_decoded_content (CT ct) +init_decoded_content(CT ct) { CE ce; - if ((ce = (CE) calloc (1, sizeof(*ce))) == NULL) - adios (NULL, "out of memory"); + if ((ce = (CE) calloc(1, sizeof(*ce))) == NULL) + adios(NULL, "out of memory"); ct->c_cefile = ce; ct->c_ceopenfnx = open7Bit; /* since unencoded */ @@ -337,19 +343,19 @@ init_decoded_content (CT ct) static char * -fgetstr (char *s, int n, FILE *stream) +fgetstr(char *s, int n, FILE *stream) { char *cp, *ep; for (ep = (cp = s) + n; cp < ep; ) { int i; - if (!fgets (cp, n, stream)) + if (!fgets(cp, n, stream)) return (cp != s ? s : NULL); if (cp == s && *cp != '#') return s; - cp += (i = strlen (cp)) - 1; + cp += (i = strlen(cp)) - 1; if (i <= 1 || *cp-- != '\n' || *cp != '\\') break; *cp = '\0'; @@ -361,12 +367,12 @@ fgetstr (char *s, int n, FILE *stream) /* - * Parse the composition draft for text and directives. - * Do initial setup of Content structure. - */ +** Parse the composition draft for text and directives. +** Do initial setup of Content structure. +*/ static int -user_content (FILE *in, char *file, char *buf, CT *ctp) +user_content(FILE *in, char *file, char *buf, CT *ctp) { int extrnal, vrsn; unsigned char *cp; @@ -380,31 +386,31 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) CT ct; CE ce; - if (buf[0] == '\n' || strcmp (buf, "#\n") == 0) { + if (buf[0] == '\n' || strcmp(buf, "#\n") == 0) { *ctp = NULL; return OK; } /* allocate basic Content structure */ - if ((ct = (CT) calloc (1, sizeof(*ct))) == NULL) - adios (NULL, "out of memory"); + if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL) + adios(NULL, "out of memory"); *ctp = ct; /* allocate basic structure for handling decoded content */ - init_decoded_content (ct); + init_decoded_content(ct); ce = ct->c_cefile; ci = &ct->c_ctinfo; - set_id (ct, 0); + set_id(ct, 0); /* - * Handle inline text. Check if line - * is one of the following forms: - * - * 1) doesn't begin with '#' (implicit directive) - * 2) begins with "##" (implicit directive) - * 3) begins with "#<" - */ + ** Handle inline text. Check if line + ** is one of the following forms: + ** + ** 1) doesn't begin with '#' (implicit directive) + ** 2) begins with "##" (implicit directive) + ** 3) begins with "#<" + */ if (buf[0] != '#' || buf[1] == '#' || buf[1] == '<') { int headers; int inlineD; @@ -414,14 +420,15 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) char *cp; cp = m_mktemp2(NULL, invo_name, NULL, &out); - if (cp == NULL) adios("mhbuildsbr", "unable to create temporary file"); + if (cp == NULL) + adios("mhbuildsbr", "unable to create temporary file"); /* use a temp file to collect the plain text lines */ - ce->ce_file = add (cp, NULL); + ce->ce_file = getcpy(cp); ce->ce_unlink = 1; if (buf[0] == '#' && buf[1] == '<') { - strncpy (content, buf + 2, sizeof(content)); + strncpy(content, buf + 2, sizeof(content)); inlineD = 1; goto rock_and_roll; } else { @@ -429,20 +436,20 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) } /* the directive is implicit */ - strncpy (content, "text/plain", sizeof(content)); + strncpy(content, "text/plain", sizeof(content)); headers = 0; - strncpy (buffer, buf[0] != '#' ? buf : buf + 1, sizeof(buffer)); + strncpy(buffer, buf[0] != '#' ? buf : buf + 1, sizeof(buffer)); for (;;) { int i; - if (headers >= 0 && uprf (buffer, DESCR_FIELD) - && buffer[i = strlen (DESCR_FIELD)] == ':') { + if (headers >= 0 && uprf(buffer, DESCR_FIELD) && + buffer[i=strlen(DESCR_FIELD)] == ':') { headers = 1; again_descr: - ct->c_descr = add (buffer + i + 1, ct->c_descr); - if (!fgetstr (buffer, sizeof(buffer) - 1, in)) - adios (NULL, "end-of-file after %s: field in plaintext", DESCR_FIELD); + ct->c_descr = add(buffer + i + 1, ct->c_descr); + if (!fgetstr(buffer, sizeof(buffer) - 1, in)) + adios(NULL, "end-of-file after %s: field in plaintext", DESCR_FIELD); switch (buffer[0]) { case ' ': case '\t': @@ -450,7 +457,7 @@ again_descr: goto again_descr; case '#': - adios (NULL, "#-directive after %s: field in plaintext", DESCR_FIELD); + adios(NULL, "#-directive after %s: field in plaintext", DESCR_FIELD); /* NOTREACHED */ default: @@ -458,14 +465,14 @@ again_descr: } } - if (headers >= 0 && uprf (buffer, DISPO_FIELD) - && buffer[i = strlen (DISPO_FIELD)] == ':') { + if (headers >= 0 && uprf(buffer, DISPO_FIELD) + && buffer[i = strlen(DISPO_FIELD)] == ':') { headers = 1; again_dispo: - ct->c_dispo = add (buffer + i + 1, ct->c_dispo); - if (!fgetstr (buffer, sizeof(buffer) - 1, in)) - adios (NULL, "end-of-file after %s: field in plaintext", DISPO_FIELD); + ct->c_dispo = add(buffer + i + 1, ct->c_dispo); + if (!fgetstr(buffer, sizeof(buffer) - 1, in)) + adios(NULL, "end-of-file after %s: field in plaintext", DISPO_FIELD); switch (buffer[0]) { case ' ': case '\t': @@ -473,7 +480,7 @@ again_dispo: goto again_dispo; case '#': - adios (NULL, "#-directive after %s: field in plaintext", DISPO_FIELD); + adios(NULL, "#-directive after %s: field in plaintext", DISPO_FIELD); /* NOTREACHED */ default: @@ -482,12 +489,13 @@ again_dispo: } if (headers != 1 || buffer[0] != '\n') - fputs (buffer, out); + fputs(buffer, out); rock_and_roll: headers = -1; - pos = ftell (in); - if ((cp = fgetstr (buffer, sizeof(buffer) - 1, in)) == NULL) + pos = ftell(in); + if ((cp = fgetstr(buffer, sizeof(buffer) - 1, in)) + == NULL) break; if (buffer[0] == '#') { char *bp; @@ -501,32 +509,33 @@ rock_and_roll: } if (listsw) - ct->c_end = ftell (out); - fclose (out); + ct->c_end = ftell(out); + fclose(out); /* parse content type */ - if (get_ctinfo (content, ct, inlineD) == NOTOK) - done (1); + if (get_ctinfo(content, ct, inlineD) == NOTOK) + done(1); for (s2i = str2cts; s2i->si_key; s2i++) - if (!mh_strcasecmp (ci->ci_type, s2i->si_key)) + if (!mh_strcasecmp(ci->ci_type, s2i->si_key)) break; - if (!s2i->si_key && !uprf (ci->ci_type, "X-")) + if (!s2i->si_key && !uprf(ci->ci_type, "X-")) s2i++; /* - * check type specified (possibly implicitly) - */ + ** check type specified (possibly implicitly) + */ switch (ct->c_type = s2i->si_val) { case CT_MESSAGE: - if (!mh_strcasecmp (ci->ci_subtype, "rfc822")) { + if (!mh_strcasecmp(ci->ci_subtype, "rfc822")) { ct->c_encoding = CE_7BIT; goto call_init; } /* else fall... */ case CT_MULTIPART: - adios (NULL, "it doesn't make sense to define an in-line %s content", - ct->c_type == CT_MESSAGE ? "message" : "multipart"); + adios(NULL, "it doesn't make sense to define an in-line %s content", + ct->c_type == CT_MESSAGE ? "message" : + "multipart"); /* NOTREACHED */ default: @@ -537,55 +546,50 @@ call_init: } if (cp) - fseek (in, pos, SEEK_SET); + fseek(in, pos, SEEK_SET); return OK; } /* - * If we've reached this point, the next line - * must be some type of explicit directive. - */ + ** If we've reached this point, the next line + ** must be some type of explicit directive. + */ /* check if directive is external-type */ extrnal = (buf[1] == '@'); /* parse directive */ - if (get_ctinfo (buf + (extrnal ? 2 : 1), ct, 1) == NOTOK) - done (1); + if (get_ctinfo(buf + (extrnal ? 2 : 1), ct, 1) == NOTOK) + done(1); /* check directive against the list of MIME types */ for (s2i = str2cts; s2i->si_key; s2i++) - if (!mh_strcasecmp (ci->ci_type, s2i->si_key)) + if (!mh_strcasecmp(ci->ci_type, s2i->si_key)) break; /* - * Check if the directive specified a valid type. - * This will happen if it was one of the following forms: - * - * #type/subtype (or) - * #@type/subtype - */ + ** Check if the directive specified a valid type. + ** This will happen if it was one of the following forms: + ** + ** #type/subtype (or) + ** #@type/subtype + */ if (s2i->si_key) { if (!ci->ci_subtype) - adios (NULL, "missing subtype in \"#%s\"", ci->ci_type); + adios(NULL, "missing subtype in \"#%s\"", ci->ci_type); switch (ct->c_type = s2i->si_val) { case CT_MULTIPART: - adios (NULL, "use \"#begin ... #end\" instead of \"#%s/%s\"", - ci->ci_type, ci->ci_subtype); + adios(NULL, "use \"#begin ... #end\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); /* NOTREACHED */ case CT_MESSAGE: - if (!mh_strcasecmp (ci->ci_subtype, "partial")) - adios (NULL, "sorry, \"#%s/%s\" isn't supported", - ci->ci_type, ci->ci_subtype); - if (!mh_strcasecmp (ci->ci_subtype, "external-body")) - adios (NULL, "use \"#@type/subtype ... [] ...\" instead of \"#%s/%s\"", - ci->ci_type, ci->ci_subtype); + if (!mh_strcasecmp(ci->ci_subtype, "partial")) + adios(NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype); + if (!mh_strcasecmp(ci->ci_subtype, "external-body")) + adios(NULL, "use \"#@type/subtype ... [] ...\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); use_forw: - adios (NULL, - "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", - ci->ci_type, ci->ci_subtype); + adios(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); /* NOTREACHED */ default: @@ -595,46 +599,47 @@ use_forw: } /* - * #@type/subtype (external types directive) - */ + ** #@type/subtype (external types directive) + */ if (extrnal) { struct exbody *e; CT p; if (!ci->ci_magic) - adios (NULL, "need external information for \"#@%s/%s\"", - ci->ci_type, ci->ci_subtype); + adios(NULL, "need external information for \"#@%s/%s\"", ci->ci_type, ci->ci_subtype); p = ct; - snprintf (buffer, sizeof(buffer), "message/external-body; %s", ci->ci_magic); - free (ci->ci_magic); + snprintf(buffer, sizeof(buffer), "message/external-body; %s", ci->ci_magic); + free(ci->ci_magic); ci->ci_magic = NULL; /* - * Since we are using the current Content structure to - * hold information about the type of the external - * reference, we need to create another Content structure - * for the message/external-body to wrap it in. - */ - if ((ct = (CT) calloc (1, sizeof(*ct))) == NULL) - adios (NULL, "out of memory"); + ** Since we are using the current Content structure to + ** hold information about the type of the external + ** reference, we need to create another Content + ** structure for the message/external-body to wrap + ** it in. + */ + if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL) + adios(NULL, "out of memory"); *ctp = ct; ci = &ct->c_ctinfo; - if (get_ctinfo (buffer, ct, 0) == NOTOK) - done (1); + if (get_ctinfo(buffer, ct, 0) == NOTOK) + done(1); ct->c_type = CT_MESSAGE; ct->c_subtype = MESSAGE_EXTERNAL; - if ((e = (struct exbody *) calloc (1, sizeof(*e))) == NULL) - adios (NULL, "out of memory"); + if ((e = (struct exbody *) + calloc(1, sizeof(*e))) == NULL) + adios(NULL, "out of memory"); ct->c_ctparams = (void *) e; e->eb_parent = ct; e->eb_content = p; p->c_ctexbody = e; - if (params_external (ct, 1) == NOTOK) - done (1); + if (params_external(ct, 1) == NOTOK) + done(1); return OK; } @@ -643,19 +648,19 @@ use_forw: if (ci->ci_magic) { /* check if specifies command to execute */ if (*ci->ci_magic == '|' || *ci->ci_magic == '!') { - for (cp = ci->ci_magic + 1; isspace (*cp); cp++) + for (cp = ci->ci_magic + 1; isspace(*cp); cp++) continue; if (!*cp) - adios (NULL, "empty pipe command for #%s directive", ci->ci_type); - cp = add (cp, NULL); - free (ci->ci_magic); + adios(NULL, "empty pipe command for #%s directive", ci->ci_type); + cp = getcpy(cp); + free(ci->ci_magic); ci->ci_magic = cp; } else { /* record filename of decoded contents */ ce->ce_file = ci->ci_magic; - if (access (ce->ce_file, R_OK) == NOTOK) - adios ("reading", "unable to access %s for", ce->ce_file); - if (listsw && stat (ce->ce_file, &st) != NOTOK) + if (access(ce->ce_file, R_OK) == NOTOK) + adios("reading", "unable to access %s for", ce->ce_file); + if (listsw && stat(ce->ce_file, &st) != NOTOK) ct->c_end = (long) st.st_size; ci->ci_magic = NULL; } @@ -663,37 +668,40 @@ use_forw: } /* - * No [file] argument, so check profile for - * method to compose content. - */ - snprintf (buffer, sizeof(buffer), "%s-compose-%s/%s", + ** No [file] argument, so check profile for + ** method to compose content. + */ + snprintf(buffer, sizeof(buffer), "%s-compose-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); - if ((cp = context_find (buffer)) == NULL || *cp == '\0') { - snprintf (buffer, sizeof(buffer), "%s-compose-%s", invo_name, ci->ci_type); - if ((cp = context_find (buffer)) == NULL || *cp == '\0') { - content_error (NULL, ct, "don't know how to compose content"); - done (1); + if ((cp = context_find(buffer)) == NULL || *cp == '\0') { + snprintf(buffer, sizeof(buffer), "%s-compose-%s", + invo_name, ci->ci_type); + if ((cp = context_find(buffer)) == NULL || + *cp == '\0') { + content_error(NULL, ct, "don't know how to compose content"); + done(1); } } - ci->ci_magic = add (cp, NULL); + ci->ci_magic = getcpy(cp); return OK; } if (extrnal) - adios (NULL, "external definition not allowed for \"#%s\"", ci->ci_type); + adios(NULL, "external definition not allowed for \"#%s\"", + ci->ci_type); /* - * Message directive - * #forw [+folder] [msgs] - */ - if (!mh_strcasecmp (ci->ci_type, "forw")) { + ** Message directive + ** #forw [+folder] [msgs] + */ + if (!mh_strcasecmp(ci->ci_type, "forw")) { int msgnum; char *folder, *arguments[MAXARGS]; struct msgs *mp; if (ci->ci_magic) { - ap = brkstring (ci->ci_magic, " ", "\n"); - copyip (ap, arguments, MAXARGS); + ap = brkstring(ci->ci_magic, " ", "\n"); + copyip(ap, arguments, MAXARGS); } else { arguments[0] = "cur"; arguments[1] = NULL; @@ -705,42 +713,43 @@ use_forw: cp = *ap; if (*cp == '+' || *cp == '@') { if (folder) - adios (NULL, "only one folder per #forw directive"); + adios(NULL, "only one folder per #forw directive"); else - folder = pluspath (cp); + folder = getcpy(expandfol(cp)); } } /* else, use the current folder */ if (!folder) - folder = add (getfolder (1), NULL); + folder = getcpy(getcurfol()); - if (!(mp = folder_read (folder))) - adios (NULL, "unable to read folder %s", folder); + if (!(mp = folder_read(folder))) + adios(NULL, "unable to read folder %s", folder); for (ap = arguments; *ap; ap++) { cp = *ap; if (*cp != '+' && *cp != '@') - if (!m_convert (mp, cp)) - done (1); + if (!m_convert(mp, cp)) + done(1); } - free (folder); - free_ctinfo (ct); + free(folder); + free_ctinfo(ct); /* - * If there is more than one message to include, make this - * a content of type "multipart/digest" and insert each message - * as a subpart. If there is only one message, then make this - * a content of type "message/rfc822". - */ + ** If there is more than one message to include, make this + ** a content of type "multipart/digest" and insert each message + ** as a subpart. If there is only one message, then make this + ** a content of type "message/rfc822". + */ if (mp->numsel > 1) { /* we are forwarding multiple messages */ - if (get_ctinfo ("multipart/digest", ct, 0) == NOTOK) - done (1); + if (get_ctinfo("multipart/digest", ct, 0) == NOTOK) + done(1); ct->c_type = CT_MULTIPART; ct->c_subtype = MULTI_DIGEST; - if ((m = (struct multipart *) calloc (1, sizeof(*m))) == NULL) - adios (NULL, "out of memory"); + if ((m = (struct multipart *) + calloc(1, sizeof(*m))) == NULL) + adios(NULL, "out of memory"); ct->c_ctparams = (void *) m; pp = &m->mp_parts; @@ -750,22 +759,27 @@ use_forw: CT p; CE pe; - if ((p = (CT) calloc (1, sizeof(*p))) == NULL) - adios (NULL, "out of memory"); - init_decoded_content (p); + if ((p = (CT) calloc(1, sizeof(*p))) + == NULL) + adios(NULL, "out of memory"); + init_decoded_content(p); pe = p->c_cefile; - if (get_ctinfo ("message/rfc822", p, 0) == NOTOK) - done (1); + if (get_ctinfo("message/rfc822", p, 0) + == NOTOK) + done(1); p->c_type = CT_MESSAGE; p->c_subtype = MESSAGE_RFC822; - snprintf (buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum); - pe->ce_file = add (buffer, NULL); - if (listsw && stat (pe->ce_file, &st) != NOTOK) + snprintf(buffer, sizeof(buffer), + "%s/%d", mp->foldpath, + msgnum); + pe->ce_file = getcpy(buffer); + if (listsw && stat(pe->ce_file, &st) + != NOTOK) p->c_end = (long) st.st_size; - if ((part = (struct part *) calloc (1, sizeof(*part))) == NULL) - adios (NULL, "out of memory"); + if ((part = (struct part *) calloc(1, sizeof(*part))) == NULL) + adios(NULL, "out of memory"); *pp = part; pp = &part->mp_next; part->mp_part = p; @@ -773,95 +787,97 @@ use_forw: } } else { /* we are forwarding one message */ - if (get_ctinfo ("message/rfc822", ct, 0) == NOTOK) - done (1); + if (get_ctinfo("message/rfc822", ct, 0) == NOTOK) + done(1); ct->c_type = CT_MESSAGE; ct->c_subtype = MESSAGE_RFC822; msgnum = mp->lowsel; - snprintf (buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum); - ce->ce_file = add (buffer, NULL); - if (listsw && stat (ce->ce_file, &st) != NOTOK) + snprintf(buffer, sizeof(buffer), "%s/%d", + mp->foldpath, msgnum); + ce->ce_file = getcpy(buffer); + if (listsw && stat(ce->ce_file, &st) != NOTOK) ct->c_end = (long) st.st_size; } - folder_free (mp); /* free folder/message structure */ + folder_free(mp); /* free folder/message structure */ return OK; } /* - * #end - */ - if (!mh_strcasecmp (ci->ci_type, "end")) { - free_content (ct); + ** #end + */ + if (!mh_strcasecmp(ci->ci_type, "end")) { + free_content(ct); *ctp = NULL; return DONE; } /* - * #begin [ alternative | parallel ] - */ - if (!mh_strcasecmp (ci->ci_type, "begin")) { + ** #begin [ alternative | parallel ] + */ + if (!mh_strcasecmp(ci->ci_type, "begin")) { if (!ci->ci_magic) { vrsn = MULTI_MIXED; cp = SubMultiPart[vrsn - 1].kv_key; - } else if (!mh_strcasecmp (ci->ci_magic, "alternative")) { + } else if (!mh_strcasecmp(ci->ci_magic, "alternative")) { vrsn = MULTI_ALTERNATE; cp = SubMultiPart[vrsn - 1].kv_key; - } else if (!mh_strcasecmp (ci->ci_magic, "parallel")) { + } else if (!mh_strcasecmp(ci->ci_magic, "parallel")) { vrsn = MULTI_PARALLEL; cp = SubMultiPart[vrsn - 1].kv_key; - } else if (uprf (ci->ci_magic, "digest")) { + } else if (uprf(ci->ci_magic, "digest")) { goto use_forw; } else { vrsn = MULTI_UNKNOWN; cp = ci->ci_magic; } - free_ctinfo (ct); - snprintf (buffer, sizeof(buffer), "multipart/%s", cp); - if (get_ctinfo (buffer, ct, 0) == NOTOK) - done (1); + free_ctinfo(ct); + snprintf(buffer, sizeof(buffer), "multipart/%s", cp); + if (get_ctinfo(buffer, ct, 0) == NOTOK) + done(1); ct->c_type = CT_MULTIPART; ct->c_subtype = vrsn; - if ((m = (struct multipart *) calloc (1, sizeof(*m))) == NULL) - adios (NULL, "out of memory"); + if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL) + adios(NULL, "out of memory"); ct->c_ctparams = (void *) m; pp = &m->mp_parts; - while (fgetstr (buffer, sizeof(buffer) - 1, in)) { + while (fgetstr(buffer, sizeof(buffer) - 1, in)) { struct part *part; CT p; - if (user_content (in, file, buffer, &p) == DONE) { + if (user_content(in, file, buffer, &p) == DONE) { if (!m->mp_parts) - adios (NULL, "empty \"#begin ... #end\" sequence"); + adios(NULL, "empty \"#begin ... #end\" sequence"); return OK; } if (!p) continue; - if ((part = (struct part *) calloc (1, sizeof(*part))) == NULL) - adios (NULL, "out of memory"); + if ((part = (struct part *) + calloc(1, sizeof(*part))) == NULL) + adios(NULL, "out of memory"); *pp = part; pp = &part->mp_next; part->mp_part = p; } - admonish (NULL, "premature end-of-file, missing #end"); + admonish(NULL, "premature end-of-file, missing #end"); return OK; } /* - * Unknown directive - */ - adios (NULL, "unknown directive \"#%s\"", ci->ci_type); + ** Unknown directive + */ + adios(NULL, "unknown directive \"#%s\"", ci->ci_type); return NOTOK; /* NOT REACHED */ } static void -set_id (CT ct, int top) +set_id(CT ct, int top) { char msgid[BUFSIZ]; static int partno; @@ -869,14 +885,14 @@ set_id (CT ct, int top) static char *msgfmt; if (clock == 0) { - time (&clock); - snprintf (msgid, sizeof(msgid), "<%d.%ld.%%d@%s>\n", + time(&clock); + snprintf(msgid, sizeof(msgid), "<%d.%ld.%%d@%s>\n", (int) getpid(), (long) clock, LocalName()); partno = 0; msgfmt = getcpy(msgid); } - snprintf (msgid, sizeof(msgid), msgfmt, top ? 0 : ++partno); - ct->c_id = getcpy (msgid); + snprintf(msgid, sizeof(msgid), msgfmt, top ? 0 : ++partno); + ct->c_id = getcpy(msgid); } @@ -917,13 +933,13 @@ static char ebcdicsafe[0x100] = { /* - * Fill out, or expand the various contents in the composition - * draft. Read-in any necessary files. Parse and execute any - * commands specified by profile composition strings. - */ +** Fill out, or expand the various contents in the composition +** draft. Read-in any necessary files. Parse and execute any +** commands specified by profile composition strings. +*/ static int -compose_content (CT ct) +compose_content(CT ct) { CE ce = ct->c_cefile; @@ -937,28 +953,30 @@ compose_content (CT ct) struct part *part; if (ct->c_partno) { - snprintf (partnam, sizeof(partnam), "%s.", ct->c_partno); - pp = partnam + strlen (partnam); + snprintf(partnam, sizeof(partnam), "%s.", + ct->c_partno); + pp = partnam + strlen(partnam); } else { pp = partnam; } /* first, we call compose_content on all the subparts */ - for (part = m->mp_parts, partnum = 1; part; part = part->mp_next, partnum++) { + for (part = m->mp_parts, partnum = 1; part; + part = part->mp_next, partnum++) { CT p = part->mp_part; - sprintf (pp, "%d", partnum); - p->c_partno = add (partnam, NULL); - if (compose_content (p) == NOTOK) + sprintf(pp, "%d", partnum); + p->c_partno = getcpy(partnam); + if (compose_content(p) == NOTOK) return NOTOK; } /* - * If the -rfc934mode switch is given, then check all - * the subparts of a multipart/digest. If they are all - * message/rfc822, then mark this content and all - * subparts with the rfc934 compatibility mode flag. - */ + ** If the -rfc934mode switch is given, then check all + ** the subparts of a multipart/digest. If they are all + ** message/rfc822, then mark this content and all + ** subparts with the rfc934 compatibility mode flag. + */ if (rfc934sw && ct->c_subtype == MULTI_DIGEST) { int is934 = 1; @@ -980,7 +998,7 @@ compose_content (CT ct) } if (listsw) { - ct->c_end = (partnum = strlen (prefix) + 2) + 2; + ct->c_end = (partnum = strlen(prefix) + 2) + 2; if (ct->c_rfc934) ct->c_end += 1; @@ -995,8 +1013,8 @@ compose_content (CT ct) break; /* - * Discrete types (text/application/audio/image/video) - */ + ** Discrete types (text/application/audio/image/video) + */ default: if (!ce->ce_file) { pid_t child_id; @@ -1008,13 +1026,13 @@ compose_content (CT ct) char *tfile = NULL; if (!(cp = ci->ci_magic)) - adios (NULL, "internal error(5)"); + adios(NULL, "internal error(5)"); tfile = m_mktemp2(NULL, invo_name, NULL, NULL); if (tfile == NULL) { adios("mhbuildsbr", "unable to create temporary file"); } - ce->ce_file = add (tfile, NULL); + ce->ce_file = getcpy(tfile); ce->ce_unlink = 1; xstdout = 0; @@ -1025,20 +1043,23 @@ compose_content (CT ct) buflen = sizeof(buffer); /* - * Parse composition string into buffer - */ + ** Parse composition string into buffer + */ for ( ; *cp; cp++) { if (*cp == '%') { switch (*++cp) { case 'a': { - /* insert parameters from directive */ + /* + ** insert parameters from + ** directive + */ char **ep; char *s = ""; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { - snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); - len = strlen (bp); + snprintf(bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); + len = strlen(bp); bp += len; buflen -= len; s = " "; @@ -1053,15 +1074,16 @@ compose_content (CT ct) case 'f': /* - * insert temporary filename where - * content should be written - */ - snprintf (bp, buflen, "%s", ce->ce_file); + ** insert temporary filename + ** where content should be + ** written + */ + snprintf(bp, buflen, "%s", ce->ce_file); break; case 's': /* insert content subtype */ - strncpy (bp, ci->ci_subtype, buflen); + strncpy(bp, ci->ci_subtype, buflen); break; case '%': @@ -1074,52 +1096,51 @@ compose_content (CT ct) buflen--; continue; } - len = strlen (bp); + len = strlen(bp); bp += len; buflen -= len; } else { raw: - *bp++ = *cp; - *bp = '\0'; - buflen--; + *bp++ = *cp; + *bp = '\0'; + buflen--; } } if (verbosw) - printf ("composing content %s/%s from command\n\t%s\n", - ci->ci_type, ci->ci_subtype, buffer); + printf("composing content %s/%s from command\n\t%s\n", ci->ci_type, ci->ci_subtype, buffer); - fflush (stdout); /* not sure if need for -noverbose */ + fflush(stdout); /* not sure if need for -noverbose */ vec[0] = "/bin/sh"; vec[1] = "-c"; vec[2] = buffer; vec[3] = NULL; - if ((out = fopen (ce->ce_file, "w")) == NULL) - adios (ce->ce_file, "unable to open for writing"); + if ((out = fopen(ce->ce_file, "w")) == NULL) + adios(ce->ce_file, "unable to open for writing"); for (i = 0; (child_id = vfork()) == NOTOK && i > 5; i++) - sleep (5); + sleep(5); switch (child_id) { case NOTOK: - adios ("fork", "unable to fork"); + adios("fork", "unable to fork"); /* NOTREACHED */ case OK: if (!xstdout) - dup2 (fileno (out), 1); - close (fileno (out)); - execvp ("/bin/sh", vec); - fprintf (stderr, "unable to exec "); - perror ("/bin/sh"); - _exit (-1); + dup2(fileno(out), 1); + close(fileno(out)); + execvp("/bin/sh", vec); + fprintf(stderr, "unable to exec "); + perror("/bin/sh"); + _exit(-1); /* NOTREACHED */ default: - fclose (out); + fclose(out); if (pidXwait(child_id, NULL)) - done (1); + done(1); break; } } @@ -1128,7 +1149,7 @@ raw: if (listsw && ct->c_end == 0L) { struct stat st; - if (stat (ce->ce_file, &st) != NOTOK) + if (stat(ce->ce_file, &st) != NOTOK) ct->c_end = (long) st.st_size; } break; @@ -1139,20 +1160,20 @@ raw: /* - * Scan the content. - * - * 1) choose a transfer encoding. - * 2) check for clashes with multipart boundary string. - * 3) for text content, figure out which character set is being used. - * - * If there is a clash with one of the contents and the multipart boundary, - * this function will exit with NOTOK. This will cause the scanning process - * to be repeated with a different multipart boundary. It is possible - * (although highly unlikely) that this scan will be repeated multiple times. - */ +** Scan the content. +** +** 1) choose a transfer encoding. +** 2) check for clashes with multipart boundary string. +** 3) for text content, figure out which character set is being used. +** +** If there is a clash with one of the contents and the multipart boundary, +** this function will exit with NOTOK. This will cause the scanning process +** to be repeated with a different multipart boundary. It is possible +** (although highly unlikely) that this scan will be repeated multiple times. +*/ static int -scan_content (CT ct) +scan_content(CT ct) { int len; int check8bit = 0, contains8bit = 0; /* check if contains 8bit data */ @@ -1166,9 +1187,9 @@ scan_content (CT ct) CE ce = ct->c_cefile; /* - * handle multipart by scanning all subparts - * and then checking their encoding. - */ + ** handle multipart by scanning all subparts + ** and then checking their encoding. + */ if (ct->c_type == CT_MULTIPART) { struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; @@ -1179,13 +1200,19 @@ scan_content (CT ct) for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; - if (scan_content (p) == NOTOK) /* choose encoding for subpart */ + if (scan_content(p) == NOTOK) { + /* choose encoding for subpart */ return NOTOK; + } - /* if necessary, enlarge encoding for enclosing multipart */ + /* + ** if necessary, enlarge encoding for enclosing + ** multipart + */ if (p->c_encoding == CE_BINARY) ct->c_encoding = CE_BINARY; - if (p->c_encoding == CE_8BIT && ct->c_encoding != CE_BINARY) + if (p->c_encoding == CE_8BIT && + ct->c_encoding != CE_BINARY) ct->c_encoding = CE_8BIT; } @@ -1193,8 +1220,8 @@ scan_content (CT ct) } /* - * Decide what to check while scanning this content. - */ + ** Decide what to check while scanning this content. + */ switch (ct->c_type) { case CT_TEXT: check8bit = 1; @@ -1235,9 +1262,9 @@ scan_content (CT ct) case CT_IMAGE: case CT_VIDEO: /* - * Don't check anything for these types, - * since we are forcing use of base64. - */ + ** Don't check anything for these types, + ** since we are forcing use of base64. + */ check8bit = 0; checkebcdic = 0; checklinelen = 0; @@ -1247,77 +1274,87 @@ scan_content (CT ct) } /* - * Scan the unencoded content - */ + ** Scan the unencoded content + */ if (check8bit || checklinelen || checklinespace || checkboundary) { - if ((in = fopen (ce->ce_file, "r")) == NULL) - adios (ce->ce_file, "unable to open for reading"); - len = strlen (prefix); + if ((in = fopen(ce->ce_file, "r")) == NULL) + adios(ce->ce_file, "unable to open for reading"); + len = strlen(prefix); - while (fgets (buffer, sizeof(buffer) - 1, in)) { + while (fgets(buffer, sizeof(buffer) - 1, in)) { /* - * Check for 8bit data. - */ + ** Check for 8bit data. + */ if (check8bit) { for (cp = buffer; *cp; cp++) { - if (!isascii (*cp)) { + if (!isascii(*cp)) { contains8bit = 1; - check8bit = 0; /* no need to keep checking */ + /* no need to keep checking */ + check8bit = 0; } /* - * Check if character is ebcdic-safe. We only check - * this if also checking for 8bit data. - */ + ** Check if character is ebcdic-safe. + ** We only check this if also checking + ** for 8bit data. + */ if (checkebcdic && !ebcdicsafe[*cp & 0xff]) { ebcdicunsafe = 1; - checkebcdic = 0; /* no need to keep checking */ + /* no need to keep checking */ + checkebcdic = 0; } } } /* - * Check line length. - */ - if (checklinelen && (strlen (buffer) > CPERLIN + 1)) { + ** Check line length. + */ + if (checklinelen && (strlen(buffer) > CPERLIN + 1)) { linelen = 1; checklinelen = 0; /* no need to keep checking */ } /* - * Check if line ends with a space. - */ - if (checklinespace && (cp = buffer + strlen (buffer) - 2) > buffer && isspace (*cp)) { + ** Check if line ends with a space. + */ + if (checklinespace && + (cp = buffer + strlen(buffer) - 2) > + buffer && isspace(*cp)) { linespace = 1; - checklinespace = 0; /* no need to keep checking */ + /* no need to keep checking */ + checklinespace = 0; } /* - * Check if content contains a line that clashes - * with our standard boundary for multipart messages. - */ - if (checkboundary && buffer[0] == '-' && buffer[1] == '-') { - for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--) - if (!isspace (*cp)) + ** Check if content contains a line that clashes + ** with our standard boundary for multipart messages. + */ + if (checkboundary && buffer[0] == '-' && + buffer[1] == '-') { + for (cp = buffer + strlen(buffer) - 1; + cp >= buffer; cp--) + if (!isspace(*cp)) break; *++cp = '\0'; - if (!strncmp(buffer + 2, prefix, len) && isdigit(buffer[2 + len])) { + if (!strncmp(buffer + 2, prefix, len) && + isdigit(buffer[2 + len])) { boundaryclash = 1; - checkboundary = 0; /* no need to keep checking */ + /* no need to keep checking */ + checkboundary = 0; } } } - fclose (in); + fclose(in); } /* - * Decide which transfer encoding to use. - */ + ** Decide which transfer encoding to use. + */ switch (ct->c_type) { case CT_TEXT: /* - * If the text content didn't specify a character - * set, we need to figure out which one was used. - */ + ** If the text content didn't specify a character + ** set, we need to figure out which one was used. + */ t = (struct text *) ct->c_ctparams; if (t->tx_charset == CHARSET_UNSPECIFIED) { CI ci = &ct->c_ctinfo; @@ -1328,10 +1365,11 @@ scan_content (CT ct) if (contains8bit) { t->tx_charset = CHARSET_UNKNOWN; - *ap = concat ("charset=", write_charset_8bit(), NULL); + *ap = concat("charset=", write_charset_8bit(), + NULL); } else { t->tx_charset = CHARSET_USASCII; - *ap = add ("charset=us-ascii", NULL); + *ap = getcpy("charset=us-ascii"); } cp = strchr(*ap++, '='); @@ -1340,7 +1378,8 @@ scan_content (CT ct) *ep = cp; } - if (contains8bit || ebcdicunsafe || linelen || linespace || checksw) + if (contains8bit || ebcdicunsafe || linelen || linespace || + checksw) ct->c_encoding = CE_QUOTED; else ct->c_encoding = CE_7BIT; @@ -1348,9 +1387,11 @@ scan_content (CT ct) case CT_APPLICATION: /* For application type, use base64, except when postscript */ - if (contains8bit || ebcdicunsafe || linelen || linespace || checksw) - ct->c_encoding = (ct->c_subtype == APPLICATION_POSTSCRIPT) - ? CE_QUOTED : CE_BASE64; + if (contains8bit || ebcdicunsafe || linelen || linespace || + checksw) + ct->c_encoding = (ct->c_subtype == + APPLICATION_POSTSCRIPT) ? + CE_QUOTED : CE_BASE64; else ct->c_encoding = CE_7BIT; break; @@ -1372,13 +1413,13 @@ scan_content (CT ct) /* - * Scan the content structures, and build header - * fields that will need to be output into the - * message. - */ +** Scan the content structures, and build header +** fields that will need to be output into the +** message. +*/ static int -build_headers (CT ct) +build_headers(CT ct) { int cc, mailbody, len; char **ap, **ep; @@ -1386,190 +1427,192 @@ build_headers (CT ct) CI ci = &ct->c_ctinfo; /* - * If message is type multipart, then add the multipart - * boundary to the list of attribute/value pairs. - */ + ** If message is type multipart, then add the multipart + ** boundary to the list of attribute/value pairs. + */ if (ct->c_type == CT_MULTIPART) { char *cp; static int level = 0; /* store nesting level */ ap = ci->ci_attrs; ep = ci->ci_values; - snprintf (buffer, sizeof(buffer), "boundary=%s%d", prefix, level++); - cp = strchr(*ap++ = add (buffer, NULL), '='); + snprintf(buffer, sizeof(buffer), "boundary=%s%d", + prefix, level++); + cp = strchr(*ap++ = getcpy(buffer), '='); *ap = NULL; *cp++ = '\0'; *ep = cp; } /* - * Skip the output of Content-Type, parameters, content - * description and disposition, and Content-ID if the - * content is of type "message" and the rfc934 compatibility - * flag is set (which means we are inside multipart/digest - * and the switch -rfc934mode was given). - */ + ** Skip the output of Content-Type, parameters, content + ** description and disposition, and Content-ID if the + ** content is of type "message" and the rfc934 compatibility + ** flag is set (which means we are inside multipart/digest + ** and the switch -rfc934mode was given). + */ if (ct->c_type == CT_MESSAGE && ct->c_rfc934) goto skip_headers; /* - * output the content type and subtype - */ - np = add (TYPE_FIELD, NULL); - vp = concat (" ", ci->ci_type, "/", ci->ci_subtype, NULL); + ** output the content type and subtype + */ + np = getcpy(TYPE_FIELD); + vp = concat(" ", ci->ci_type, "/", ci->ci_subtype, NULL); /* keep track of length of line */ - len = strlen (TYPE_FIELD) + strlen (ci->ci_type) - + strlen (ci->ci_subtype) + 3; + len = strlen(TYPE_FIELD) + strlen(ci->ci_type) + + strlen(ci->ci_subtype) + 3; - mailbody = ct->c_type == CT_MESSAGE - && ct->c_subtype == MESSAGE_EXTERNAL - && ((struct exbody *) ct->c_ctparams)->eb_body; + mailbody = ct->c_type == CT_MESSAGE && + ct->c_subtype == MESSAGE_EXTERNAL && + ((struct exbody *) ct->c_ctparams)->eb_body; /* - * Append the attribute/value pairs to - * the end of the Content-Type line. - */ + ** Append the attribute/value pairs to + ** the end of the Content-Type line. + */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { - if (mailbody && !mh_strcasecmp (*ap, "body")) + if (mailbody && !mh_strcasecmp(*ap, "body")) continue; - vp = add (";", vp); + vp = add(";", vp); len++; - snprintf (buffer, sizeof(buffer), "%s=\"%s\"", *ap, *ep); - if (len + 1 + (cc = strlen (buffer)) >= CPERLIN) { - vp = add ("\n\t", vp); + snprintf(buffer, sizeof(buffer), "%s=\"%s\"", *ap, *ep); + if (len + 1 + (cc = strlen(buffer)) >= CPERLIN) { + vp = add("\n\t", vp); len = 8; } else { - vp = add (" ", vp); + vp = add(" ", vp); len++; } - vp = add (buffer, vp); + vp = add(buffer, vp); len += cc; } /* - * Append any RFC-822 comment to the end of - * the Content-Type line. - */ + ** Append any RFC-822 comment to the end of + ** the Content-Type line. + */ if (ci->ci_comment) { - snprintf (buffer, sizeof(buffer), "(%s)", ci->ci_comment); - if (len + 1 + (cc = 2 + strlen (ci->ci_comment)) >= CPERLIN) { - vp = add ("\n\t", vp); + snprintf(buffer, sizeof(buffer), "(%s)", ci->ci_comment); + if (len + 1 + (cc = 2 + strlen(ci->ci_comment)) >= CPERLIN) { + vp = add("\n\t", vp); len = 8; } else { - vp = add (" ", vp); + vp = add(" ", vp); len++; } - vp = add (buffer, vp); + vp = add(buffer, vp); len += cc; } - vp = add ("\n", vp); - add_header (ct, np, vp); + vp = add("\n", vp); + add_header(ct, np, vp); /* - * output the Content-ID, unless disabled by -nocontentid - */ + ** output the Content-ID, unless disabled by -nocontentid + */ if (contentidsw && ct->c_id) { - np = add (ID_FIELD, NULL); - vp = concat (" ", ct->c_id, NULL); - add_header (ct, np, vp); + np = getcpy(ID_FIELD); + vp = concat(" ", ct->c_id, NULL); + add_header(ct, np, vp); } /* - * output the Content-Description - */ + ** output the Content-Description + */ if (ct->c_descr) { - np = add (DESCR_FIELD, NULL); - vp = concat (" ", ct->c_descr, NULL); - add_header (ct, np, vp); + np = getcpy(DESCR_FIELD); + vp = concat(" ", ct->c_descr, NULL); + add_header(ct, np, vp); } /* - * output the Content-Disposition - */ + ** output the Content-Disposition + */ if (ct->c_dispo) { - np = add (DISPO_FIELD, NULL); - vp = concat (" ", ct->c_dispo, NULL); - add_header (ct, np, vp); + np = getcpy(DISPO_FIELD); + vp = concat(" ", ct->c_dispo, NULL); + add_header(ct, np, vp); } skip_headers: /* - * If this is the internal content structure for a - * "message/external", then we are done with the - * headers (since it has no body). - */ + ** 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; /* - * output the Content-MD5 - */ + ** output the Content-MD5 + */ if (checksw) { - np = add (MD5_FIELD, NULL); - vp = calculate_digest (ct, (ct->c_encoding == CE_QUOTED) ? 1 : 0); - add_header (ct, np, vp); + np = getcpy(MD5_FIELD); + vp = calculate_digest(ct, (ct->c_encoding == CE_QUOTED) ? + 1 : 0); + add_header(ct, np, vp); } /* - * output the Content-Transfer-Encoding - */ + ** output the Content-Transfer-Encoding + */ switch (ct->c_encoding) { case CE_7BIT: /* Nothing to output */ #if 0 - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "7bit", "\n", NULL); - add_header (ct, np, vp); + np = getcpy(ENCODING_FIELD); + vp = concat(" ", "7bit", "\n", NULL); + add_header(ct, np, vp); #endif break; case CE_8BIT: if (ct->c_type == CT_MESSAGE) - adios (NULL, "internal error, invalid encoding"); + adios(NULL, "internal error, invalid encoding"); - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "8bit", "\n", NULL); - add_header (ct, np, vp); + np = getcpy(ENCODING_FIELD); + vp = concat(" ", "8bit", "\n", NULL); + add_header(ct, np, vp); break; case CE_QUOTED: if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART) - adios (NULL, "internal error, invalid encoding"); + adios(NULL, "internal error, invalid encoding"); - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "quoted-printable", "\n", NULL); - add_header (ct, np, vp); + np = getcpy(ENCODING_FIELD); + vp = concat(" ", "quoted-printable", "\n", NULL); + add_header(ct, np, vp); break; case CE_BASE64: if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART) - adios (NULL, "internal error, invalid encoding"); + adios(NULL, "internal error, invalid encoding"); - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "base64", "\n", NULL); - add_header (ct, np, vp); + np = getcpy(ENCODING_FIELD); + vp = concat(" ", "base64", "\n", NULL); + add_header(ct, np, vp); break; case CE_BINARY: if (ct->c_type == CT_MESSAGE) - adios (NULL, "internal error, invalid encoding"); + adios(NULL, "internal error, invalid encoding"); - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "binary", "\n", NULL); - add_header (ct, np, vp); + np = getcpy(ENCODING_FIELD); + vp = concat(" ", "binary", "\n", NULL); + add_header(ct, np, vp); break; default: - adios (NULL, "unknown transfer encoding in content"); + adios(NULL, "unknown transfer encoding in content"); break; } /* - * Additional content specific header processing - */ + ** Additional content specific header processing + */ switch (ct->c_type) { case CT_MULTIPART: { @@ -1581,7 +1624,7 @@ skip_headers: CT p; p = part->mp_part; - build_headers (p); + build_headers(p); } } break; @@ -1591,7 +1634,7 @@ skip_headers: struct exbody *e; e = (struct exbody *) ct->c_ctparams; - build_headers (e->eb_content); + build_headers(e->eb_content); } break; @@ -1608,7 +1651,7 @@ static char nib2b64[0x40+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static char * -calculate_digest (CT ct, int asciiP) +calculate_digest(CT ct, int asciiP) { int cc; char buffer[BUFSIZ], *vp, *op; @@ -1620,47 +1663,50 @@ calculate_digest (CT ct, int asciiP) CE ce = ct->c_cefile; /* open content */ - if ((in = fopen (ce->ce_file, "r")) == NULL) - adios (ce->ce_file, "unable to open for reading"); + if ((in = fopen(ce->ce_file, "r")) == NULL) + adios(ce->ce_file, "unable to open for reading"); /* Initialize md5 context */ - MD5Init (&mdContext); + MD5Init(&mdContext); /* calculate md5 message digest */ if (asciiP) { - while (fgets (buffer, sizeof(buffer) - 1, in)) { + while (fgets(buffer, sizeof(buffer) - 1, in)) { char c, *cp; - cp = buffer + strlen (buffer) - 1; + cp = buffer + strlen(buffer) - 1; if ((c = *cp) == '\n') *cp = '\0'; - MD5Update (&mdContext, (unsigned char *) buffer, - (unsigned int) strlen (buffer)); + MD5Update(&mdContext, (unsigned char *) buffer, + (unsigned int) strlen(buffer)); if (c == '\n') - MD5Update (&mdContext, (unsigned char *) "\r\n", 2); + MD5Update(&mdContext, (unsigned char *) "\r\n", + 2); } } else { - while ((cc = fread (buffer, sizeof(*buffer), sizeof(buffer), in)) > 0) - MD5Update (&mdContext, (unsigned char *) buffer, (unsigned int) cc); + while ((cc = fread(buffer, sizeof(*buffer), sizeof(buffer), + in)) > 0) + MD5Update(&mdContext, (unsigned char *) buffer, + (unsigned int) cc); } /* md5 finalization. Write digest and zero md5 context */ - MD5Final (digest, &mdContext); + MD5Final(digest, &mdContext); /* close content */ - fclose (in); + fclose(in); /* print debugging info */ if (debugsw) { unsigned char *ep; - fprintf (stderr, "MD5 digest="); + fprintf(stderr, "MD5 digest="); for (ep = (dp = digest) + sizeof(digest) / sizeof(digest[0]); dp < ep; dp++) - fprintf (stderr, "%02x", *dp & 0xff); - fprintf (stderr, "\n"); + fprintf(stderr, "%02x", *dp & 0xff); + fprintf(stderr, "\n"); } /* encode the digest using base64 */ @@ -1689,6 +1735,6 @@ calculate_digest (CT ct, int asciiP) outbuf[24] = '\0'; /* now make copy and return string */ - vp = concat (" ", outbuf, "\n", NULL); + vp = concat(" ", outbuf, "\n", NULL); return vp; }