]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Convert textcontent and ctrlcontent to ctrlvalue
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 28 Dec 2022 13:51:51 +0000 (14:51 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 28 Dec 2022 13:51:51 +0000 (14:51 +0100)
15 files changed:
include/ctrlvalue.h
include/listcontrol.h
include/prepstdreply.h
include/send_digest.h
include/send_list.h
src/ctrlvalue.c
src/listcontrol.c
src/mlmmj-bounce.c
src/mlmmj-maintd.c
src/mlmmj-process.c
src/mlmmj-sub.c
src/mlmmj-unsub.c
src/prepstdreply.c
src/send_digest.c
src/send_list.c

index afa469b1079a3e1f1d6777d6983b33f5e3eaed5e..48c31b90086480b9229bf670c6fd65ccf526fcbe 100644 (file)
@@ -29,8 +29,8 @@
 #include <limits.h>
 
 char *ctrlvalue(int ctrlfd, const char *ctrlstr);
-char *ctrlcontent(const char *listdir, const char *ctrlstr);
-char *textcontent(const char *listdir, const char *ctrlstr);
+char *ctrlcontent(int ctrlfd, const char *ctrlstr);
+char *textcontent(int listfd, const char *ctrlstr);
 intmax_t ctrlim(int ctrlfd, const char *ctrlstr, intmax_t min,
     intmax_t max, intmax_t fallback);
 uintmax_t ctrluim(int ctrlfd, const char *ctrlstr, uintmax_t min,
index 70d6fb4b9740375ae74b2a77b1bc08f8dd128866..78316d95a049b8c0af537207a8217667cf10c0e1 100644 (file)
@@ -29,6 +29,6 @@
 int listcontrol(struct email_container *fromemails, const char *listdir,
                const char *controlstr, const char *mlmmjsub,
                const char *mlmmjunsub, const char *mlmmjsend,
-               const char *mailname, int fd);
+               const char *mailname, int listfd, int ctrlfd);
 
 #endif /* LISTCONTROL_H */
index 66790060c109232c9b9b043c46fe9e66be5292ba..d807727ae021b750afb67ddb50825b25016bc243 100644 (file)
@@ -51,7 +51,7 @@ const char *get_file_line(void *state);
 void finish_file_lines(file_lines_state *s);
 
 char *substitute(const char *line, const char *listaddr, const char *listdelim,
-               const char *listdir, text *txt);
+               int listfd, int ctrlfd, text *txt);
 
 text *open_text_file(const char *listdir, const char *filename);
 text *open_text(const char *listdir, const char *purpose, const char *action,
@@ -61,9 +61,9 @@ void register_originalmail(text *txt, const char *mailname);
 void register_formatted(text *txt, const char *token,
                rewind_function rew, get_function get, void * state);
 char *get_processed_text_line(text *txt, int headers,
-               const char *listaddr, const char *listdelim, const char *listdir, int ctrlfd);
+               const char *listaddr, const char *listdelim, const char *listdir, int listfd, int ctrlfd);
 char *prepstdreply(text *txt, const char *listdir,
-               const char *from, const char *to, const char *replyto, int ctrlfd);
+               const char *from, const char *to, const char *replyto, int listfd, int ctrlfd);
 void close_text(text *txt);
 
 #endif /* PREPSTDREPLY_H */
index 4ebcd1077f6601ad298078c10e58598654fbddea..d9fb645631c2b46e631f1fc666e64c4278e9203a 100644 (file)
@@ -25,6 +25,6 @@
 #define SEND_DIGEST_H
 
 int send_digest(const char *listdir, int lastindex, int index,
-               int issue, const char *addr, const char *mlmmjsend, int ctrlfd);
+               int issue, const char *addr, const char *mlmmjsend, int listfd, int ctrlfd);
 
 #endif /* SEND_DIGEST_H */
index 9b1af989e09ab065fb20f2a5699addf08d78d743..986aa689c88c645d0fdd73b26e92381629292cee 100644 (file)
@@ -25,6 +25,6 @@
 #define SEND_LIST_H
 
 void send_list(const char *listdir, const char *emailaddr,
-              const char *mlmmjsend, int ctrlfd);
+              const char *mlmmjsend, int ctrlfd, int listfd);
 
 #endif
index 4be678e1c156237b0b5a627c3e282d449f83157d..0aea7b0a6b8e484e920577028f2dbc38693151e4 100644 (file)
@@ -39,7 +39,7 @@
 #include "xmalloc.h"
 
 static char *
-_ctrlval(int ctrlfd, const char *ctrlstr, int oneline)
+ctrlval(int ctrlfd, const char *ctrlstr, int oneline)
 {
        int fd;
        FILE *fp;
@@ -72,48 +72,25 @@ _ctrlval(int ctrlfd, const char *ctrlstr, int oneline)
        return (buf);
 }
 
-static char *ctrlvalat(int dfd, const char *subdir,
-               const char *ctrlstr, int oneline)
+char *
+ctrlvalue(int ctrlfd, const char *ctrlstr)
 {
-       char *buf;
-       int ctrlfd;
-
-       if (dfd == -1)
-               return NULL;
-
-       ctrlfd = openat(dfd, subdir, O_DIRECTORY|O_CLOEXEC);
-
-       if(ctrlfd < 0)
-               return NULL;
-
-       buf = _ctrlval(ctrlfd, ctrlstr, oneline);
-       close(ctrlfd);
-       return (buf);
+       return (ctrlval(ctrlfd, ctrlstr, true));
 }
 
-static char *ctrlval(const char *listdir, const char *subdir,
-               const char *ctrlstr, int oneline)
+char *
+ctrlcontent(int ctrlfd, const char *ctrlstr)
 {
-       int dfd = open(listdir, O_DIRECTORY|O_CLOEXEC);
-       char *ret = ctrlvalat(dfd, subdir, ctrlstr, oneline);
-       if (dfd != -1)
-               close(dfd);
-       return (ret);
-}
-
-char *ctrlvalue(int ctrlfd, const char *ctrlstr)
-{
-       return (_ctrlval(ctrlfd, ctrlstr, true));
+       return (ctrlval(ctrlfd, ctrlstr, false));
 }
 
-char *ctrlcontent(const char *listdir, const char *ctrlstr)
+char *
+textcontent(int listfd, const char *ctrlstr)
 {
-       return ctrlval(listdir, "control", ctrlstr, 0);
-}
-
-char *textcontent(const char *listdir, const char *ctrlstr)
-{
-       return ctrlval(listdir, "text", ctrlstr, 0);
+       int fd = openat(listfd, "text", O_DIRECTORY|O_CLOEXEC);
+       char *ret = ctrlval(fd, ctrlstr, false);
+       close(fd);
+       return (ret);
 }
 
 intmax_t
@@ -121,7 +98,7 @@ ctrlim(int ctrlfd, const char *ctrlstr, intmax_t min, intmax_t max,
     intmax_t fallback)
 {
        const char *errstr;
-       char *val = _ctrlval(ctrlfd, ctrlstr, true);
+       char *val = ctrlval(ctrlfd, ctrlstr, true);
        intmax_t ret;
 
        if (val == NULL)
@@ -142,7 +119,7 @@ ctrluim(int ctrlfd, const char *ctrlstr, uintmax_t min, uintmax_t max,
     uintmax_t fallback)
 {
        const char *errstr;
-       char *val = _ctrlval(ctrlfd, ctrlstr, true);
+       char *val = ctrlval(ctrlfd, ctrlstr, true);
        uintmax_t ret;
 
        if (val == NULL)
@@ -162,7 +139,7 @@ time_t
 ctrltimet(int dfd, const char *ctrlstr, time_t fallback)
 {
        const char *errstr;
-       char *val = _ctrlval(dfd, ctrlstr, true);
+       char *val = ctrlval(dfd, ctrlstr, true);
        time_t ret;
 
        if (val == NULL)
index 2d5db85632907338d698a90d4d39ea2414f79d1c..928b71d79558cbf0ac776dd93b1e8742cb05fa2a 100644 (file)
@@ -115,7 +115,7 @@ static struct ctrl_command ctrl_commands[] = {
 int listcontrol(struct email_container *fromemails, const char *listdir,
                const char *controlstr, const char *mlmmjsub,
                const char *mlmmjunsub, const char *mlmmjsend,
-               const char *mailname, int ctrlfd)
+               const char *mailname, int listfd, int ctrlfd)
 {
        char *bouncenr, *tmpstr;
        char *param = NULL, *conffilename, *moderatefilename, *gatekeepfilename;
@@ -134,7 +134,6 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
        const char *subtype = NULL;
        const char *subtypename = NULL;
        bounce_t bret;
-       int listfd;
 
        /* A closed list doesn't allow subscribtion and unsubscription */
        closedlist = statctrl(ctrlfd, "closedlist");
@@ -233,7 +232,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                                        fromemails->emaillist[0]);
                        queuefilename = prepstdreply(txt, listdir,
                                        "$listowner$",
-                                       fromemails->emaillist[0], NULL, ctrlfd);
+                                       fromemails->emaillist[0], NULL, listfd, ctrlfd);
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
@@ -275,7 +274,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                                        fromemails->emaillist[0]);
                        queuefilename = prepstdreply(txt, listdir,
                                        "$listowner$",
-                                       fromemails->emaillist[0], NULL, ctrlfd);
+                                       fromemails->emaillist[0], NULL, listfd, ctrlfd);
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
@@ -317,7 +316,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                                        fromemails->emaillist[0]);
                        queuefilename = prepstdreply(txt, listdir,
                                        "$listowner$",
-                                       fromemails->emaillist[0], NULL, ctrlfd);
+                                       fromemails->emaillist[0], NULL, listfd, ctrlfd);
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
@@ -695,7 +694,7 @@ permit:
                txt = open_text(listdir, "help", NULL, NULL, NULL, "listhelp");
                MY_ASSERT(txt);
                queuefilename = prepstdreply(txt, listdir,
-                               "$listowner$", fromemails->emaillist[0], NULL, ctrlfd);
+                               "$listowner$", fromemails->emaillist[0], NULL, listfd, ctrlfd);
                MY_ASSERT(queuefilename);
                close_text(txt);
                send_help(listdir, queuefilename,
@@ -717,7 +716,7 @@ permit:
                txt = open_text(listdir, "faq", NULL, NULL, NULL, "listfaq");
                MY_ASSERT(txt);
                queuefilename = prepstdreply(txt, listdir,
-                               "$listowner$", fromemails->emaillist[0], NULL, ctrlfd);
+                               "$listowner$", fromemails->emaillist[0], NULL, listfd, ctrlfd);
                MY_ASSERT(queuefilename);
                close_text(txt);
                send_help(listdir, queuefilename,
@@ -792,7 +791,8 @@ permit:
                                " Ignoring mail");
                        return -1;
                } else {
-                       send_list(listdir, owners->strs[owner_idx], mlmmjsend, ctrlfd);
+                       send_list(listdir, owners->strs[owner_idx], mlmmjsend,
+                           listfd, ctrlfd);
                }
                break;
 
index cdae8c1756517c430bb3ff3a9a1e211dbf0f063d..ce5aaa869b93f74a0815f9908a4b17290de61bd4 100644 (file)
@@ -53,7 +53,8 @@
 #include "utils.h"
 
 
-void do_probe(const char *listdir, const char *mlmmjsend, const char *addr, int ctrlfd)
+void do_probe(const char *listdir, const char *mlmmjsend, const char *addr,
+    int listfd, int ctrlfd)
 {
        text *txt;
        file_lines_state *fls;
@@ -92,7 +93,7 @@ void do_probe(const char *listdir, const char *mlmmjsend, const char *addr, int
        fls = init_truncated_file_lines(addr, 0, ':');
        register_formatted(txt, "bouncenumbers",
                        rewind_file_lines, get_file_line, fls);
-       queuefilename = prepstdreply(txt, listdir, "$listowner$", myaddr, NULL, ctrlfd);
+       queuefilename = prepstdreply(txt, listdir, "$listowner$", myaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -231,7 +232,7 @@ int main(int argc, char **argv)
 
        if (probe) {
                /* send out a probe */
-               do_probe(listdir, mlmmjsend, address, ctrlfd);
+               do_probe(listdir, mlmmjsend, address, listfd, ctrlfd);
                /* do_probe() will never return */
                exit(EXIT_FAILURE);
        }
index 6a5639f15db3b6779a42ccb407c5347752481594..283e84696b74ffcae23958c705653311727e3a3d 100644 (file)
@@ -652,7 +652,7 @@ run_digests(int dfd, int ctrlfd, const char *mlmmjsend, const char *listdir, int
 
                if (index > lastindex) {
                        lastissue++;
-                       send_digest(listdir, lastindex+1, index, lastissue, NULL, mlmmjsend, ctrlfd);
+                       send_digest(listdir, lastindex+1, index, lastissue, NULL, mlmmjsend, dfd, ctrlfd);
                }
 
                if (lseek(fd, 0, SEEK_SET) < 0) {
index dbdfde07e70a5ee6977d38c31eb01ca43d32ea49..424bae6eece177d750dc72e319b41f4239639a40 100644 (file)
@@ -129,7 +129,7 @@ static int is_moderator(const char *listdir, const char *address,
 static void newmoderated(const char *listdir, const char *mailfilename,
                  const char *mlmmjsend, const char *efromsender,
                  const char *subject, const char *posteraddr,
-                 enum modreason modreason, int ctrlfd)
+                 enum modreason modreason, int listfd, int ctrlfd)
 {
        char *from, *listfqdn, *listname, *moderators = NULL;
        char *replyto, *listaddr = getlistaddr(ctrlfd), *listdelim;
@@ -183,7 +183,7 @@ static void newmoderated(const char *listdir, const char *mailfilename,
                        rewind_memory_lines, get_memory_line, mls);
        register_originalmail(txt, mailfilename);
        queuefilename = prepstdreply(txt, listdir, "$listowner$", to, replyto,
-           ctrlfd);
+           listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -204,7 +204,7 @@ static void newmoderated(const char *listdir, const char *mailfilename,
                                rewind_memory_lines, get_memory_line, mls);
                register_originalmail(txt, mailfilename);
                queuefilename = prepstdreply(txt, listdir,
-                               "$listowner$", efromsender, NULL, ctrlfd);
+                               "$listowner$", efromsender, NULL, listfd, ctrlfd);
                MY_ASSERT(queuefilename);
                close_text(txt);
 
@@ -788,7 +788,7 @@ int main(int argc, char **argv)
                        testfrom = &fromemails;
                listcontrol(testfrom, listdir, recipextra,
                            mlmmjsub, mlmmjunsub, mlmmjsend,
-                           donemailname, ctrlfd);
+                           donemailname, listfd, ctrlfd);
 
                return EXIT_SUCCESS;
        }
@@ -832,7 +832,7 @@ int main(int argc, char **argv)
                        register_unformatted(txt, "maxmailsize", maxmailsizestr);
                        register_originalmail(txt, donemailname);
                        queuefilename = prepstdreply(txt, listdir,
-                           "$listowner$", posteraddr, NULL, ctrlfd);
+                           "$listowner$", posteraddr, NULL, listfd, ctrlfd);
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        free(listdelim);
@@ -897,7 +897,7 @@ int main(int argc, char **argv)
                register_unformatted(txt, "posteraddr", posteraddr);
                register_originalmail(txt, donemailname);
                queuefilename = prepstdreply(txt, listdir,
-                   "$listowner$", posteraddr, NULL, ctrlfd);
+                   "$listowner$", posteraddr, NULL, listfd, ctrlfd);
                MY_ASSERT(queuefilename)
                close_text(txt);
                free(listdelim);
@@ -942,7 +942,7 @@ int main(int argc, char **argv)
                        register_unformatted(txt, "posteraddr", posteraddr);
                        register_originalmail(txt, donemailname);
                        queuefilename = prepstdreply(txt, listdir,
-                                       "$listowner$", posteraddr, NULL, ctrlfd);
+                                       "$listowner$", posteraddr, NULL, listfd, ctrlfd);
                        MY_ASSERT(queuefilename)
                        close_text(txt);
                        free(listaddr);
@@ -1054,7 +1054,7 @@ int main(int argc, char **argv)
                            register_unformatted(txt, "posteraddr", testaddr);
                            register_originalmail(txt, donemailname);
                            queuefilename = prepstdreply(txt, listdir,
-                                   "$listowner$", testaddr, NULL, ctrlfd);
+                                   "$listowner$", testaddr, NULL, listfd, ctrlfd);
                            MY_ASSERT(queuefilename)
                            close_text(txt);
                            free(listaddr);
@@ -1113,7 +1113,7 @@ int main(int argc, char **argv)
                }
                newmoderated(listdir, mqueuename,
                                mlmmjsend, efrom, subject, posteraddr,
-                               modreason, ctrlfd);
+                               modreason, listfd, ctrlfd);
                return EXIT_SUCCESS;
        }
 
index 67974429e2949169855ab8c52bd3cbec0fc4351d..8a708829f8147225607253b903ff2bedcf14b6dd 100644 (file)
@@ -53,7 +53,8 @@
 
 static void moderate_sub(const char *listdir, const char *listaddr,
                const char *listdelim, const char *subaddr,
-               const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+               const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub,
+               int listfd, int ctrlfd)
 {
        int i, fd, status;
        text *txt;
@@ -160,7 +161,7 @@ static void moderate_sub(const char *listdir, const char *listaddr,
        register_formatted(txt, "gatekeepers",
                        rewind_memory_lines, get_memory_line, mls);
        queuefilename = prepstdreply(txt, listdir, "$listowner$", to, replyto,
-           ctrlfd);
+           listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
        
@@ -210,7 +211,7 @@ static void moderate_sub(const char *listdir, const char *listaddr,
        register_formatted(txt, "gatekeepers",
                        rewind_memory_lines, get_memory_line, mls);
        queuefilename = prepstdreply(txt, listdir,
-                       "$listowner$", subaddr, NULL, ctrlfd);
+                       "$listowner$", subaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -288,7 +289,8 @@ freedone:
 
 void confirm_sub(const char *listdir, const char *listaddr,
                const char *listdelim, const char *subaddr,
-               const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+               const char *mlmmjsend, enum subtype typesub,
+               enum subreason reasonsub, int listfd, int ctrlfd)
 {
        text *txt;
        char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
@@ -325,7 +327,7 @@ void confirm_sub(const char *listdir, const char *listaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, NULL, ctrlfd);
+                       "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -335,7 +337,8 @@ void confirm_sub(const char *listdir, const char *listaddr,
 
 void notify_sub(const char *listdir, const char *listaddr,
                const char *listdelim, const char *subaddr,
-               const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+               const char *mlmmjsend, enum subtype typesub,
+               enum subreason reasonsub, int listfd, int ctrlfd)
 {
        char *listfqdn, *listname, *fromaddr, *tostr;
        text *txt;
@@ -375,7 +378,7 @@ void notify_sub(const char *listdir, const char *listaddr,
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "newsub", subaddr); /* DEPRECATED */
        queuefilename = prepstdreply(txt, listdir,
-                       "$listowner$", "$listowner$", NULL, ctrlfd);
+                       "$listowner$", "$listowner$", NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -385,7 +388,8 @@ void notify_sub(const char *listdir, const char *listaddr,
 
 void generate_subconfirm(const char *listdir, const char *listaddr,
                         const char *listdelim, const char *subaddr,
-                        const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+                        const char *mlmmjsend, enum subtype typesub,
+                        enum subreason reasonsub, int listfd, int ctrlfd)
 {
        int subconffd;
        char *confirmaddr, *listname, *listfqdn, *confirmfilename = NULL;
@@ -465,7 +469,7 @@ void generate_subconfirm(const char *listdir, const char *listaddr,
        register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
        register_unformatted(txt, "confirmaddr", confirmaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, confirmaddr, ctrlfd);
+                       "$helpaddr$", subaddr, confirmaddr, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -501,7 +505,7 @@ static void print_help(const char *prg)
 
 void generate_subscribed(const char *listdir, const char *subaddr,
     const char *mlmmjsend, enum subtype typesub, const char *listaddr,
-    const char *listdelim, int ctrlfd)
+    const char *listdelim, int listfd, int ctrlfd)
 {
        text *txt;
        char *queuefilename, *fromaddr, *listname, *listfqdn;
@@ -517,7 +521,7 @@ void generate_subscribed(const char *listdir, const char *subaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, NULL, ctrlfd);
+                       "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -704,7 +708,7 @@ int main(int argc, char **argv)
        if(subbed == typesub) {
                if(!nogensubscribed)
                        generate_subscribed(listdir, address, mlmmjsend,
-                           typesub, listaddr, listdelim, ctrlfd);
+                           typesub, listaddr, listdelim, listfd, ctrlfd);
                return EXIT_SUCCESS;
        } else if(subbed != SUB_NONE) {
                reasonsub = SUB_SWITCH;
@@ -727,12 +731,13 @@ int main(int argc, char **argv)
 
        if(subbed == SUB_NONE && subconfirm)
                        generate_subconfirm(listdir, listaddr, listdelim,
-                       address, mlmmjsend, typesub, reasonsub, ctrlfd);
+                       address, mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
 
        if(modstr == NULL && subbed == SUB_NONE && !force &&
                        statctrl(ctrlfd, "submod")) {
                moderate_sub(listdir, listaddr, listdelim,
-                               address, mlmmjsend, typesub, reasonsub, ctrlfd);
+                               address, mlmmjsend, typesub, reasonsub, listfd,
+                               ctrlfd);
        }
 
        if (typesub == SUB_BOTH) {
@@ -752,7 +757,7 @@ int main(int argc, char **argv)
                if(childpid < 0) {
                        log_error(LOG_ARGS, "Could not fork; owner not notified");
                        confirm_sub(listdir, listaddr, listdelim, address,
-                                       mlmmjsend, typesub, reasonsub, ctrlfd);
+                                       mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
                }
                
                if(childpid > 0) {
@@ -764,7 +769,7 @@ int main(int argc, char **argv)
                /* child confirms subscription */
                if(childpid == 0)
                        confirm_sub(listdir, listaddr, listdelim, address,
-                                       mlmmjsend, typesub, reasonsub, ctrlfd);
+                                       mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
        }
 
        notifysub = !quiet && reasonsub != SUB_SWITCH &&
@@ -773,7 +778,7 @@ int main(int argc, char **argv)
        /* Notify list owner about subscription */
        if (notifysub)
                notify_sub(listdir, listaddr, listdelim, address, mlmmjsend,
-                               typesub, reasonsub, ctrlfd);
+                               typesub, reasonsub, listfd, ctrlfd);
 
        free(address);
        free(listaddr);
index 472f5d43f78f4a3b05525cf18751beb501419aa7..1fe08a1f8cefda38334c96adf2021b3a08470b0d 100644 (file)
@@ -52,7 +52,8 @@
 void confirm_unsub(const char *listdir, const char *listaddr,
                   const char *listdelim, const char *subaddr,
                   const char *mlmmjsend,
-                  enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+                  enum subtype typesub, enum subreason reasonsub, int listfd,
+                  int ctrlfd)
 {
        text *txt;
        char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
@@ -85,7 +86,7 @@ void confirm_unsub(const char *listdir, const char *listaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, NULL, ctrlfd);
+                       "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -96,7 +97,7 @@ void confirm_unsub(const char *listdir, const char *listaddr,
 void notify_unsub(const char *listdir, const char *listaddr,
                  const char *listdelim, const char *subaddr,
                  const char *mlmmjsend,
-                 enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+                 enum subtype typesub, enum subreason reasonsub, int listfd, int ctrlfd)
 {
         char *listfqdn, *listname, *fromaddr, *tostr;
        text *txt;
@@ -132,7 +133,7 @@ void notify_unsub(const char *listdir, const char *listaddr,
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "oldsub", subaddr); /* DEPRECATED */
        queuefilename = prepstdreply(txt, listdir,
-                       "$listowner$", "$listowner$", NULL, ctrlfd);
+                       "$listowner$", "$listowner$", NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -144,7 +145,7 @@ void notify_unsub(const char *listdir, const char *listaddr,
 void generate_unsubconfirm(const char *listdir, const char *listaddr,
                           const char *listdelim, const char *subaddr,
                           const char *mlmmjsend,
-                          enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+                          enum subtype typesub, enum subreason reasonsub, int listfd, int ctrlfd)
 {
        char *confirmaddr, *listname, *listfqdn, *tmpstr;
        text *txt;
@@ -219,7 +220,7 @@ void generate_unsubconfirm(const char *listdir, const char *listaddr,
        register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
        register_unformatted(txt, "confirmaddr", confirmaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, confirmaddr, ctrlfd);
+                       "$helpaddr$", subaddr, confirmaddr, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -254,7 +255,7 @@ static void print_help(const char *prg)
 
 static void generate_notsubscribed(const char *listdir, const char *subaddr,
        const char *mlmmjsend, enum subtype typesub, const char *listaddr,
-       const char *listdelim, int ctrlfd)
+       const char *listdelim, int listfd, int ctrlfd)
 {
        text *txt;
        char *queuefilename, *fromaddr, *listname, *listfqdn;
@@ -270,7 +271,7 @@ static void generate_notsubscribed(const char *listdir, const char *subaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        queuefilename = prepstdreply(txt, listdir,
-                       "$helpaddr$", subaddr, NULL, ctrlfd);
+                       "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);
 
@@ -421,7 +422,7 @@ int main(int argc, char **argv)
                /* Address is not subscribed */
                if(!nogennotsubscribed) {
                        generate_notsubscribed(listdir, address, mlmmjsend,
-                           typesub, listaddr, listdelim, ctrlfd);
+                           typesub, listaddr, listdelim, listfd, ctrlfd);
                }
 
                exit(EXIT_SUCCESS);
@@ -429,7 +430,7 @@ int main(int argc, char **argv)
 
        if(unsubconfirm)
                generate_unsubconfirm(listdir, listaddr, listdelim, address,
-                               mlmmjsend, typesub, reasonsub, ctrlfd);
+                               mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
 
        unsubscribe(listfd, address, typesub);
 
@@ -440,7 +441,7 @@ int main(int argc, char **argv)
                        log_error(LOG_ARGS, "Could not fork");
                        confirm_unsub(listdir, listaddr, listdelim,
                                        address, mlmmjsend,
-                                       typesub, reasonsub, ctrlfd);
+                                       typesub, reasonsub, listfd, ctrlfd);
                }
 
                if(childpid > 0) {
@@ -453,7 +454,7 @@ int main(int argc, char **argv)
                if(childpid == 0)
                        confirm_unsub(listdir, listaddr, listdelim,
                                        address, mlmmjsend,
-                                       typesub, reasonsub, ctrlfd);
+                                       typesub, reasonsub, listfd, ctrlfd);
        }
 
        notifysub = !quiet && statctrl(ctrlfd, "notifysub");
@@ -461,7 +462,7 @@ int main(int argc, char **argv)
         /* Notify list owner about subscription */
         if (notifysub)
                 notify_unsub(listdir, listaddr, listdelim, address, mlmmjsend,
-                               typesub, reasonsub, ctrlfd);
+                               typesub, reasonsub, listfd, ctrlfd);
 
        free(listaddr);
        free(listdelim);
index d082c664c0ac66404c0b48db64b60005638b2d52..700d56d6873079457224d3eaa908fc473457e427 100644 (file)
@@ -329,7 +329,7 @@ static char *numeric_token(char *token)
 
 static void substitute_one(char **line_p, char **pos_p, int *width_p,
                        const char *listaddr, const char *listdelim,
-                       const char *listdir, text *txt)
+                       int listfd, int ctrlfd, text *txt)
 {
        /* It is important for this function to leave the length of the
         * processed portion unchanged, or increase it by just one ASCII
@@ -402,10 +402,10 @@ static void substitute_one(char **line_p, char **pos_p, int *width_p,
                                  fqdn);
        } else if(strncmp(token, "control ", 8) == 0) {
                token = filename_token(token + 8);
-               if (token != NULL) value = ctrlcontent(listdir, token);
+               if (token != NULL) value = ctrlcontent(ctrlfd, token);
        } else if(strncmp(token, "text ", 5) == 0) {
                token = filename_token(token + 5);
-               if (token != NULL) value = textcontent(listdir, token);
+               if (token != NULL) value = textcontent(listfd, token);
        } else if(strcmp(token, "originalmail") == 0) {
                /* DEPRECATED: use %originalmail% instead */
                value = xstrdup(" %originalmail 100%");
@@ -442,7 +442,7 @@ static void substitute_one(char **line_p, char **pos_p, int *width_p,
 
 
 char *substitute(const char *line, const char *listaddr, const char *listdelim,
-               const char *listdir, text *txt)
+               int listfd, int ctrlfd, text *txt)
 {
        char *new;
        char *pos;
@@ -454,7 +454,7 @@ char *substitute(const char *line, const char *listaddr, const char *listdelim,
        while (*pos != '\0') {
                if (*pos == '$') {
                        substitute_one(&new, &pos, &width,
-                                       listaddr, listdelim, listdir, txt);
+                                       listaddr, listdelim, listfd, ctrlfd, txt);
                        /* The function sets up for the next character
                         * to process, so continue straight away. */
                        continue;
@@ -1090,7 +1090,7 @@ static int handle_directive(text *txt, char **line_p, char **pos_p,
 
 char *get_processed_text_line(text *txt, int headers,
                const char *listaddr, const char *listdelim,
-               const char *listdir, int ctrlfd)
+               const char *listdir, int listfd, int ctrlfd)
 {
        char *line;
        const char *item;
@@ -1351,7 +1351,7 @@ char *get_processed_text_line(text *txt, int headers,
                        } else if (*pos == '$' && txt->skip == NULL) {
                                if (peeking) break;
                                substitute_one(&line, &pos, &width, listaddr,
-                                               listdelim, listdir, txt);
+                                               listdelim, listfd, ctrlfd, txt);
                                if (len != pos - line) {
                                        /* Cancel any break inhibition if the
                                         * length changed (which will be
@@ -1583,7 +1583,7 @@ void close_text(text *txt)
 
 
 char *prepstdreply(text *txt, const char *listdir,
-                  const char *from, const char *to, const char *replyto, int ctrlfd)
+                  const char *from, const char *to, const char *replyto, int listfd,  int ctrlfd)
 {
        size_t len, i;
        int outfd;
@@ -1626,10 +1626,10 @@ char *prepstdreply(text *txt, const char *listdir,
                free(str);
        }
 
-       tmp = substitute(from, listaddr, listdelim, listdir, txt);
+       tmp = substitute(from, listaddr, listdelim, listfd, ctrlfd, txt);
        headers[0] = concatstr(2, "From: ", tmp);
        free(tmp);
-       tmp = substitute(to, listaddr, listdelim, listdir, txt);
+       tmp = substitute(to, listaddr, listdelim, listfd, ctrlfd, txt);
        headers[1] = concatstr(2, "To: ", tmp);
        free(tmp);
        headers[2] = genmsgid(listfqdn);
@@ -1642,14 +1642,14 @@ char *prepstdreply(text *txt, const char *listdir,
        headers[7] = xstrdup("Content-Transfer-Encoding: 8bit");
 
        if(replyto) {
-               tmp = substitute(replyto, listaddr, listdelim, listdir, txt);
+               tmp = substitute(replyto, listaddr, listdelim, listfd, ctrlfd, txt);
                headers[8] = concatstr(2, "Reply-To: ", tmp);
                free(tmp);
        }
 
        for(;;) {
                line = get_processed_text_line(txt, 1, listaddr, listdelim,
-                               listdir, ctrlfd);
+                               listdir, listfd, ctrlfd);
                if (!line) {
                        log_error(LOG_ARGS, "No body in listtext");
                        break;
@@ -1736,7 +1736,7 @@ char *prepstdreply(text *txt, const char *listdir,
 
        if (line == NULL) {
                line = get_processed_text_line(txt, 0, listaddr, listdelim,
-                               listdir, ctrlfd);
+                               listdir, listfd, ctrlfd);
        }
        while(line) {
                        if(dprintf(outfd, "%s\n", line) < 0) {
@@ -1748,7 +1748,7 @@ char *prepstdreply(text *txt, const char *listdir,
                        }
                free(line);
                line = get_processed_text_line(txt, 0, listaddr, listdelim,
-                               listdir, ctrlfd);
+                               listdir, listfd, ctrlfd);
        }
 
        fsync(outfd);
index a44a6030c42d2a6b5ab23234542cf4379c6b97f5..b6ab8eb35958c3a61f77a8f0c6f7e4f7ab23db30 100644 (file)
@@ -236,7 +236,7 @@ static void finish_thread_list(thread_list_state * s)
 
 
 int send_digest(const char *listdir, int firstindex, int lastindex,
-               int issue, const char *addr, const char *mlmmjsend, int ctrlfd)
+               int issue, const char *addr, const char *mlmmjsend, int listfd, int ctrlfd)
 {
        int i, fd, archivefd, hdrfd;
        size_t len;
@@ -310,7 +310,8 @@ int send_digest(const char *listdir, int firstindex, int lastindex,
        register_formatted(txt, "digestthreads", rewind_thread_list,
                        get_thread_list_line, tls);
 
-       line = get_processed_text_line(txt, 1, listaddr, listdelim, listdir, ctrlfd);
+       line = get_processed_text_line(txt, 1, listaddr, listdelim, listdir,
+           listfd, ctrlfd);
 
        if (line == NULL) {
                log_error(LOG_ARGS, "No content in digest listtext");
@@ -338,7 +339,7 @@ int send_digest(const char *listdir, int firstindex, int lastindex,
 
                /* Skip the empty line after the subject */
                line = get_processed_text_line(txt, 1, listaddr, listdelim,
-                               listdir, ctrlfd);
+                               listdir, listfd, ctrlfd);
                if (line == NULL || *line != '\0') {
                        log_error(LOG_ARGS, "Too many headers "
                                        "in digest listtext");
@@ -432,7 +433,7 @@ errdighdrs:
 
                for (;;) {
                        line = get_processed_text_line(txt, 0, listaddr, listdelim,
-                                       listdir, ctrlfd);
+                                       listdir, listfd, ctrlfd);
                        if (line == NULL) break;
                        if(dprintf(fd, "%s\n", line) < 0) {
                                free(line);
index 8a40440ad39de5397ab0f8c098cd549c2f08ba73..7e5a2912d1498f6502bf024f1b12572f60724ec4 100644 (file)
@@ -153,7 +153,7 @@ static void print_subs(int fd, subs_list_state *s)
 
 
 void send_list(const char *listdir, const char *emailaddr,
-              const char *mlmmjsend, int ctrlfd)
+              const char *mlmmjsend, int ctrlfd, int listfd)
 {
        text *txt;
        subs_list_state *normalsls, *digestsls, *nomailsls;
@@ -190,7 +190,8 @@ void send_list(const char *listdir, const char *emailaddr,
                        rewind_subs_list, get_sub, digestsls);
        register_formatted(txt, "nomailsubs",
                        rewind_subs_list, get_sub, nomailsls);
-       queuefilename = prepstdreply(txt, listdir, "$listowner$", emailaddr, NULL, ctrlfd);
+       queuefilename = prepstdreply(txt, listdir, "$listowner$", emailaddr,
+           NULL, listfd, ctrlfd);
        MY_ASSERT(queuefilename);
        close_text(txt);