X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/164be8e5e8b40ce4572281be26d423a9c9d595f3..4dff00a2d1a9e0b1e301c3015d8f7bdf87e2e37a:/uip/mhstore.c diff --git a/uip/mhstore.c b/uip/mhstore.c index 5bc8daaf..cd84aeef 100644 --- a/uip/mhstore.c +++ b/uip/mhstore.c @@ -20,42 +20,34 @@ #include #include -static struct swit switches[] = { -#define AUTOSW 0 - { "auto", 0 }, -#define NAUTOSW 1 - { "noauto", 0 }, -#define CHECKSW 2 - { "check", 0 }, -#define NCHECKSW 3 - { "nocheck", 0 }, -#define VERBSW 4 - { "verbose", 0 }, -#define NVERBSW 5 - { "noverbose", 0 }, -#define FILESW 6 /* interface from show */ - { "file file", 0 }, -#define PARTSW 7 - { "part number", 0 }, -#define TYPESW 8 - { "type content", 0 }, -#define RCACHESW 9 - { "rcache policy", 0 }, -#define WCACHESW 10 - { "wcache policy", 0 }, -#define VERSIONSW 11 - { "version", 0 }, -#define HELPSW 12 - { "help", 0 }, - -/* - * switches for debugging - */ -#define DEBUGSW 13 - { "debug", -5 }, - { NULL, 0 } -}; - +#define MHSTORE_SWITCHES \ + X("auto", 0, AUTOSW) \ + X("noauto", 0, NAUTOSW) \ + X("check", 0, CHECKSW) \ + X("nocheck", 0, NCHECKSW) \ + X("verbose", 0, VERBSW) \ + X("noverbose", 0, NVERBSW) \ + X("file file", 0, FILESW) /* interface from show */ \ + X("part number", 0, PARTSW) \ + X("type content", 0, TYPESW) \ + X("rcache policy", 0, RCACHESW) \ + X("wcache policy", 0, WCACHESW) \ + X("version", 0, VERSIONSW) \ + X("help", 0, HELPSW) \ + X("clobber always|auto|suffix|ask|never", 0, CLOBBERSW) \ + X("debug", -5, DEBUGSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(MHSTORE); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(MHSTORE, switches); +#undef X + + +int save_clobber_policy (const char *); +extern int files_not_clobbered; /* mhparse.c */ extern char *tmp; /* directory to place temp files */ @@ -88,21 +80,19 @@ CT parse_mime (char *); /* mhmisc.c */ int part_ok (CT, int); int type_ok (CT, int); -void set_endian (void); void flush_errors (void); /* mhstoresbr.c */ void store_all_messages (CT *); /* mhfree.c */ -void free_content (CT); extern CT *cts; void freects_done (int) NORETURN; /* * static prototypes */ -static RETSIGTYPE pipeser (int); +static void pipeser (int); int @@ -146,10 +136,10 @@ main (int argc, char **argv) snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help (buf, switches, 1); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case AUTOSW: autosw++; @@ -214,6 +204,14 @@ do_cache: case NVERBSW: verbosw = 0; continue; + case CLOBBERSW: + if (!(cp = *argp++) || *cp == '-') + adios (NULL, "missing argument to %s", argp[-2]); + if (save_clobber_policy (cp)) { + adios (NULL, "invalid argument, %s, to %s", argp[-1], + argp[-2]); + } + continue; case DEBUGSW: debugsw = 1; continue; @@ -232,8 +230,6 @@ do_cache: parts[npart] = NULL; types[ntype] = NULL; - set_endian (); - /* * Check if we've specified an additional profile */ @@ -292,7 +288,7 @@ do_cache: adios (NULL, "out of memory"); ctp = cts; - if ((ct = parse_mime (file))); + if ((ct = parse_mime (file))) *ctp++ = ct; } else { /* @@ -308,7 +304,7 @@ do_cache: adios (maildir, "unable to change directory to"); /* read folder and create message structure */ - if (!(mp = folder_read (folder))) + if (!(mp = folder_read (folder, 1))) adios (NULL, "unable to read folder %s", folder); /* check for empty folder */ @@ -378,16 +374,15 @@ do_cache: context_save (); /* save the context file */ } - done (0); + done (files_not_clobbered); return 1; } -static RETSIGTYPE +static void pipeser (int i) { if (i == SIGQUIT) { - unlink ("core"); fflush (stdout); fprintf (stderr, "\n"); fflush (stderr);