#include <h/mh.h>
#include <fcntl.h>
-#include <h/signals.h>
#include <h/md5.h>
#include <h/mts.h>
#include <h/tws.h>
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);
+ mhstoreinfo_t info;
+ NEW(info);
info->cts = ct;
info->cwd = pwd;
info->autosw = asw;
void
mhstoreinfo_free (mhstoreinfo_t info) {
free (info->cwd);
+ free (info->dir);
free (info);
}
/* mhmisc.c */
-int part_ok (CT, int);
+int part_ok (CT);
int type_ok (CT, int);
void flush_errors (void);
-/*
- * prototypes
- */
-void store_all_messages (mhstoreinfo_t);
-
/*
* static prototypes
*/
* store any contents.
*/
if ((cp = context_find (nmhstorage)) && *cp)
- info->dir = getcpy (cp);
+ info->dir = mh_xstrdup(cp);
else
info->dir = getcpy (info->cwd);
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;
return NOTOK;
}
- if ((base = (CT *) calloc ((size_t) (i + 1), sizeof(*base))) == NULL)
- adios (NULL, "out of memory");
-
+ base = mh_xcalloc(i + 1, sizeof *base);
ctq = base;
for (ctp = info->cts; *ctp; ctp++) {
p = *ctp;
ct = *ctq++;
if (store_content (ct, NULL, info) == NOTOK) {
losing:
- free ((char *) base);
+ free(base);
return NOTOK;
}
goto losing;
}
- free ((char *) base);
+ free(base);
return OK;
}
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;
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";
}
}
}
} 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;
}
break;
default:
- fwrite (buffer, sizeof(*buffer), cc, fp);
+ if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) {
+ advise ("output_content_file", "fwrite");
+ }
continue;
}
break;
/* Read the folder. */
if ((mp = folder_read (folder, 0))) {
/* Link file into folder */
- msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, (char *)0);
+ msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, NULL);
} else {
advise (NULL, "unable to read folder %s", folder);
return NOTOK;
free(cp);
return;
}
- if (cp)
- free(cp);
+ mh_xfree(cp);
}
/*
ct->c_storeproc = add (cp, NULL);
}
- if (cp)
- free(cp);
+ mh_xfree(cp);
}
enum clobber_policy_t
clobber_policy (const char *value) {
if (value == NULL || ! strcasecmp (value, "always")) {
- } else if (! strcasecmp (value, "auto")) {
+ return NMH_CLOBBER_ALWAYS;
+ }
+ if (! strcasecmp (value, "auto")) {
return NMH_CLOBBER_AUTO;
- } else if (! strcasecmp (value, "suffix")) {
+ }
+ if (! strcasecmp (value, "suffix")) {
return NMH_CLOBBER_SUFFIX;
- } else if (! strcasecmp (value, "ask")) {
+ }
+ if (! strcasecmp (value, "ask")) {
return NMH_CLOBBER_ASK;
- } else if (! strcasecmp (value, "never")) {
+ }
+ if (! strcasecmp (value, "never")) {
return NMH_CLOBBER_NEVER;
- } else {
- adios (NULL, "invalid argument, %s, to clobber", value);
}
- return NMH_CLOBBER_ALWAYS;
+ adios (NULL, "invalid argument, %s, to clobber", value);
}
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;
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;
}
}
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. */
file = NULL;
++info->files_not_clobbered;
} else {
- char *newline = strchr (buf, '\n');
- if (newline) {
- *newline = '\0';
- }
+ TrimSuffixC(buf, '\n');
}
free (file);
original_file = file;
} while (check_again);
- if (cwd) {
- free (cwd);
- }
+ free (cwd);
return file;
}