Mercurial > hg > mlmmj
changeset 389:b16868d3f926
mlmmj-list update
author | mmj |
---|---|
date | Mon, 29 Nov 2004 05:46:43 +1100 |
parents | b58c5059749e |
children | 61513d6dc4f2 |
files | include/mlmmj.h man/mlmmj-list.1 src/mlmmj-list.c |
diffstat | 3 files changed, 128 insertions(+), 62 deletions(-) [+] |
line wrap: on
line diff
--- a/include/mlmmj.h Sat Nov 27 01:36:27 2004 +1100 +++ b/include/mlmmj.h Mon Nov 29 05:46:43 2004 +1100 @@ -69,7 +69,8 @@ enum subtype { SUB_NORMAL, SUB_DIGEST, - SUB_NOMAIL + SUB_NOMAIL, + SUB_FILE /* For single files (moderator, owner etc.) */ }; void print_version(const char *prg); @@ -95,7 +96,7 @@ #ifdef strdup #undef strdup #define strdup Bad_programmer__no_biscuit -#endif +#endif /* strdup */ #endif /* _MEMORY_C */ #endif /* MLMMJ_GENERIC_INCLUDES */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/mlmmj-list.1 Mon Nov 29 05:46:43 2004 +1100 @@ -0,0 +1,27 @@ +.TH mlmmj-list "1" "November 2004" mlmmj-recieve +.SH NAME +mlmmj-list \- list people / subscribers associated with a list +.SH SYNOPSIS +.B mlmmj-list +\fI-L /path/to/listdir \fR[\fI-c\fR] \fR[\fI-d\fR] \fR[\fI-h\fR] [\fI-m\fR] [\fI-n\fR] [\fI-o\fR] \fR[\fI-s\fR] \fR[\fI-V\fR] +.HP +\fB\-c\fR: Count the emailaddresses +.HP +\fB\-d\fR: Print for digesters list +.HP +\fB\-L\fR: Full path to list directory +.HP +\fB\-m\fR: Print moderators for list +.HP +\fB\-n\fR: Print for nomail version of list +.HP +\fB\-o\fR: Print the owner(s) of the list +.HP +\fB\-s\fR: Print normail subscribers (default) +.HP +\fB\-V\fR: Print version + +.SH AUTHORS +This manual page was written by the following person: +.HP +Mads Martin Jørgensen <mmj@mmj.dk>
--- a/src/mlmmj-list.c Sat Nov 27 01:36:27 2004 +1100 +++ b/src/mlmmj-list.c Mon Nov 29 05:46:43 2004 +1100 @@ -39,28 +39,70 @@ static void print_help(const char *prg) { - printf("Usage: %s -L /path/to/listdir [-d] [-h] [-n] [-N]\n" - " -h: This help\n" + printf("Usage: %s -L /path/to/listdir [-c] [-d] [-h] [-m] [-n] " + "[-o] [-s] [-V]\n" " -L: Full path to list directory\n" + " -c: Print subscriber count\n" " -d: Print for digesters list\n" + " -h: This help\n" + " -m: Print moderators for list\n" " -n: Print for nomail version of list\n" - " -c: Print subscriber count\n" + " -o: Print owner(s) of list\n" + " -s: Print normal subscribers (default) \n" " -V: Print version\n", prg); exit(EXIT_SUCCESS); } +int dumpcount(const char *filename, int *count) +{ + int fd; + char *start, *next, *cur; + struct stat st; + size_t len; + + if((fd = open(filename, O_RDONLY)) < 0) + return -1; + + if(stat(filename, &st) < 0) + return -1; + + if(!S_ISREG(st.st_mode)) + return -1; + + start = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + if(start == MAP_FAILED) + return -1; + + for(next = cur = start; next < start + st.st_size; next++) { + if(*next == '\n' || next == start + st.st_size - 1) { + len = next - cur; + if(next == start + st.st_size - 1 && *next != '\n') + len++; + if(count) + (*count)++; + else { + writen(STDOUT_FILENO, cur, len); + writen(STDOUT_FILENO, "\n", 1); + } + cur = next + 1; + } + } + munmap(start, st.st_size); + close(fd); + + return 0; +} + int main(int argc, char **argv) { - int opt, fd, count = 0, docount = 0; - char *listdir = NULL, *fileiter = NULL, *start; - char *next, *cur, *subddir, *subdir; + int opt, ret, count = 0, docount = 0; + char *listdir = NULL, *fileiter = NULL, *tmp; + char *subddir, *subdir, *subfile = NULL; DIR *dirp; struct dirent *dp; - struct stat st; - size_t len; enum subtype typesub = SUB_NORMAL; - while ((opt = getopt(argc, argv, "cdhnVL:")) != -1) { + while ((opt = getopt(argc, argv, "cdhmnosVL:")) != -1) { switch(opt) { case 'c': docount = 1; @@ -74,12 +116,24 @@ case 'L': listdir = optarg; break; + case 'm': + typesub = SUB_FILE; + subfile = "/control/moderators"; + break; case 'n': typesub = SUB_NOMAIL; break; + case 'o': + typesub = SUB_FILE; + subfile = "/control/owner"; + break; case 'V': print_version(argv[0]); exit(EXIT_SUCCESS); + default: + case 's': + typesub = SUB_NORMAL; + break; } } @@ -92,19 +146,25 @@ switch(typesub) { default: case SUB_NORMAL: - subddir = mystrdup("/subscribers.d/"); + subddir = "/subscribers.d/"; break; case SUB_DIGEST: - subddir = mystrdup("/digesters.d/"); + subddir = "/digesters.d/"; break; case SUB_NOMAIL: - subddir = mystrdup("/nomailsubs.d/"); + subddir = "/nomailsubs.d/"; + break; + case SUB_FILE: + subddir = NULL; break; } + if(subddir) subdir = concatstr(2, listdir, subddir); - myfree(subddir); + else + subdir = NULL; + if(subdir) { dirp = opendir(subdir); if(dirp == NULL) { fprintf(stderr, "Could not opendir(%s);\n", subdir); @@ -117,48 +177,26 @@ fileiter = concatstr(2, subdir, dp->d_name); - if(stat(fileiter, &st) < 0) { - myfree(fileiter); - continue; - } - if(!S_ISREG(st.st_mode)) { + if(docount) + dumpcount(fileiter, &count); + else + ret = dumpcount(fileiter, NULL); + myfree(fileiter); - continue; - } - if((fd = open(fileiter, O_RDONLY)) < 0) { - myfree(fileiter); - continue; - } - start = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); - if(start == MAP_FAILED) { - myfree(fileiter); - continue; } - for(next = cur = start; next < start + st.st_size; next++) { - if(*next == '\n' || next == start + st.st_size - 1) { - len = next - cur; - if(next == start + st.st_size - 1 && - *next != '\n') - len++; + myfree(subdir); + closedir(dirp); + } else { + tmp = concatstr(2, listdir, subfile); if(docount) - count++; - else { - writen(STDOUT_FILENO, cur, len); - writen(STDOUT_FILENO, "\n", 1); - } - cur = next + 1; - } - } - munmap(start, st.st_size); - close(fd); - myfree(fileiter); + dumpcount(tmp, &count); + else + dumpcount(tmp, NULL); } if(docount) printf("%d\n", count); - myfree(subdir); - closedir(dirp); return 0; }