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;
 }