Mercurial > hg > mlmmj
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;