]> diplodocus.org Git - nmh/blobdiff - uip/refile.c
Support for sequence file locking in inc(1).
[nmh] / uip / refile.c
index 7bc6d0b92b221ea7bdf023da0493d6267e6a7f5c..8dd04fb92a46355de6c6ae280f243f9d03eaf31f 100644 (file)
@@ -3,8 +3,6 @@
  * refile.c -- move or link message(s) from a source folder
  *          -- into one or more destination folders
  *
  * refile.c -- move or link message(s) from a source folder
  *          -- into one or more destination folders
  *
- * $Id$
- *
  * 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.
  * 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 <fcntl.h>
 #include <errno.h>
 
 #include <fcntl.h>
 #include <errno.h>
 
-static struct swit switches[] = {
-#define        DRAFTSW          0
-    { "draft", 0 },
-#define        LINKSW           1
-    { "link", 0 },
-#define        NLINKSW          2
-    { "nolink", 0 },
-#define        PRESSW           3
-    { "preserve", 0 },
-#define        NPRESSW          4
-    { "nopreserve", 0 },
-#define UNLINKSW         5
-    { "unlink", 0 },
-#define NUNLINKSW        6
-    { "nounlink", 0 },
-#define        SRCSW            7
-    { "src +folder", 0 },
-#define        FILESW           8
-    { "file file", 0 },
-#define        RPROCSW          9
-    { "rmmproc program", 0 },
-#define        NRPRCSW         10
-    { "normmproc", 0 },
-#define VERSIONSW       11
-    { "version", 0 },
-#define        HELPSW          12
-    { "help", 0 },
-    { NULL, 0 }
-};
+#define REFILE_SWITCHES \
+    X("draft", 0, DRAFTSW) \
+    X("link", 0, LINKSW) \
+    X("nolink", 0, NLINKSW) \
+    X("preserve", 0, PRESSW) \
+    X("nopreserve", 0, NPRESSW) \
+    X("unlink", 0, UNLINKSW) \
+    X("nounlink", 0, NUNLINKSW) \
+    X("src +folder", 0, SRCSW) \
+    X("file file", 0, FILESW) \
+    X("rmmproc program", 0, RPROCSW) \
+    X("normmproc", 0, NRPRCSW) \
+    X("version", 0, VERSIONSW) \
+    X("help", 0, HELPSW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(REFILE);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(REFILE, switches);
+#undef X
 
 static char maildir[BUFSIZ];
 
 
 static char maildir[BUFSIZ];
 
@@ -102,10 +93,10 @@ main (int argc, char **argv)
                snprintf (buf, sizeof(buf), "%s [msgs] [switches] +folder ...",
                          invo_name);
                print_help (buf, switches, 1);
                snprintf (buf, sizeof(buf), "%s [msgs] [switches] +folder ...",
                          invo_name);
                print_help (buf, switches, 1);
-               done (1);
+               done (0);
            case VERSIONSW:
                print_version(invo_name);
            case VERSIONSW:
                print_version(invo_name);
-               done (1);
+               done (0);
 
            case LINKSW: 
                linkf++;
 
            case LINKSW: 
                linkf++;
@@ -204,7 +195,7 @@ main (int argc, char **argv)
        adios (maildir, "unable to change directory to");
 
     /* read source folder and create message structure */
        adios (maildir, "unable to change directory to");
 
     /* read source 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 */
        adios (NULL, "unable to read folder %s", folder);
 
     /* check for empty folder */
@@ -291,7 +282,7 @@ opnfolds (struct st_fold *folders, int nfolders)
 
        if (chdir (nmaildir) == NOTOK)
            adios (nmaildir, "unable to change directory to");
 
        if (chdir (nmaildir) == NOTOK)
            adios (nmaildir, "unable to change directory to");
-       if (!(mp = folder_read (fp->f_name)))
+       if (!(mp = folder_read (fp->f_name, 1)))
            adios (NULL, "unable to read folder %s", fp->f_name);
        mp->curmsg = 0;
 
            adios (NULL, "unable to read folder %s", fp->f_name);
        mp->curmsg = 0;
 
@@ -330,17 +321,19 @@ clsfolds (struct st_fold *folders, int nfolders)
 static void
 remove_files (int filep, char **files)
 {
 static void
 remove_files (int filep, char **files)
 {
-    int i;
-    char **vec;
+    int i, vecp;
+    char **vec, *program;
 
     /* If rmmproc is defined, we use that */
     if (rmmproc) {
 
     /* If rmmproc is defined, we use that */
     if (rmmproc) {
-       vec = files++;          /* vec[0] = filevec[0] */
-       files[filep] = NULL;    /* NULL terminate list */
+       vec = argsplit(rmmproc, &program, &vecp);
+       files++;                /* Yes, we need to do this */
+       for (i = 0; i < filep; i++)
+               vec[vecp++] = files[i];
+       vec[vecp] = NULL;       /* NULL terminate list */
 
        fflush (stdout);
 
        fflush (stdout);
-       vec[0] = r1bindex (rmmproc, '/');
-       execvp (rmmproc, vec);
+       execvp (program, vec);
        adios (rmmproc, "unable to exec");
     }
 
        adios (rmmproc, "unable to exec");
     }