X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhstoresbr.c;h=e5b92e869a021a44cc96ef6ef960c7d396234612;hp=2683fae86c2a902718023d76cfaa8d6e65af1eb1;hb=ced6090a330d3d83d0bce709f756aa3d7d65fea4;hpb=337338b404931f06f0db2119c9e145e8ca5a9860 diff --git a/uip/mhstoresbr.c b/uip/mhstoresbr.c index 2683fae..e5b92e8 100644 --- a/uip/mhstoresbr.c +++ b/uip/mhstoresbr.c @@ -1,10 +1,10 @@ /* - * mhstoresbr.c -- routines to save/store the contents of MIME messages - * - * 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. - */ +** mhstoresbr.c -- routines to save/store the contents of MIME messages +** +** 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 @@ -21,27 +21,27 @@ /* - * The list of top-level contents to display - */ +** The list of top-level contents to display +*/ extern CT *cts; int autosw = 0; /* - * Cache of current directory. This must be - * set before these routines are called. - */ +** Cache of current directory. This must be +** set before these routines are called. +*/ char *cwd; /* - * The directory in which to store the contents. - */ +** The directory in which to store the contents. +*/ static char *dir; /* - * Type for a compare function for qsort. This keeps - * the compiler happy. - */ +** Type for a compare function for qsort. This keeps +** the compiler happy. +*/ typedef int (*qsort_comp) (const void *, const void *); @@ -55,13 +55,13 @@ void flush_errors (void); int show_content_aux (CT, int, int, char *, char *); /* - * prototypes - */ +** prototypes +*/ void store_all_messages (CT *); /* - * static prototypes - */ +** static prototypes +*/ static void store_single_message (CT); static int store_switch (CT); static int store_generic (CT); @@ -79,9 +79,9 @@ static int copy_some_headers (FILE *, CT); /* - * Main entry point to store content - * from a collection of messages. - */ +** Main entry point to store content +** from a collection of messages. +*/ void store_all_messages (CT *cts) @@ -90,9 +90,9 @@ store_all_messages (CT *cts) char *cp; /* - * Check for the directory in which to - * store any contents. - */ + ** Check for the directory in which to + ** store any contents. + */ if (autosw) dir = getcpy (cwd); else if ((cp = context_find (nmhstorage)) && *cp) @@ -110,9 +110,9 @@ store_all_messages (CT *cts) /* - * Entry point to store the content - * in a (single) message - */ +** Entry point to store the content +** in a (single) message +*/ static void store_single_message (CT ct) @@ -131,8 +131,8 @@ store_single_message (CT ct) /* - * Switching routine to store different content types - */ +** Switching routine to store different content types +*/ static int store_switch (CT ct) @@ -179,18 +179,18 @@ store_switch (CT ct) /* - * Generic routine to store a MIME content. - * (audio, video, image, text, message/rfc922) - */ +** Generic routine to store a MIME content. +** (audio, video, image, text, message/rfc922) +*/ static int store_generic (CT ct) { /* - * Check if the content specifies a filename. - * Don't bother with this for type "message" - * (only "message/rfc822" will use store_generic). - */ + ** Check if the content specifies a filename. + ** Don't bother with this for type "message" + ** (only "message/rfc822" will use store_generic). + */ if (autosw && ct->c_type != CT_MESSAGE) get_storeproc (ct); @@ -199,8 +199,8 @@ store_generic (CT ct) /* - * Store content of type "application" - */ +** Store content of type "application" +*/ static int store_application (CT ct) @@ -213,10 +213,10 @@ store_application (CT ct) get_storeproc (ct); /* - * If storeproc is not defined, and the content is type - * "application/octet-stream", we also check for various - * attribute/value pairs which specify if this a tar file. - */ + ** If storeproc is not defined, and the content is type + ** "application/octet-stream", we also check for various + ** attribute/value pairs which specify if this a tar file. + */ if (!ct->c_storeproc && ct->c_subtype == APPLICATION_OCTETS) { int tarP = 0, zP = 0, gzP = 0; @@ -231,33 +231,31 @@ store_application (CT ct) } /* check for "conversions=compress" attribute */ - if ((!mh_strcasecmp (*ap, "conversions") || !mh_strcasecmp (*ap, "x-conversions")) - && (!mh_strcasecmp (*ep, "compress") || !mh_strcasecmp (*ep, "x-compress"))) { + if ((!mh_strcasecmp (*ap, "conversions") || + !mh_strcasecmp (*ap, "x-conversions")) + && (!mh_strcasecmp (*ep, "compress") || + !mh_strcasecmp (*ep, "x-compress"))) { zP = 1; continue; } /* check for "conversions=gzip" attribute */ - if ((!mh_strcasecmp (*ap, "conversions") || !mh_strcasecmp (*ap, "x-conversions")) - && (!mh_strcasecmp (*ep, "gzip") || !mh_strcasecmp (*ep, "x-gzip"))) { + if ((!mh_strcasecmp (*ap, "conversions") || + !mh_strcasecmp (*ap, "x-conversions")) + && (!mh_strcasecmp (*ep, "gzip") || + !mh_strcasecmp (*ep, "x-gzip"))) { gzP = 1; continue; } } if (tarP) { - ct->c_showproc = add (zP ? "%euncompress | tar tvf -" - : (gzP ? "%egzip -dc | tar tvf -" - : "%etar tvf -"), NULL); + ct->c_showproc = add (zP ? "%euncompress | tar tvf -" : (gzP ? "%egzip -dc | tar tvf -" : "%etar tvf -"), NULL); if (!ct->c_storeproc) { if (autosw) { - ct->c_storeproc = add (zP ? "| uncompress | tar xvpf -" - : (gzP ? "| gzip -dc | tar xvpf -" - : "| tar xvpf -"), NULL); + ct->c_storeproc = add (zP ? "| uncompress | tar xvpf -" : (gzP ? "| gzip -dc | tar xvpf -" : "| tar xvpf -"), NULL); ct->c_umask = 0022; } else { - ct->c_storeproc= add (zP ? "%m%P.tar.Z" - : (gzP ? "%m%P.tar.gz" - : "%m%P.tar"), NULL); + ct->c_storeproc= add (zP ? "%m%P.tar.Z" : (gzP ? "%m%P.tar.gz" : "%m%P.tar"), NULL); } } } @@ -268,8 +266,8 @@ store_application (CT ct) /* - * Store the content of a multipart message - */ +** Store the content of a multipart message +*/ static int store_multi (CT ct) @@ -294,9 +292,9 @@ store_multi (CT ct) /* - * Reassemble and store the contents of a collection - * of messages of type "message/partial". - */ +** Reassemble and store the contents of a collection +** of messages of type "message/partial". +*/ static int store_partial (CT ct) @@ -355,16 +353,12 @@ store_partial (CT ct) pm = (struct partial *) p->c_ctparams; if (pm->pm_marked != cur) { if (pm->pm_marked == cur - 1) { - admonish (NULL, - "duplicate part %d of %d part multipart message", - pm->pm_marked, hi); + admonish (NULL, "duplicate part %d of %d part multipart message", pm->pm_marked, hi); continue; } missing_part: - advise (NULL, - "missing %spart %d of %d part multipart message", - cur != hi ? "(at least) " : "", cur, hi); + advise (NULL, "missing %spart %d of %d part multipart message", cur != hi ? "(at least) " : "", cur, hi); goto losing; } else cur++; @@ -375,9 +369,9 @@ missing_part: } /* - * Now cycle through the sorted list of messages of type - * "message/partial" and save/append them to a file. - */ + ** Now cycle through the sorted list of messages of type + ** "message/partial" and save/append them to a file. + */ ctq = base; ct = *ctq++; @@ -399,8 +393,8 @@ losing: /* - * Store content from a message of type "message/external". - */ +** Store content from a message of type "message/external". +*/ static int store_external (CT ct) @@ -413,9 +407,9 @@ store_external (CT ct) return OK; /* - * Check if the parameters for the external body - * specified a filename. - */ + ** Check if the parameters for the external body + ** specified a filename. + */ if (autosw) { char *cp; @@ -433,11 +427,11 @@ store_external (CT ct) } /* - * Since we will let the Content structure for the - * external body substitute for the current content, - * we temporarily change its partno (number inside - * multipart), so everything looks right. - */ + ** Since we will let the Content structure for the + ** external body substitute for the current content, + ** we temporarily change its partno (number inside + ** multipart), so everything looks right. + */ p->c_partno = ct->c_partno; /* we probably need to check if content is really there */ @@ -449,9 +443,9 @@ store_external (CT ct) /* - * Compare the numbering from two different - * message/partials (needed for sorting). - */ +** Compare the numbering from two different +** message/partials (needed for sorting). +*/ static int ct_compar (CT *a, CT *b) @@ -464,15 +458,15 @@ ct_compar (CT *a, CT *b) /* - * Store contents of a message or message part to - * a folder, a file, the standard output, or pass - * the contents to a command. - * - * If the current content to be saved is a followup part - * to a collection of messages of type "message/partial", - * then field "p" is a pointer to the Content structure - * to the first message/partial in the group. - */ +** Store contents of a message or message part to +** a folder, a file, the standard output, or pass +** the contents to a command. +** +** If the current content to be saved is a followup part +** to a collection of messages of type "message/partial", +** then field "p" is a pointer to the Content structure +** to the first message/partial in the group. +*/ static int store_content (CT ct, CT p) @@ -483,18 +477,18 @@ store_content (CT ct, CT p) char *cp, buffer[BUFSIZ]; /* - * Do special processing for messages of - * type "message/partial". - * - * We first check if this content is of type - * "message/partial". If it is, then we need to check - * whether it is the first and/or last in the group. - * - * Then if "p" is a valid pointer, it points to the Content - * structure of the first partial in the group. So we copy - * the file name and/or folder name from that message. In - * this case, we also note that we will be appending. - */ + ** Do special processing for messages of + ** type "message/partial". + ** + ** We first check if this content is of type + ** "message/partial". If it is, then we need to check + ** whether it is the first and/or last in the group. + ** + ** Then if "p" is a valid pointer, it points to the Content + ** structure of the first partial in the group. So we copy + ** the file name and/or folder name from that message. In + ** this case, we also note that we will be appending. + */ if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; @@ -508,11 +502,11 @@ store_content (CT ct, CT p) last_partial = 1; /* - * If "p" is a valid pointer, then it points to the - * Content structure for the first message in the group. - * So we just copy the filename or foldername information - * from the previous iteration of this function. - */ + ** If "p" is a valid pointer, then it points to the + ** Content structure for the first message in the group. + ** So we just copy the filename or foldername information + ** from the previous iteration of this function. + */ if (p) { appending = 1; ct->c_storage = add (p->c_storage, NULL); @@ -526,21 +520,22 @@ store_content (CT ct, CT p) } /* - * Get storage formatting string. - * - * 1) If we have storeproc defined, then use that - * 2) Else check for a mhstore-store-/ entry - * 3) Else check for a mhstore-store- entry - * 4) Else if content is "message", use "+" (current folder) - * 5) Else use string "%m%P.%s". - */ + ** Get storage formatting string. + ** + ** 1) If we have storeproc defined, then use that + ** 2) Else check for a mhstore-store-/ entry + ** 3) Else check for a mhstore-store- entry + ** 4) Else if content is "message", use "+" (current folder) + ** 5) Else use string "%m%P.%s". + */ if ((cp = ct->c_storeproc) == NULL || *cp == '\0') { CI ci = &ct->c_ctinfo; snprintf (buffer, sizeof(buffer), "%s-store-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); if ((cp = context_find (buffer)) == NULL || *cp == '\0') { - snprintf (buffer, sizeof(buffer), "%s-store-%s", invo_name, ci->ci_type); + snprintf (buffer, sizeof(buffer), "%s-store-%s", + invo_name, ci->ci_type); if ((cp = context_find (buffer)) == NULL || *cp == '\0') { cp = ct->c_type == CT_MESSAGE ? "+" : "%m%P.%s"; } @@ -548,9 +543,9 @@ store_content (CT ct, CT p) } /* - * Check the beginning of storage formatting string - * to see if we are saving content to a folder. - */ + ** Check the beginning of storage formatting string + ** to see if we are saving content to a folder. + */ if (*cp == '+' || *cp == '@') { char *tmpfilenam, *folder; @@ -577,15 +572,15 @@ store_content (CT ct, CT p) } /* - * Parse and expand the storage formatting string - * in `cp' into `buffer'. - */ + ** Parse and expand the storage formatting string + ** in `cp' into `buffer'. + */ parse_format_string (ct, cp, buffer, sizeof(buffer), dir); /* - * If formatting begins with '|' or '!', then pass - * content to standard input of a command and return. - */ + ** If formatting begins with '|' or '!', then pass + ** content to standard input of a command and return. + */ if (buffer[0] == '|' || buffer[0] == '!') return show_content_aux (ct, 1, 0, buffer + 1, dir); @@ -601,10 +596,10 @@ got_filename: return NOTOK; /* - * If necessary, link the file into a folder and remove - * the temporary file. If this message is a partial, - * then only do this if it is the last one in the group. - */ + ** If necessary, link the file into a folder and remove + ** the temporary file. If this message is a partial, + ** then only do this if it is the last one in the group. + */ if (ct->c_folder && (!is_partial || last_partial)) { msgnum = output_content_folder (ct->c_folder, ct->c_storage); unlink (ct->c_storage); @@ -613,9 +608,9 @@ got_filename: } /* - * Now print out the name/number of the message - * that we are storing. - */ + ** Now print out the name/number of the message + ** that we are storing. + */ if (is_partial) { if (first_partial) fprintf (stderr, "reassembling partials "); @@ -630,10 +625,10 @@ got_filename: } /* - * Unless we are in the "middle" of group of message/partials, - * we now print the name of the file, folder, and/or message - * to which we are storing the content. - */ + ** Unless we are in the "middle" of group of message/partials, + ** we now print the name of the file, folder, and/or message + ** to which we are storing the content. + */ if (!is_partial || last_partial) { if (ct->c_folder) { fprintf (stderr, " to folder %s as message %d\n", ct->c_folder, msgnum); @@ -655,8 +650,8 @@ got_filename: /* - * Output content to a file - */ +** Output content to a file +*/ static int output_content_file (CT ct, int appending) @@ -667,9 +662,9 @@ output_content_file (CT ct, int appending) FILE *fp; /* - * If the pathname is absolute, make sure - * all the relevant directories exist. - */ + ** If the pathname is absolute, make sure + ** all the relevant directories exist. + */ if (strchr(ct->c_storage, '/') && make_intermediates (ct->c_storage) == NOTOK) return NOTOK; @@ -693,8 +688,8 @@ output_content_file (CT ct, int appending) } /* - * Send to standard output - */ + ** Send to standard output + */ if (!strcmp (ct->c_storage, "-")) { int gd; @@ -712,8 +707,8 @@ losing: } } else { /* - * Open output file - */ + ** Open output file + */ if ((fp = fopen (ct->c_storage, appending ? "a" : "w")) == NULL) { advise (ct->c_storage, "unable to fopen for %s", appending ? "appending" : "writing"); @@ -722,9 +717,9 @@ losing: } /* - * Filter the header fields of the initial enclosing - * message/partial into the file. - */ + ** Filter the header fields of the initial enclosing + ** message/partial into the file. + */ if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; @@ -789,9 +784,9 @@ losing: } /* - * Copy a few of the header fields of the initial - * enclosing message/partial into the file. - */ + ** Copy a few of the header fields of the initial + ** enclosing message/partial into the file. + */ filterstate = 0; if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; @@ -811,10 +806,10 @@ losing: buffer[diff] = '\0'; } /* - * If this is the first content of a group of - * message/partial contents, then we only copy a few - * of the header fields of the enclosed message. - */ + ** If this is the first content of a group of + ** message/partial contents, then we only copy a few + ** of the header fields of the enclosed message. + */ if (filterstate) { switch (buffer[0]) { case ' ': @@ -857,12 +852,12 @@ losing: /* - * Add a file to a folder. - * - * Return the new message number of the file - * when added to the folder. Return -1, if - * there is an error. - */ +** Add a file to a folder. +** +** Return the new message number of the file +** when added to the folder. Return -1, if +** there is an error. +*/ static int output_content_folder (char *folder, char *filename) @@ -883,17 +878,17 @@ output_content_folder (char *folder, char *filename) folder_free (mp); /* - * Return msgnum. We are relying on the fact that - * msgnum will be -1, if folder_addmsg() had an error. - */ + ** Return msgnum. We are relying on the fact that + ** msgnum will be -1, if folder_addmsg() had an error. + */ return msgnum; } /* - * Parse and expand the storage formatting string - * pointed to by "cp" into "buffer". - */ +** Parse and expand the storage formatting string +** pointed to by "cp" into "buffer". +*/ static int parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) @@ -903,9 +898,9 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) CI ci = &ct->c_ctinfo; /* - * If storage string is "-", just copy it, and - * return (send content to standard output). - */ + ** If storage string is "-", just copy it, and + ** return (send content to standard output). + */ if (cp[0] == '-' && cp[1] == '\0') { strncpy (buffer, cp, buflen); return 0; @@ -915,10 +910,10 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) bp[0] = '\0'; /* - * If formatting string is a pathname that doesn't - * begin with '/', then preface the path with the - * appropriate directory. - */ + ** If formatting string is a pathname that doesn't + ** begin with '/', then preface the path with the + ** appropriate directory. + */ if (*cp != '/' && *cp != '|' && *cp != '!') { snprintf (bp, buflen, "%s/", dir[1] ? dir : ""); len = strlen (bp); @@ -933,9 +928,9 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) switch (*++cp) { case 'a': /* - * Insert parameters from Content-Type. - * This is only valid for '|' commands. - */ + ** Insert parameters from Content-Type. + ** This is only valid for '|' commands. + */ if (buffer[0] != '|' && buffer[0] != '!') { *bp++ = *--cp; *bp = '\0'; @@ -1012,9 +1007,9 @@ raw: /* - * Check if the content specifies a filename - * in its MIME parameters. - */ +** Check if the content specifies a filename +** in its MIME parameters. +*/ static void get_storeproc (CT ct) @@ -1023,18 +1018,18 @@ get_storeproc (CT ct) CI ci = &ct->c_ctinfo; /* - * If the storeproc has already been defined, - * we just return (for instance, if this content - * is part of a "message/external". - */ + ** If the storeproc has already been defined, + ** we just return (for instance, if this content + ** is part of a "message/external". + */ if (ct->c_storeproc) return; /* - * Check the attribute/value pairs, for the attribute "name". - * If found, do a few sanity checks and copy the value into - * the storeproc. - */ + ** Check the attribute/value pairs, for the attribute "name". + ** If found, do a few sanity checks and copy the value into + ** the storeproc. + */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { if (!mh_strcasecmp (*ap, "name") && *(cp = *ep) != '/' @@ -1050,9 +1045,9 @@ get_storeproc (CT ct) /* - * Copy some of the header fields of the initial message/partial - * message into the header of the reassembled message. - */ +** Copy some of the header fields of the initial message/partial +** message into the header of the reassembled message. +*/ static int copy_some_headers (FILE *out, CT ct) @@ -1063,9 +1058,9 @@ copy_some_headers (FILE *out, CT ct) while (hp) { /* - * A few of the header fields of the enclosing - * messages are not copied. - */ + ** A few of the header fields of the enclosing + ** messages are not copied. + */ if (!uprf (hp->name, XXX_FIELD_PRF) && mh_strcasecmp (hp->name, VRSN_FIELD) && mh_strcasecmp (hp->name, "Subject")