Import ezmlm-idx 0.40
[ezmlm] / ezmlm-sub.c
CommitLineData
f8beb284
MW
1/*$Id: ezmlm-sub.c,v 1.18 1999/08/02 02:57:57 lindberg Exp $*/
2/*$Name: ezmlm-idx-040 $*/
5b62e993
MW
3#include "strerr.h"
4#include "subscribe.h"
f8beb284
MW
5#include "sgetopt.h"
6#include "stralloc.h"
7#include "substdio.h"
8#include "readwrite.h"
9#include "getln.h"
10#include "errtxt.h"
11#include "scan.h"
12#include "idx.h"
5b62e993
MW
13
14#define FATAL "ezmlm-sub: fatal: "
f8beb284
MW
15
16void *psql = (void *) 0;
17
18char inbuf[512];
19substdio ssin = SUBSTDIO_FDBUF(read,0,inbuf,sizeof(inbuf));
20
21stralloc line = {0};
22
23void die_usage() {
24 strerr_die1x(100,
25 "ezmlm-sub: usage: ezmlm-sub [-mMvV] [-h hash] [-n] dir "
26 "[box@domain [name]] ...");
27}
28
29int flagname = 0;
5b62e993
MW
30
31void main(argc,argv)
32int argc;
33char **argv;
34{
35 char *dir;
36 char *addr;
f8beb284
MW
37 char *comment;
38 char *cp;
39 char ch;
40 int opt;
41 int match;
42 int flagmysql = 1; /* use mysql if supported */
43 int forcehash = -1;
44 unsigned int u;
45
46 (void) umask(022);
47 while ((opt = getopt(argc,argv,"h:HmMnNvV")) != opteof)
48 switch(opt) {
49 case 'h': (void) scan_ulong(optarg,&u); forcehash = 0; break;
50 case 'H': forcehash = -1; break;
51 case 'm': flagmysql = 1; break;
52 case 'M': flagmysql = 0; break;
53 case 'n': flagname = 1; break;
54 case 'N': flagname = 0; break;
55 case 'v':
56 case 'V': strerr_die2x(0,
57 "ezmlm-sub version: ezmlm-0.53+",EZIDX_VERSION);
58 default:
59 die_usage();
60 }
61
62 dir = argv[optind++];
63 if (!dir) die_usage();
64
65 if (dir[0] != '/')
66 strerr_die2x(100,FATAL,ERR_SLASH);
5b62e993 67
5b62e993 68 if (chdir(dir) == -1)
f8beb284
MW
69 strerr_die4sys(111,FATAL,ERR_SWITCH,dir,": ");
70
71 if (forcehash == 0) forcehash = (int) u;
72
73 if (argv[optind]) {
74 if (flagname) {
75 /* allow repeats and last addr doesn't need comment */
76 while ((addr = argv[optind++])) {
77 (void) subscribe(dir,addr,1,argv[optind],"+manual",
78 flagmysql,forcehash,(char *) 0,FATAL);
79 if (!argv[optind++]) break;
80 }
81 } else {
82
83 while ((addr = argv[optind++]))
84 (void) subscribe(dir,addr,1,"","+manual",flagmysql,
85 forcehash,(char *) 0,FATAL);
86 }
87 } else { /* stdin */
88 for (;;) {
89 if (getln(&ssin,&line,&match,'\n') == -1)
90 strerr_die2sys(111,FATAL,ERR_READ_INPUT);
91 if (!match) break;
92 if (line.len == 1 || *line.s == '#') continue;
93 line.s[line.len - 1] = '\0';
94 comment = (char *) 0;
95 if (flagname) {
96 cp = line.s;
97 while ((ch = *cp)) {
98 if (ch == '\\') {
99 if (!*(++cp)) break;
100 } else if (ch == ' ' || ch == '\t' || ch == ',') break;
101 cp++;
102 }
103 if (ch) {
104 *cp = '\0';
105 comment = cp + 1;
106 }
107 }
108 (void) subscribe(dir,line.s,1,comment,"+manual",flagmysql,
109 forcehash,(char *) 0,FATAL);
5b62e993 110 }
f8beb284
MW
111 }
112 closesql();
5b62e993
MW
113 _exit(0);
114}