Import ezmlm-idx 0.40
[ezmlm] / ezmlm-sub.c
index 85fce6a..62e3166 100644 (file)
@@ -1,9 +1,32 @@
+/*$Id: ezmlm-sub.c,v 1.18 1999/08/02 02:57:57 lindberg Exp $*/
+/*$Name: ezmlm-idx-040 $*/
 #include "strerr.h"
 #include "subscribe.h"
-#include "log.h"
+#include "sgetopt.h"
+#include "stralloc.h"
+#include "substdio.h"
+#include "readwrite.h"
+#include "getln.h"
+#include "errtxt.h"
+#include "scan.h"
+#include "idx.h"
 
 #define FATAL "ezmlm-sub: fatal: "
-#define WARNING "ezmlm-sub: warning: "
+
+void *psql = (void *) 0;
+
+char inbuf[512];
+substdio ssin = SUBSTDIO_FDBUF(read,0,inbuf,sizeof(inbuf));
+
+stralloc line = {0};
+
+void die_usage() {
+  strerr_die1x(100,
+       "ezmlm-sub: usage: ezmlm-sub [-mMvV] [-h hash] [-n] dir "
+               "[box@domain [name]] ...");
+}
+
+int flagname = 0;
 
 void main(argc,argv)
 int argc;
@@ -11,23 +34,81 @@ char **argv;
 {
   char *dir;
   char *addr;
+  char *comment;
+  char *cp;
+  char ch;
+  int opt;
+  int match;
+  int flagmysql = 1;   /* use mysql if supported */
+  int forcehash = -1;
+  unsigned int u;
+
+  (void) umask(022);
+  while ((opt = getopt(argc,argv,"h:HmMnNvV")) != opteof)
+    switch(opt) {
+      case 'h': (void) scan_ulong(optarg,&u); forcehash = 0; break;
+      case 'H': forcehash = -1; break;
+      case 'm': flagmysql = 1; break;
+      case 'M': flagmysql = 0; break;
+      case 'n': flagname = 1; break;
+      case 'N': flagname = 0; break;
+      case 'v':
+      case 'V': strerr_die2x(0,
+               "ezmlm-sub version: ezmlm-0.53+",EZIDX_VERSION);
+      default:
+       die_usage();
+    }
+
+  dir = argv[optind++];
+  if (!dir) die_usage();
+
+  if (dir[0] != '/')
+    strerr_die2x(100,FATAL,ERR_SLASH);
 
-  dir = argv[1];
-  if (!dir)
-    strerr_die1x(100,"ezmlm-sub: usage: ezmlm-sub dir box@domain ...");
   if (chdir(dir) == -1)
-    strerr_die4sys(111,FATAL,"unable to switch to ",dir,": ");
-
-  argv += 2;
-  while (addr = *argv++)
-    switch(subscribe(addr,1)) {
-      case -1:
-       strerr_die1(111,FATAL,&subscribe_err);
-      case -2:
-       strerr_warn4(WARNING,"cannot subscribe ",addr,": ",&subscribe_err);
-       break;
-      case 1:
-       log("+manual",addr);
+    strerr_die4sys(111,FATAL,ERR_SWITCH,dir,": ");
+
+  if (forcehash == 0) forcehash = (int) u;
+
+  if (argv[optind]) {
+    if (flagname) {
+               /* allow repeats and last addr doesn't need comment */
+      while ((addr = argv[optind++])) {
+        (void) subscribe(dir,addr,1,argv[optind],"+manual",
+               flagmysql,forcehash,(char *) 0,FATAL);
+        if (!argv[optind++]) break;
+      }
+    } else {
+
+      while ((addr = argv[optind++]))
+        (void) subscribe(dir,addr,1,"","+manual",flagmysql,
+               forcehash,(char *) 0,FATAL);
+    }
+  } else {             /* stdin */
+    for (;;) {
+      if (getln(&ssin,&line,&match,'\n') == -1)
+       strerr_die2sys(111,FATAL,ERR_READ_INPUT);
+      if (!match) break;
+      if (line.len == 1 || *line.s == '#') continue;
+      line.s[line.len - 1] = '\0';
+      comment = (char *) 0;
+      if (flagname) {
+       cp = line.s;
+       while ((ch = *cp)) {
+         if (ch == '\\') {
+            if (!*(++cp)) break;
+         } else if (ch == ' ' || ch == '\t' || ch == ',') break;
+         cp++;
+        }
+        if (ch) {
+         *cp = '\0';
+         comment = cp + 1;
+        }
+      }
+      (void) subscribe(dir,line.s,1,comment,"+manual",flagmysql,
+               forcehash,(char *) 0,FATAL);
     }
+  }
+  closesql();
   _exit(0);
 }