Added -clobber switch to mhstore(1) [Bug #11160].
[mmh] / uip / mhstore.c
index 7b44a96..fa30e03 100644 (file)
 #include <h/mhcachesbr.h>
 #include <h/utils.h>
 
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-
 static struct swit switches[] = {
 #define        AUTOSW                  0
     { "auto", 0 },
@@ -51,16 +47,21 @@ static struct swit switches[] = {
     { "version", 0 },
 #define        HELPSW                 12
     { "help", 0 },
+#define        CLOBBERSW              13
+    { "clobber always|auto|suffix|ask|never", 0 },
 
 /*
  * switches for debugging
  */
-#define        DEBUGSW                13
+#define        DEBUGSW                14
     { "debug", -5 },
     { NULL, 0 }
 };
 
 
+int save_clobber_policy (const char *);
+extern int files_not_clobbered;
+
 /* mhparse.c */
 extern char *tmp;      /* directory to place temp files */
 
@@ -92,7 +93,6 @@ 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 */
@@ -106,7 +106,7 @@ void freects_done (int) NORETURN;
 /*
  * static prototypes
  */
-static RETSIGTYPE pipeser (int);
+static void pipeser (int);
 
 
 int
@@ -150,10 +150,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++;
@@ -218,6 +218,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;
@@ -236,8 +244,6 @@ do_cache:
     parts[npart] = NULL;
     types[ntype] = NULL;
 
-    set_endian ();
-
     /*
      * Check if we've specified an additional profile
      */
@@ -296,7 +302,7 @@ do_cache:
            adios (NULL, "out of memory");
        ctp = cts;
 
-       if ((ct = parse_mime (file)));
+       if ((ct = parse_mime (file)))
            *ctp++ = ct;
     } else {
        /*
@@ -382,12 +388,12 @@ 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) {