allow msgs as parameters for whom
[mmh] / uip / whom.c
index a72c84f..e664f4b 100644 (file)
@@ -37,6 +37,7 @@ static struct swit switches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
 
 #define NFILES 32
 
@@ -75,11 +76,14 @@ static void printone(struct mailname *);
 int
 main(int argc, char **argv)
 {
-       int filep=0, naddrs=0, n;
+       int naddrs=0, n;
        char *cp;
        char buf[BUFSIZ], **argp;
-       char **arguments, *files[NFILES];
+       char **arguments;
+       char *folder = NULL;
        FILE *in;
+       struct msgs_array msgs = {0};
+       struct msgs_array files = {0};
 
        setlocale(LC_ALL, "");
        invo_name = mhbasename(argv[0]);
@@ -139,22 +143,27 @@ main(int argc, char **argv)
                                continue;
                        }
                }
-               if (filep > NFILES) {
-                       adios(EX_USAGE, NULL, "too many files (more than %d)",
-                                       NFILES);
+               if (*cp == '+' || *cp == '@') {
+                       if (folder) {
+                               adios(EX_USAGE, NULL, "only one folder at a time!");
+                       } else {
+                               folder = mh_xstrdup(expandfol(cp));
+                       }
                } else {
-                       files[filep++] = cp;
+                       app_msgarg(&msgs, cp);
                }
        }
-       files[filep] = NULL;
-       if (!filep) {
+       if (!msgs.size) {
                adios(EX_USAGE, NULL, "usage: %s [switches] file ...", invo_name);
        }
        if (!toccsw && !dccsw && !bccsw) {
                adios(EX_USAGE, NULL, "use at least one of: -tocc -dcc -bcc");
        }
-       for (filep=0; files[filep]; filep++) {
-               process(files[filep]);
+       if (parse_msgs(&msgs, folder, &files) < 0) {
+               exit(EX_IOERR);
+       }
+       for (size_t filep = 0; filep < files.size; filep++) {
+               process(files.msgs[filep]);
        }
 
        cmd = add("ali -list", NULL);
@@ -167,7 +176,7 @@ main(int argc, char **argv)
                }
                pclose(in);
        }
-       free(cmd);
+       mh_free0(&cmd);
        naddrs += n;
 
        cmd = add("ali -list", NULL);
@@ -180,7 +189,7 @@ main(int argc, char **argv)
                }
                pclose(in);
        }
-       free(cmd);
+       mh_free0(&cmd);
        naddrs += n;
 
        cmd = add("ali -list", NULL);
@@ -193,7 +202,7 @@ main(int argc, char **argv)
                }
                pclose(in);
        }
-       free(cmd);
+       mh_free0(&cmd);
        naddrs += n;
 
        return naddrs ? 0 : 1;
@@ -215,6 +224,9 @@ process(char *file)
 
        for (compnum=1, state=FLD2;; compnum++) {
                switch (state = m_getfld2(state, &f, in)) {
+               case LENERR2:
+                       state = FLD2;
+                       /* FALL */
                case FLD2:
                        proc_hdr(f.name, f.value);
                        continue;
@@ -223,8 +235,10 @@ process(char *file)
                case FILEEOF2:
                        break;
 
-               case LENERR2:
                case FMTERR2:
+                       advise(NULL, "message format error in component #%d", compnum);
+                       continue;
+
                case IOERR2:
                        adios(EX_DATAERR, NULL, "message format error in component #%d",
                                        compnum);