]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
getlistdelim/getlistaddr: rewrite to make use of ctrlvalue()
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 28 Dec 2022 12:06:54 +0000 (13:06 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 28 Dec 2022 12:16:08 +0000 (13:16 +0100)
18 files changed:
include/getlistaddr.h
include/getlistdelim.h
include/send_help.h
include/send_mail.h
src/getlistaddr.c
src/getlistdelim.c
src/listcontrol.c
src/mlmmj-bounce.c
src/mlmmj-process.c
src/mlmmj-send.c
src/mlmmj-sub.c
src/mlmmj-unsub.c
src/prepstdreply.c
src/send_digest.c
src/send_help.c
src/send_list.c
src/send_mail.c
tests/mlmmj.c

index 3d11ae792a330475b20e5f77989e3ecc3e6ae55d..d8752e89f76248ae0855cbd98085b619a8d7a6e6 100644 (file)
@@ -24,7 +24,6 @@
 #ifndef GETLISTADDR_H
 #define GETLISTADDR_H
 
-char *getlistaddr(const char *listdir);
-char *fgetlistaddr(int fd);
+char *getlistaddr(int fd);
 
 #endif /* GETLISTADDR_H */
index d0c527cfcc879ed3090dca65d1c23fc6efbc5f9a..3236523369258752e8617041c67954e6c96eeeac 100644 (file)
@@ -24,7 +24,6 @@
 #ifndef GETLISTDELIM_H
 #define GETLISTDELIM_H
 
-char *getlistdelim(const char *listdir);
-char *fgetlistdelim(int ctrlfd);
+char *getlistdelim(int ctrlfd);
 
 #endif /* GETLISTDELIM_H */
index 73612ba126a56fe99913ad3df8e44dc2a530dfdc..21c15870c243f6052ccccc3b68259ca04eb22aaf 100644 (file)
@@ -25,6 +25,6 @@
 #define SEND_HELP_H
 
 void send_help(const char *listdir, const char *queuefilename,
-               const char *emailaddr, const char *mlmmjsend);
+               const char *emailaddr, const char *mlmmjsend, int ctrlfd);
 
 #endif
index 41d4c4b62ccf60f70c299926b6ac3975e2f30e62..0e33ceead83c7fbe24c46180ae14a95081711155 100644 (file)
@@ -40,5 +40,5 @@ struct mail {
 
 int initsmtp(int *sockfd, const char *relayhost, unsigned short port, const char *heloname);
 int endsmtp(int *sockfd);
-int send_mail(int sockfd, struct mail *mail, int listfd, bool bounce);
-int do_bouncemail(int listfd, const char *from);
+int send_mail(int sockfd, struct mail *mail, int listfd, int ctrlfd, bool bounce);
+int do_bouncemail(int listfd, int ctrlfd, const char *from);
index 1d5bb9e3d5d37d20e80c1f56ddce25845cb72c68..29111f7006b07e91d3a9d5afdbb2b886742b78f3 100644 (file)
 #include <errno.h>
 
 #include "getlistaddr.h"
-#include "chomp.h"
 #include "log_error.h"
-#include "mygetline.h"
-#include "strgen.h"
+#include "ctrlvalue.h"
 
 char *
-fgetlistaddr(int fd)
+getlistaddr(int fd)
 {
-       char *tmpstr;
-       int listnamefd;
-
-       if ((listnamefd = openat(fd, "listaddress", O_RDONLY|O_CLOEXEC)) < 0) {
-               log_error(LOG_ARGS, "Could not open 'control/listaddress'");
-               exit(EXIT_FAILURE);
-       }
-       tmpstr = mygetline(listnamefd);
-       if (tmpstr == NULL) {
+       char *listaddr = ctrlvalue(fd, "listaddress");
+       if (listaddr == NULL) {
                log_error(LOG_ARGS, "FATAL. Could not get listaddress "
                    "in control/listaddress");
                exit(EXIT_FAILURE);
        }
-       if (strchr(tmpstr, '@') == NULL) {
+       if (strchr(listaddr, '@') == NULL) {
                log_error(LOG_ARGS, "FATAL. No @ sign in listaddress");
                exit(EXIT_FAILURE);
        }
 
-       chomp(tmpstr);
-       close(listnamefd);
-
-       return (tmpstr);
-}
-
-char *getlistaddr(const char *listdir)
-{
-       char *tmpstr;
-       int listnamefd;
-
-       tmpstr = concatstr(2, listdir, "/control/listaddress");;
-       if((listnamefd = open(tmpstr, O_RDONLY)) < 0) {
-               log_error(LOG_ARGS, "Could not open '%s'", tmpstr);
-               exit(EXIT_FAILURE);
-       }
-       free(tmpstr);
-
-       tmpstr = mygetline(listnamefd);
-
-       if(tmpstr == NULL){
-               log_error(LOG_ARGS, "FATAL. Could not get listaddress "
-                                   "in %s/control/listaddress", listdir);
-               exit(EXIT_FAILURE);
-       }
-
-       if(strchr(tmpstr, '@') == NULL) {
-               log_error(LOG_ARGS, "FATAL. No @ sign in listaddress");
-               exit(EXIT_FAILURE);
-       }
-
-       chomp(tmpstr);
-       close(listnamefd);
-
-       return tmpstr;
+       return (listaddr);
 }
index b6f05438c6281e994cf12f5480002819420755d8..60453aa6d8dd48f242282d19f8298173fe7dbeb9 100644 (file)
 #include "log_error.h"
 #include "mygetline.h"
 #include "strgen.h"
+#include "ctrlvalue.h"
 
-char *fgetlistdelim(int ctrlfd)
+char *getlistdelim(int ctrlfd)
 {
        char *delimstr;
-       int delimfd;
 
-       delimfd = openat(ctrlfd, "delimiter", O_RDONLY|O_CLOEXEC);
-       if (delimfd == -1)
+       delimstr = ctrlvalue(ctrlfd, "delimiter");
+       if (delimstr == NULL)
                return (xstrdup(DEFAULT_RECIPDELIM));
 
-       delimstr = mygetline(delimfd);
-       close(delimfd);
-
-       if(NULL == delimstr){
-               log_error(LOG_ARGS, "FATAL. Could not get list delimiter from "
-                   "control/delimiter");
-                       exit(EXIT_FAILURE);
-       }
-       chomp(delimstr);
-
-       if(0 == strlen(delimstr)){
-               log_error(LOG_ARGS, "FATAL. Zero-length delimiter found from "
-                   "control/delimiter");
-               exit(EXIT_FAILURE);
-       }
-
        return (delimstr);
 }
-
-char *getlistdelim(const char *listdir)
-{
-       char *delimfn, *delimstr;
-       int delimfd;
-
-       delimfn = concatstr(2, listdir, "/control/delimiter");
-       if(-1 != (delimfd = open(delimfn, O_RDONLY))){
-               delimstr = mygetline(delimfd);
-               close(delimfd);
-
-               if(NULL == delimstr){
-                       log_error(LOG_ARGS,
-                                 "FATAL. Could not get list delimiter from %s",
-                                 delimfn);
-                       free(delimfn);
-                       exit(EXIT_FAILURE);
-               }
-       
-               chomp(delimstr);
-       
-               if(0 == strlen(delimstr)){
-                       log_error(LOG_ARGS,
-                                 "FATAL. Zero-length delimiter found from %s",
-                                 delimfn);
-                       free(delimfn);
-                       exit(EXIT_FAILURE);
-               }
-       } else
-               delimstr = xstrdup(DEFAULT_RECIPDELIM);
-
-       free(delimfn);
-
-       return delimstr;
-}
index 7fea8c15db9939367b8ee60cce7694914fffdd30..2d5db85632907338d698a90d4d39ea2414f79d1c 100644 (file)
@@ -237,7 +237,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
-                                       fromemails->emaillist[0], mlmmjsend);
+                                       fromemails->emaillist[0], mlmmjsend, ctrlfd);
                        return -1;
                }
                log_oper(listdir, OPLOGFNAME, "mlmmj-sub: request for digest"
@@ -279,7 +279,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
-                                       fromemails->emaillist[0], mlmmjsend);
+                                       fromemails->emaillist[0], mlmmjsend, ctrlfd);
                        return -1;
                }
                log_oper(listdir, OPLOGFNAME, "mlmmj-sub: request for nomail"
@@ -321,7 +321,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                        MY_ASSERT(queuefilename);
                        close_text(txt);
                        send_help(listdir, queuefilename,
-                                       fromemails->emaillist[0], mlmmjsend);
+                                       fromemails->emaillist[0], mlmmjsend, ctrlfd);
                        return -1;
                }
                log_oper(listdir, OPLOGFNAME, "mlmmj-sub: request for both"
@@ -699,7 +699,7 @@ permit:
                MY_ASSERT(queuefilename);
                close_text(txt);
                send_help(listdir, queuefilename,
-                               fromemails->emaillist[0], mlmmjsend);
+                               fromemails->emaillist[0], mlmmjsend, ctrlfd);
                break;
 
        /* listname+faq@domain.tld */
@@ -721,7 +721,7 @@ permit:
                MY_ASSERT(queuefilename);
                close_text(txt);
                send_help(listdir, queuefilename,
-                               fromemails->emaillist[0], mlmmjsend);
+                               fromemails->emaillist[0], mlmmjsend, ctrlfd);
                break;
 
        /* listname+get-INDEX@domain.tld */
index f3e3aae81d21426d8f94157cd67954896b62196e..cdae8c1756517c430bb3ff3a9a1e211dbf0f063d 100644 (file)
@@ -58,13 +58,13 @@ void do_probe(const char *listdir, const char *mlmmjsend, const char *addr, int
        text *txt;
        file_lines_state *fls;
        char *myaddr, *from, *a, *queuefilename, *listaddr;
-       char *listfqdn, *listname, *probefile, *listdelim=getlistdelim(listdir);
+       char *listfqdn, *listname, *probefile, *listdelim = getlistdelim(ctrlfd);
        int fd;
        time_t t;
 
        myaddr = xstrdup(addr);
 
-       listaddr = getlistaddr(listdir);
+       listaddr = getlistaddr(ctrlfd);
        listname = genlistname(listaddr);
        listfqdn = genlistfqdn(listaddr);
 
index 12d3e2421fc0a192f44b5dc70ca72f50ff3592bf..dbdfde07e70a5ee6977d38c31eb01ca43d32ea49 100644 (file)
@@ -132,7 +132,7 @@ static void newmoderated(const char *listdir, const char *mailfilename,
                  enum modreason modreason, int ctrlfd)
 {
        char *from, *listfqdn, *listname, *moderators = NULL;
-       char *replyto, *listaddr = getlistaddr(listdir), *listdelim;
+       char *replyto, *listaddr = getlistaddr(ctrlfd), *listdelim;
        text *txt;
        memory_lines_state *mls;
        char *queuefilename = NULL;
@@ -157,7 +157,7 @@ static void newmoderated(const char *listdir, const char *mailfilename,
 
        free(moderators);
 
-       listdelim = getlistdelim(listdir);
+       listdelim = getlistdelim(ctrlfd);
        replyto = concatstr(6, listname, listdelim, "release-", mailbasename,
                            "@", listfqdn);
        reject = concatstr(6, listname, listdelim, "reject-", mailbasename,
@@ -614,7 +614,7 @@ int main(int argc, char **argv)
                recipextra = xstrdup(envstr);
        } else if((envstr = getenv("LOCAL_PART_SUFFIX")) != NULL) {
                /* exim */
-               listdelim = getlistdelim(listdir);
+               listdelim = getlistdelim(ctrlfd);
                if (strncmp(envstr, listdelim, strlen(listdelim)) == 0) {
                        recipextra = xstrdup(envstr + strlen(listdelim));
                } else {
@@ -629,7 +629,7 @@ int main(int argc, char **argv)
        addrtocc = !statctrl(ctrlfd, "tocc");
 
        if (findaddress) {
-               listdelim = getlistdelim(listdir);
+               listdelim = getlistdelim(ctrlfd);
        }
        if(addrtocc || findaddress) {
                listaddrs = ctrlvalues(listdir, "listaddress");
@@ -793,7 +793,7 @@ int main(int argc, char **argv)
                return EXIT_SUCCESS;
        }
 
-       listaddr = getlistaddr(listdir);
+       listaddr = getlistaddr(ctrlfd);
 
        /* checking incoming mail's size */
        maxmailsize = ctrlsizet(ctrlfd, "maxmailsize", 0);
@@ -819,7 +819,7 @@ int main(int argc, char **argv)
                                exit(EXIT_SUCCESS);
                        }
 
-                       listdelim = getlistdelim(listdir);
+                       listdelim = getlistdelim(ctrlfd);
                        listname = genlistname(listaddr);
                        listfqdn = genlistfqdn(listaddr);
                        fromaddr = concatstr(4, listname, listdelim,
@@ -885,7 +885,7 @@ int main(int argc, char **argv)
                        free(donemailname);
                        exit(EXIT_SUCCESS);
                }
-               listdelim = getlistdelim(listdir);
+               listdelim = getlistdelim(ctrlfd);
                listname = genlistname(listaddr);
                listfqdn = genlistfqdn(listaddr);
                fromaddr = concatstr(4, listname, listdelim, "bounces-help@",
@@ -930,7 +930,7 @@ int main(int argc, char **argv)
                                free(donemailname);
                                exit(EXIT_SUCCESS);
                        }
-                       listdelim = getlistdelim(listdir);
+                       listdelim = getlistdelim(ctrlfd);
                        listname = genlistname(listaddr);
                        listfqdn = genlistfqdn(listaddr);
                        fromaddr = concatstr(4, listname, listdelim,
@@ -1037,7 +1037,7 @@ int main(int argc, char **argv)
                                free(donemailname);
                                exit(EXIT_SUCCESS);
                            }
-                           listdelim = getlistdelim(listdir);
+                           listdelim = getlistdelim(ctrlfd);
                            listname = genlistname(listaddr);
                            listfqdn = genlistfqdn(listaddr);
                            fromaddr = concatstr(4, listname, listdelim,
index 6796adb60c17178d03b4b37d3ca72a52a3dd9112..12d49c4d0862273a608fa1759342909f660069a3 100644 (file)
@@ -389,7 +389,7 @@ int send_mail_many_list(int sockfd, struct mail *mail, struct strlist *addrs,
                            archivefilename, ctrlfd);
                        mail->from = bounceaddr;
                }
-               res = send_mail(sockfd, mail, listfd, bounceaddr != NULL);
+               res = send_mail(sockfd, mail, listfd, ctrlfd, bounceaddr != NULL);
                free(bounceaddr);
                if(res && listaddr && archivefilename) {
                        /* we failed, so save the addresses and bail */
@@ -575,7 +575,7 @@ int main(int argc, char **argv)
        stl.count = 0;
 
        if(listdir && listctrl != '5')
-               listaddr = fgetlistaddr(listfd);
+               listaddr = getlistaddr(ctrlfd);
        
        /* initialize file with mail to send */
 
@@ -625,7 +625,7 @@ int main(int argc, char **argv)
        }
 
        if(listdir)
-               listdelim = fgetlistdelim(listfd);
+               listdelim = getlistdelim(ctrlfd);
 
        switch(listctrl) {
        case '1': /* A single mail is to be sent, do nothing */
@@ -693,7 +693,7 @@ int main(int argc, char **argv)
        case '6':
                initsmtp(&sockfd, relayhost, smtpport, smtphelo);
                mail.from = bounceaddr;
-               if(send_mail(sockfd, &mail,listfd, false)) {
+               if(send_mail(sockfd, &mail,listfd, ctrlfd, false)) {
                        close(sockfd);
                        sockfd = -1;
                        /* error, so keep it in the queue */
@@ -782,7 +782,7 @@ int main(int argc, char **argv)
        case '5': /* bounceprobe - handle relayhost local users bouncing*/
                initsmtp(&sockfd, relayhost, smtpport, smtphelo);
                mail.from = bounceaddr;
-               if(send_mail(sockfd, &mail, listfd, false)) {
+               if(send_mail(sockfd, &mail, listfd, ctrlfd, false)) {
                        close(sockfd);
                        sockfd = -1;
                        /* error, so remove the probefile */
@@ -820,7 +820,7 @@ int main(int argc, char **argv)
                        exit(EXIT_FAILURE);
                }
 
-               listdelim = getlistdelim(listdir);
+               listdelim = getlistdelim(ctrlfd);
                listname = genlistname(listaddr);       
                listfqdn = genlistfqdn(listaddr);       
                xasprintf(&verpfrom, "%s%sbounces-%d@%s", listname, listdelim,
index c791efc84f0532ff8d19cbf98a7ee8e8ce72d83b..67974429e2949169855ab8c52bd3cbec0fc4351d 100644 (file)
@@ -682,7 +682,7 @@ int main(int argc, char **argv)
        address = lowercase(address);
 
        /* get the list address */
-       listaddr = fgetlistaddr(ctrlfd);
+       listaddr = getlistaddr(ctrlfd);
        if(strncasecmp(listaddr, address, strlen(listaddr)) == 0)
                errx(EXIT_FAILURE, "Cannot subscribe the list address to the list");
 
@@ -723,7 +723,7 @@ int main(int argc, char **argv)
                }
        }
 
-       listdelim = fgetlistdelim(ctrlfd);
+       listdelim = getlistdelim(ctrlfd);
 
        if(subbed == SUB_NONE && subconfirm)
                        generate_subconfirm(listdir, listaddr, listdelim,
index f68a015dccad067b1223f795d315167fdbac9555..472f5d43f78f4a3b05525cf18751beb501419aa7 100644 (file)
@@ -390,8 +390,8 @@ int main(int argc, char **argv)
 
        /* Make the address lowercase */
        address = lowercase(address);
-       listaddr = fgetlistaddr(ctrlfd);
-       listdelim = fgetlistdelim(ctrlfd);
+       listaddr = getlistaddr(ctrlfd);
+       listdelim = getlistdelim(ctrlfd);
 
        if(changeuid) {
                uid = getuid();
index 9931d2fec7fae7a360ea8cc76f3178e8fa4f004e..d082c664c0ac66404c0b48db64b60005638b2d52 100644 (file)
@@ -1592,8 +1592,8 @@ char *prepstdreply(text *txt, const char *listdir,
        char *str;
        char *headers[10] = { NULL }; /* relies on NULL to flag end */
 
-       listaddr = getlistaddr(listdir);
-       listdelim = getlistdelim(listdir);
+       listaddr = getlistaddr(ctrlfd);
+       listdelim = getlistdelim(ctrlfd);
        listfqdn = genlistfqdn(listaddr);
 
        do {
index 9362bf0320ede76f0c2e8d17b61cec315bdfc52b..a44a6030c42d2a6b5ab23234542cf4379c6b97f5 100644 (file)
@@ -277,10 +277,10 @@ int send_digest(const char *listdir, int firstindex, int lastindex,
 
        boundary = random_str();
 
-       listaddr = getlistaddr(listdir);
+       listaddr = getlistaddr(ctrlfd);
        listname = genlistname(listaddr);
        listfqdn = genlistfqdn(listaddr);
-       listdelim = getlistdelim(listdir);
+       listdelim = getlistdelim(ctrlfd);
        
        txt = open_text_file(listdir, "digest");
        if (txt == NULL) {
index 01d9a7eccf4b849c198e34e983e9e67d96a01f94..62697682d83b2ea28ec697eeb0a783c24272ca5a 100644 (file)
 #include "utils.h"
 
 void send_help(const char *listdir, const char *queuefilename,
-               const char *emailaddr, const char *mlmmjsend)
+               const char *emailaddr, const char *mlmmjsend, int ctrlfd)
 {
        char *listaddr, *listdelim, *listname, *listfqdn;
        char *fromaddr;
 
-       listaddr = getlistaddr(listdir);
-       listdelim = getlistdelim(listdir);
+       listaddr = getlistaddr(ctrlfd);
+       listdelim = getlistdelim(ctrlfd);
        listname = genlistname(listaddr);
        listfqdn = genlistfqdn(listaddr);
 
index aacd554cd9ee874a04a1e37c9fe6e2e8338ac12d..8a40440ad39de5397ab0f8c098cd549c2f08ba73 100644 (file)
@@ -161,8 +161,8 @@ void send_list(const char *listdir, const char *emailaddr,
        char *fromaddr, *subdir, *nomaildir, *digestdir;
        int fd;
 
-       listaddr = getlistaddr(listdir);
-       listdelim = getlistdelim(listdir);
+       listaddr = getlistaddr(ctrlfd);
+       listdelim = getlistdelim(ctrlfd);
        listname = genlistname(listaddr);
        listfqdn = genlistfqdn(listaddr);
 
index 18e282d12ba5852d4483b2617270d01ef85a7f88..2571286e80bd11f6213e90b882007ef6569084a9 100644 (file)
@@ -181,12 +181,12 @@ endsmtp(int *sockfd)
        return retval;
 }
 
-int do_bouncemail(int listfd, const char *from)
+int do_bouncemail(int listfd, int ctrlfd, const char *from)
 {
        /* expected format for the from: "something+anything-<number>-anything@anything" */
        char *tofree;
        char *myfrom = xstrdup(from);
-       char *listdelim = fgetlistdelim(listfd);
+       char *listdelim = getlistdelim(ctrlfd);
        char *addr, *num, *c;
 
        tofree = myfrom;
@@ -225,7 +225,7 @@ int do_bouncemail(int listfd, const char *from)
 }
 
 int
-send_mail(int sockfd, struct mail *mail, int listfd, bool bounce)
+send_mail(int sockfd, struct mail *mail, int listfd, int ctrlfd, bool bounce)
 {
        int retval = 0;
        char *reply, *reply2;
@@ -292,7 +292,7 @@ send_mail(int sockfd, struct mail *mail, int listfd, bool bounce)
                if(bounce && ((reply[0] == '4') || (reply[0] == '5'))
                                && (reply[1] == '5')) {
                        free(reply);
-                       return do_bouncemail(listfd, mail->from);
+                       return do_bouncemail(listfd, ctrlfd, mail->from);
                } else {
                        log_error(LOG_ARGS, "Error in RCPT TO. Reply = [%s]",
                                        reply);
index e4eba1582867f04fa5a0d4dfb28dd652672b2aac..f2973526960d6ac2da42dba69b878fdf5d5e3e30 100644 (file)
@@ -1201,35 +1201,37 @@ ATF_TC_BODY(do_bouncemail, tc)
 {
        init_ml(true);
        int lfd = open("list", O_DIRECTORY);
+       int ctrlfd = openat(lfd, "control", O_DIRECTORY);
        /* malformed */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop"), 0);
 
        /* malformed, missing number */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop@meh"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop@meh"), 0);
 
        /* malformed, empty numbr */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop-@meh"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop-@meh"), 0);
 
        /* no listdelim */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop-0@meh"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop-0@meh"), 0);
 
        /* listdelim before */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop+-0@meh"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop+-0@meh"), 0);
 
        /* listdelim before */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop-0+@meh"), 0);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop-0+@meh"), 0);
 
        /* 2 ticks */
-       ATF_REQUIRE_EQ(do_bouncemail(lfd, "plop+--bla@meh"), 1);
+       ATF_REQUIRE_EQ(do_bouncemail(lfd, ctrlfd, "plop+--bla@meh"), 1);
 
        close(lfd);
+       close(ctrlfd);
 }
 
 ATF_TC_BODY(send_mail_0, tc)
 {
        int smtppipe[2];
        struct mail mail = {};
-       ATF_REQUIRE_EQ(send_mail(-1, NULL, -1, false), EBADF);
+       ATF_REQUIRE_EQ(send_mail(-1, NULL, -1, -1, false), EBADF);
        ATF_REQUIRE(pipe(smtppipe) >= 0);
        pid_t p = atf_utils_fork();
        if (p == 0) {
@@ -1242,27 +1244,27 @@ ATF_TC_BODY(send_mail_0, tc)
                exit(0);
        }
        close(smtppipe[0]);
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.to = "plop@meh";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.from = "test@meh";
        mail.inmem = true;
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.hdrs = "plop";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.hdrs = NULL;
        mail.body = "body";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.inmem = false;
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.size = 1;
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.size = 0;
        mail.map = "bla";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        mail.inmem = true;
        mail.hdrs = "headers";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_FROM);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_FROM);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRSET\r\n", "");
 }
 
@@ -1287,7 +1289,7 @@ ATF_TC_BODY(send_mail_1, tc)
        mail.inmem = true;
        mail.hdrs = "headers";
        mail.body = "body";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_RCPTTO);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_RCPTTO);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\n", "");
 }
 
@@ -1315,7 +1317,7 @@ ATF_TC_BODY(send_mail_2, tc)
        mail.inmem = true;
        mail.hdrs = "headers";
        mail.body = "body";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_DATA);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_DATA);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\n", "");
 }
 
@@ -1343,7 +1345,7 @@ ATF_TC_BODY(send_mail_3, tc)
        mail.inmem = true;
        mail.hdrs = "headers";
        mail.body = "body";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_DATA);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_DATA);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\n", "");
 }
 
@@ -1371,7 +1373,7 @@ ATF_TC_BODY(send_mail_4, tc)
        mail.inmem = true;
        mail.hdrs = "headers";
        mail.body = "body";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_DATA);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_DATA);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\n", "");
 }
 
@@ -1408,7 +1410,7 @@ ATF_TC_BODY(send_mail_5, tc)
        mail.inmem = true;
        mail.hdrs = "headers\n";
        mail.body = "body\n";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), MLMMJ_DOT);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), MLMMJ_DOT);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\nheaders\nbody\n\r\n.\r\n", "");
 }
 
@@ -1448,7 +1450,7 @@ ATF_TC_BODY(send_mail_6, tc)
        mail.hdrs = "headers\n";
        mail.body = "body\n";
        mail.replyto= "yeah@meh";
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\nReply-To: yeah@meh\r\nheaders\nbody\n\r\n.\r\n", "");
 }
 
@@ -1488,7 +1490,7 @@ ATF_TC_BODY(send_mail_7, tc)
        mail.hdrs = "headers\n";
        mail.body = "body\n";
        mail.addtohdr = true;
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\nheaders\nTo: plop@meh\r\nbody\n\r\n.\r\n", "");
 }
 
@@ -1536,7 +1538,7 @@ ATF_TC_BODY(send_mail_8, tc)
        mail.size = st.st_size;
        mail.map = mmap(0, mail.size, PROT_READ, MAP_SHARED, fd, 0);
        mail.addtohdr = true;
-       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, false), 0);
+       ATF_REQUIRE_EQ(send_mail(smtppipe[1], &mail, -1, -1, false), 0);
        atf_utils_wait(p, 0, "MAIL FROM:<test@meh>\r\nRCPT TO:<plop@meh>\r\nDATA\r\nheaders\r\nTo: plop@meh\r\n\r\nbody\r\n\r\n.\r\n", "");
 }