X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/f3a97f2ee12563029514d15464b201397d1569df..baecaa2380db6164c1992fdffccca8ea9a61d5ba:/uip/mhstoresbr.c diff --git a/uip/mhstoresbr.c b/uip/mhstoresbr.c index 78ceef52..62a5ba43 100644 --- a/uip/mhstoresbr.c +++ b/uip/mhstoresbr.c @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -41,8 +40,6 @@ struct mhstoreinfo { enum clobber_policy_t clobber_policy; /* -clobber selection */ }; -typedef struct mhstoreinfo *mhstoreinfo_t; - mhstoreinfo_t mhstoreinfo_create (CT *ct, char *pwd, const char *csw, int asw, int vsw) { mhstoreinfo_t info = mh_xmalloc (sizeof *info); @@ -61,6 +58,7 @@ mhstoreinfo_create (CT *ct, char *pwd, const char *csw, int asw, int vsw) { void mhstoreinfo_free (mhstoreinfo_t info) { free (info->cwd); + free (info->dir); free (info); } @@ -78,18 +76,10 @@ typedef int (*qsort_comp) (const void *, const void *); /* mhmisc.c */ -int part_ok (CT, int); +int part_ok (CT); int type_ok (CT, int); void flush_errors (void); -/* mhshowsbr.c */ -int show_content_aux (CT, int, int, char *, char *); - -/* - * prototypes - */ -void store_all_messages (mhstoreinfo_t); - /* * static prototypes */ @@ -296,15 +286,14 @@ store_multi (CT ct, mhstoreinfo_t info) for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; - if (part_ok (p, 1) && type_ok (p, 1)) { + if (part_ok (p) && type_ok (p, 1)) { if (ct->c_storage) { /* Support mhstore -outfile. The MIME parser doesn't load c_storage, so we know that p->c_storage is NULL here. */ - p->c_storage = ct->c_storage; + p->c_storage = add (ct->c_storage, NULL); } result = store_switch (p, info); - p->c_storage = NULL; if (result == OK && ct->c_subtype == MULTI_ALTERNATE) break; @@ -355,7 +344,7 @@ store_partial (CT ct, mhstoreinfo_t info) return NOTOK; } - if ((base = (CT *) calloc ((size_t) (i + 1), sizeof(*base))) == NULL) + if ((base = (CT *) mh_xcalloc ((size_t) (i + 1), sizeof(*base))) == NULL) adios (NULL, "out of memory"); ctq = base; @@ -468,10 +457,9 @@ store_external (CT ct, mhstoreinfo_t info) if (ct->c_storage) { /* Support mhstore -outfile. The MIME parser doesn't load c_storage, so we know that p->c_storage is NULL here. */ - p->c_storage = ct->c_storage; + p->c_storage = add (ct->c_storage, NULL); } result = store_switch (p, info); - p->c_storage = NULL; p->c_partno = NULL; return result; @@ -569,13 +557,9 @@ store_content (CT ct, CT p, mhstoreinfo_t info) 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); - if ((cp = context_find (buffer)) == NULL || *cp == '\0') { - cp = ct->c_type == CT_MESSAGE ? "+" : "%m%P.%s"; - } + cp = context_find_by_type ("store", ci->ci_type, ci->ci_subtype); + if (cp == NULL) { + cp = ct->c_type == CT_MESSAGE ? "+" : "%m%P.%s"; } } @@ -623,7 +607,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) * content to standard input of a command and return. */ if (buffer[0] == '|' || buffer[0] == '!') - return show_content_aux (ct, 1, 0, buffer + 1, info->dir); + return show_content_aux (ct, 0, buffer + 1, info->dir, NULL); /* record the filename */ if ((ct->c_storage = clobber_check (add (buffer, NULL), info)) == @@ -632,7 +616,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) } } else { /* The output filename was explicitly specified, so use it. */ - if ((ct->c_storage = clobber_check (add (ct->c_storage, NULL), info)) == + if ((ct->c_storage = clobber_check (ct->c_storage, info)) == NULL) { return NOTOK; } @@ -790,7 +774,9 @@ losing: break; default: - fwrite (buffer, sizeof(*buffer), cc, fp); + if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) { + advise ("output_content_file", "fwrite"); + } continue; } break; @@ -1245,6 +1231,10 @@ clobber_check (char *original_file, mhstoreinfo_t info) { char *cwd = NULL; int check_again; + if (! strcmp (original_file, "-")) { + return original_file; + } + if (info->clobber_policy == NMH_CLOBBER_ASK) { /* Save cwd for possible use in loop below. */ char *slash; @@ -1255,7 +1245,9 @@ clobber_check (char *original_file, mhstoreinfo_t info) { if (slash) { *slash = '\0'; } else { - /* original_file wasn't a full path, which shouldn't happen. */ + /* original_file isn't a full path, which should only happen if + it is -. */ + free (cwd); cwd = NULL; } } @@ -1293,7 +1285,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { if (isatty (fileno (stdin))) { char *prompt = concat ("Overwrite \"", file, "\" [y/n/rename]? ", NULL); - ans = getans (prompt, answer); + ans = read_switch_multiword (prompt, answer); free (prompt); } else { /* Overwrite, that's what nmh used to do. And warn. */ @@ -1355,9 +1347,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { original_file = file; } while (check_again); - if (cwd) { - free (cwd); - } + free (cwd); return file; }