changeset 177:503250510778

Use mmap to find the subscribers in the subscribers files
author mmj
date Sun, 06 Jun 2004 06:27:14 +1000
parents 186c65c5f81d
children 78d31a5a2d39
files src/mlmmj-send.c
diffstat 1 files changed, 28 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/mlmmj-send.c	Sun Jun 06 00:55:25 2004 +1000
+++ b/src/mlmmj-send.c	Sun Jun 06 06:27:14 2004 +1000
@@ -285,10 +285,33 @@
 {
 	int sendres = 0, addrfd;
 	char *bounceaddr, *addr, *index, *dirname, *addrfilename;
+	char *start, *cur, *next;
+	struct stat st;
 	size_t len;
 
-	while((addr = mygetline(subfd))) {
-		chomp(addr);
+	if(fstat(subfd, &st) < 0) {
+		log_error(LOG_ARGS, "Could not stat subfd");
+		return -1;
+	}
+
+	start = mmap(0, st.st_size, PROT_READ, MAP_SHARED, subfd, 0);
+	if(start == MAP_FAILED) {
+		log_error(LOG_ARGS, "Could not mmap subfd");
+		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)
+				len++;
+			addr = malloc(len + 1);
+			strncpy(addr, cur, len);
+			addr[len] = '\0';
+			cur = next + 1;
+		} else
+			continue;
+
 		if(from)
 			sendres = send_mail(sockfd, from, addr, replyto,
 					    mailmap, mailsize, listdir, NULL);
@@ -310,7 +333,7 @@
 						    "be requeued.", dirname);
 				free(dirname);
 				free(addr);
-				return 1;
+				return -1;
 			}
 			addrfilename = concatstr(2, dirname, "/subscribers");
 			free(dirname);
@@ -321,7 +344,7 @@
 						    addrfilename);
 				free(addrfilename);
 				free(addr);
-				return 1;
+				return -1;
 			} else { /* dump the remaining addresses */
 				do {
 					/* Dirty hack to add newline. */
@@ -341,7 +364,7 @@
 			free(addrfilename);
 			close(addrfd);
 
-			return 1;
+			return -1;
 		}
 	}
 	return 0;