annotate src/mlmmj-list.c @ 756:f8f3f4525a2b

Cosmetic changes to help messages
author Ben Schmidt
date Fri, 08 Oct 2010 01:47:46 +1100
parents 945ef20e9d08
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
1 /* Copyright (C) 2004 Mads Martin Joergensen <mmj at mmj.dk>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
2 *
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
3 * $Id$
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
4 *
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
6 * of this software and associated documentation files (the "Software"), to
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
7 * deal in the Software without restriction, including without limitation the
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
9 * sell copies of the Software, and to permit persons to whom the Software is
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
10 * furnished to do so, subject to the following conditions:
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
11 *
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
12 * The above copyright notice and this permission notice shall be included in
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
13 * all copies or substantial portions of the Software.
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
14 *
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
21 * IN THE SOFTWARE.
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
22 */
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
23
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
24 #include <stdio.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
25 #include <stdlib.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
26 #include <unistd.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
27 #include <fcntl.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
28 #include <dirent.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
29 #include <string.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
30 #include <sys/types.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
31 #include <sys/stat.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
32 #include <sys/mman.h>
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
33
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
34 #include "mlmmj.h"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
35 #include "wrappers.h"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
36 #include "memory.h"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
37 #include "strgen.h"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
38 #include "log_error.h"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
39
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
40 static void print_help(const char *prg)
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
41 {
756
f8f3f4525a2b Cosmetic changes to help messages
Ben Schmidt
parents: 663
diff changeset
42 printf("Usage: %s -L /path/to/listdir\n"
f8f3f4525a2b Cosmetic changes to help messages
Ben Schmidt
parents: 663
diff changeset
43 " [-c] [-d] [-h] [-m] [-n] [-o] [-s] [-V]\n"
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
44 " -L: Full path to list directory\n"
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
45 " -c: Print subscriber count\n"
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
46 " -d: Print for digesters list\n"
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
47 " -h: This help\n"
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
48 " -m: Print moderators for list\n"
378
dcf35885d50d Make the mlmmj-list switches more compatible with the rest
mmj
parents: 367
diff changeset
49 " -n: Print for nomail version of list\n"
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
50 " -o: Print owner(s) of list\n"
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
51 " -s: Print normal subscribers (default) \n"
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
52 " -V: Print version\n", prg);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
53 exit(EXIT_SUCCESS);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
54 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
55
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
56 int dumpcount(const char *filename, int *count)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
57 {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
58 int fd;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
59 char *start, *next, *cur;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
60 struct stat st;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
61 size_t len;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
62
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
63 if((fd = open(filename, O_RDONLY)) < 0)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
64 return -1;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
65
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
66 if(stat(filename, &st) < 0)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
67 return -1;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
68
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
69 if(!S_ISREG(st.st_mode))
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
70 return -1;
663
945ef20e9d08 Fixed mmap()ing of zero-sized files (Robin H. Johnson)
mortenp
parents: 389
diff changeset
71
945ef20e9d08 Fixed mmap()ing of zero-sized files (Robin H. Johnson)
mortenp
parents: 389
diff changeset
72 /* Nobody there */
945ef20e9d08 Fixed mmap()ing of zero-sized files (Robin H. Johnson)
mortenp
parents: 389
diff changeset
73 if(st.st_size == 0) {
945ef20e9d08 Fixed mmap()ing of zero-sized files (Robin H. Johnson)
mortenp
parents: 389
diff changeset
74 return 0;
945ef20e9d08 Fixed mmap()ing of zero-sized files (Robin H. Johnson)
mortenp
parents: 389
diff changeset
75 }
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
76
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
77 start = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
78 if(start == MAP_FAILED)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
79 return -1;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
80
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
81 for(next = cur = start; next < start + st.st_size; next++) {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
82 if(*next == '\n' || next == start + st.st_size - 1) {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
83 len = next - cur;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
84 if(next == start + st.st_size - 1 && *next != '\n')
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
85 len++;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
86 if(count)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
87 (*count)++;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
88 else {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
89 writen(STDOUT_FILENO, cur, len);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
90 writen(STDOUT_FILENO, "\n", 1);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
91 }
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
92 cur = next + 1;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
93 }
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
94 }
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
95 munmap(start, st.st_size);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
96 close(fd);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
97
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
98 return 0;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
99 }
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
100
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
101 int main(int argc, char **argv)
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
102 {
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
103 int opt, ret, count = 0, docount = 0;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
104 char *listdir = NULL, *fileiter = NULL, *tmp;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
105 char *subddir, *subdir, *subfile = NULL;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
106 DIR *dirp;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
107 struct dirent *dp;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
108 enum subtype typesub = SUB_NORMAL;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
109
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
110 while ((opt = getopt(argc, argv, "cdhmnosVL:")) != -1) {
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
111 switch(opt) {
378
dcf35885d50d Make the mlmmj-list switches more compatible with the rest
mmj
parents: 367
diff changeset
112 case 'c':
dcf35885d50d Make the mlmmj-list switches more compatible with the rest
mmj
parents: 367
diff changeset
113 docount = 1;
dcf35885d50d Make the mlmmj-list switches more compatible with the rest
mmj
parents: 367
diff changeset
114 break;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
115 case 'd':
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
116 typesub = SUB_DIGEST;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
117 break;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
118 case 'h':
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
119 print_help(argv[0]);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
120 break;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
121 case 'L':
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
122 listdir = optarg;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
123 break;
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
124 case 'm':
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
125 typesub = SUB_FILE;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
126 subfile = "/control/moderators";
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
127 break;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
128 case 'n':
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
129 typesub = SUB_NOMAIL;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
130 break;
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
131 case 'o':
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
132 typesub = SUB_FILE;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
133 subfile = "/control/owner";
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
134 break;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
135 case 'V':
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
136 print_version(argv[0]);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
137 exit(EXIT_SUCCESS);
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
138 default:
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
139 case 's':
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
140 typesub = SUB_NORMAL;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
141 break;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
142 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
143 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
144
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
145 if(listdir == NULL) {
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
146 fprintf(stderr, "You have to specify -L\n"
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
147 "%s -h for help\n", argv[0]);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
148 exit(EXIT_FAILURE);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
149 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
150
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
151 switch(typesub) {
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
152 default:
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
153 case SUB_NORMAL:
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
154 subddir = "/subscribers.d/";
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
155 break;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
156 case SUB_DIGEST:
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
157 subddir = "/digesters.d/";
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
158 break;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
159 case SUB_NOMAIL:
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
160 subddir = "/nomailsubs.d/";
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
161 break;
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
162 case SUB_FILE:
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
163 subddir = NULL;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
164 break;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
165 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
166
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
167 if(subddir)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
168 subdir = concatstr(2, listdir, subddir);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
169 else
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
170 subdir = NULL;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
171
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
172 if(subdir) {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
173 dirp = opendir(subdir);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
174 if(dirp == NULL) {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
175 fprintf(stderr, "Could not opendir(%s);\n", subdir);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
176 exit(EXIT_FAILURE);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
177 }
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
178 while((dp = readdir(dirp)) != NULL) {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
179 if((strcmp(dp->d_name, "..") == 0) ||
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
180 (strcmp(dp->d_name, ".") == 0))
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
181 continue;
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
182
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
183 fileiter = concatstr(2, subdir, dp->d_name);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
184
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
185 if(docount)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
186 dumpcount(fileiter, &count);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
187 else
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
188 ret = dumpcount(fileiter, NULL);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
189
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
190 myfree(fileiter);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
191 }
389
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
192 myfree(subdir);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
193 closedir(dirp);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
194 } else {
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
195 tmp = concatstr(2, listdir, subfile);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
196 if(docount)
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
197 dumpcount(tmp, &count);
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
198 else
b16868d3f926 mlmmj-list update
mmj
parents: 378
diff changeset
199 dumpcount(tmp, NULL);
367
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
200 }
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
201
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
202 if(docount)
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
203 printf("%d\n", count);
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
204
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
205
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
206 return 0;
a5738a509ecc New binary: mlmmj-list
mmj
parents:
diff changeset
207 }