Mercurial > hg > mlmmj
changeset 541:370b9af33cc6
Small submod fix
author | mmj |
---|---|
date | Fri, 03 Mar 2006 00:18:21 +1100 |
parents | 2f374935d20c |
children | 7df67dcb9e59 |
files | include/mlmmj-sub.h src/mlmmj-sub.c |
diffstat | 2 files changed, 33 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/include/mlmmj-sub.h Mon Feb 20 16:00:09 2006 +1100 +++ b/include/mlmmj-sub.h Fri Mar 03 00:18:21 2006 +1100 @@ -28,12 +28,10 @@ void moderate_sub(const char *listdir, const char *listaddr, const char *listdelim, const char *subaddr, - const char *mlmmjsend, enum subtype typesub, - int do_moderate); + const char *mlmmjsend, enum subtype typesub); void confirm_sub(const char *listdir, const char *listaddr, const char *listdelim, const char *subaddr, - const char *mlmmjsend, enum subtype typesub, - int do_moderate); + const char *mlmmjsend, enum subtype typesub); void generate_subconfirm(const char *listdir, const char *listadr, const char *listdelim, const char *subaddr, const char *mlmmjsend, enum subtype typesub);
--- a/src/mlmmj-sub.c Mon Feb 20 16:00:09 2006 +1100 +++ b/src/mlmmj-sub.c Fri Mar 03 00:18:21 2006 +1100 @@ -51,23 +51,17 @@ void moderate_sub(const char *listdir, const char *listaddr, const char *listdelim, const char *subaddr, - const char *mlmmjsend, enum subtype typesub, - int do_moderate) + const char *mlmmjsend, enum subtype typesub) { int i, fd; char *a = NULL, *queuefilename, *from, *listname, *listfqdn, *str; char *modfilename, *randomstr, *mods, *to, *replyto, *moderators = NULL; + char *modfilebase; struct strlist *submods; pid_t pid; char *maildata[6] = { "subaddr", NULL, "moderateaddr", NULL, "moderators", NULL }; - submods = ctrlvalues(listdir, "submod"); - - /* no subscriber moderation wanted */ - if(submods == NULL || do_moderate == 0) - return; - /* generate the file in moderation/ */ switch(typesub) { default: @@ -111,32 +105,37 @@ myfree(str); + submods = ctrlvalues(listdir, "submod"); + mods = concatstr(2, listdir, "/control/submod"); /* check to see if there's adresses in the submod control file */ - mods = concatstr(2, listdir, "/control/submod"); for(i = 0; i < submods->count; i++) a = strchr(submods->strs[i], '@'); /* no addresses in submod control file, use owner */ if(a == NULL) { - mods = concatstr(2, listdir, "/control/owner"); /* free the submods struct from above */ for(i = 0; i < submods->count; i++) myfree(submods->strs[i]); myfree(submods->strs); + myfree(submods); + submods = ctrlvalues(listdir, "owner"); + myfree(mods); + mods = concatstr(2, listdir, "/control/submod"); } - /* send mail to requester that the list is submod'ed */ - /* send mail to moderators about request pending */ listdelim = getlistdelim(listdir); listfqdn = genlistfqdn(listaddr); listname = genlistname(listaddr); + modfilebase = mybasename(modfilename); from = concatstr(4, listname, listdelim, "owner@", listfqdn); to = concatstr(3, listname, "-moderators@", listfqdn); - replyto = concatstr(6, listname, listdelim, "moderate-", modfilename, + replyto = concatstr(6, listname, listdelim, "moderate-", modfilebase, "@", listfqdn); + myfree(modfilebase); for(i = 0; i < submods->count; i++) { + printf("%s", submods->strs[i]); str = moderators; moderators = concatstr(3, moderators, submods->strs[i], "\n"); myfree(str); @@ -150,7 +149,9 @@ "$listowner$", to, replyto, 3, maildata); myfree(maildata[1]); + /* we need to exec more than one mlmmj-send */ + pid = fork(); if(pid < 0) { @@ -176,6 +177,8 @@ myfree(moderators); myfree(queuefilename); + /* send mail to requester that the list is submod'ed */ + from = concatstr(4, listname, listdelim, "bounces-help@", listfqdn); queuefilename = prepstdreply(listdir, "submod-requester", "$listowner$", subaddr, NULL, 0, NULL); @@ -193,13 +196,12 @@ void confirm_sub(const char *listdir, const char *listaddr, const char *listdelim, const char *subaddr, - const char *mlmmjsend, enum subtype typesub, - int do_moderate) + const char *mlmmjsend, enum subtype typesub) { char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext; moderate_sub(listdir, listaddr, listdelim, subaddr, mlmmjsend, - typesub, do_moderate); + typesub); listname = genlistname(listaddr); listfqdn = genlistfqdn(listaddr); @@ -432,7 +434,7 @@ char *subfilename = NULL, *mlmmjsend, *bindir, chstr[2], *subdir; char *subddirname = NULL, *sublockname, *lowcaseaddr; int subconfirm = 0, confirmsub = 0, opt, subfilefd, lock, notifysub; - int changeuid = 1, status, digest = 0, nomail = 0, i = 0; + int changeuid = 1, status, digest = 0, nomail = 0, i = 0, submod; int groupwritable = 0, sublock, sublockfd, nogensubscribed = 0, subbed; size_t len; struct stat st; @@ -604,6 +606,8 @@ } subbed = is_subbed_in(subddirname, address); listdelim = getlistdelim(listdir); + submod = statctrl(listdir, "submod"); + if(subbed) { if(subconfirm) { close(subfilefd); @@ -613,6 +617,14 @@ generate_subconfirm(listdir, listaddr, listdelim, address, mlmmjsend, typesub); } else { + if(submod) { + close(subfilefd); + close(sublockfd); + unlink(sublockname); + myfree(sublockname); + moderate_sub(listdir, listaddr, listdelim, + address, mlmmjsend, typesub); + } lseek(subfilefd, 0L, SEEK_END); len = strlen(address); address[len] = '\n'; @@ -645,7 +657,7 @@ if(childpid < 0) { log_error(LOG_ARGS, "Could not fork"); confirm_sub(listdir, listaddr, listdelim, address, - mlmmjsend, typesub, 1); + mlmmjsend, typesub); } if(childpid > 0) { @@ -657,7 +669,7 @@ /* child confirms subscription */ if(childpid == 0) confirm_sub(listdir, listaddr, listdelim, address, - mlmmjsend, typesub, 1); + mlmmjsend, typesub); } notifysub = statctrl(listdir, "notifysub");