]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
fakesmtp: make it more robust
authorBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 10 Mar 2026 13:01:37 +0000 (14:01 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 10 Mar 2026 13:01:37 +0000 (14:01 +0100)
Instead of statically bind a port, dynamically bind one and report which
one was open.

Better handle killing the process when kyua receives sigterm or sigkill

tests/fakesmtpd.c
tests/mlmmj-maintd.in
tests/mlmmj-process.in
tests/mlmmj-receive.in
tests/mlmmj-send.in
tests/mlmmj-sub.in
tests/test_env.sh.in

index 8d9b9f7741d4c7ce2423fab3e2600b7b0fff089a..113feda27b29fbdda2e68ae223bd865d517569e6 100644 (file)
@@ -26,6 +26,7 @@
 #include <netinet/in.h>
 
 #include <err.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
@@ -47,6 +48,15 @@ static struct replies {
        { "DATA", "354 End data with <CR><LF>.<CR><LF>\n" },
 };
 
+static volatile sig_atomic_t got_signal = 0;
+
+static void
+signal_handler(int sig)
+{
+       (void)sig;
+       got_signal = 1;
+}
+
 int
 main(void)
 {
@@ -54,6 +64,7 @@ main(void)
        FILE *f;
        socklen_t clsize = sizeof(struct sockaddr_in);
        struct sockaddr_in me = { 0 }, cl;
+       socklen_t melen = sizeof(me);
        char *line = NULL;
        size_t linecap = 0;
        int mailnum = 0;
@@ -66,26 +77,41 @@ main(void)
                err(EXIT_FAILURE, "setsockopt");
        me.sin_family = AF_INET;
        me.sin_addr.s_addr = inet_addr("127.0.0.1");
-       /* specific interface */
-       me.sin_port = htons(25678);
+       me.sin_port = htons(0);
        if (bind(s, (struct sockaddr *) &me, sizeof(me)) == -1)
-               err(EXIT_FAILURE, "bin");
+               err(EXIT_FAILURE, "bind");
+       if (getsockname(s, (struct sockaddr *) &me, &melen) == -1)
+               err(EXIT_FAILURE, "getsockname");
        if (listen(s, 1) == -1)
                err(EXIT_FAILURE, "listen");
 
+       /* Write assigned port before daemonizing so the parent can read it */
+       f = fopen("fakesmtp.port", "w");
+       if (f == NULL)
+               err(EXIT_FAILURE, "fopen port");
+       fprintf(f, "%d\n", ntohs(me.sin_port));
+       fclose(f);
+
        if (daemon(1, 0) != 0)
                err(EXIT_FAILURE, "daemon");
+
+       signal(SIGTERM, signal_handler);
+       signal(SIGINT, signal_handler);
+
        f = fopen("fakesmtp.pid", "w+");
        if (f == NULL)
-               err(EXIT_FAILURE, "fopen");
+               err(EXIT_FAILURE, "fopen pid");
        fprintf(f, "%d\n", getpid());
        fclose(f);
        for (;;) {
                char *mail;
                FILE *fp, *fp2;
                c = accept(s, (struct sockaddr *) &cl, &clsize);
-               if (c == -1)
+               if (c == -1) {
+                       if (got_signal)
+                               break;
                        err(EXIT_FAILURE, "accept");
+               }
 
                mailnum++;
                asprintf(&mail, "mail-%d.txt", mailnum);
@@ -127,6 +153,11 @@ next:
                fclose(f);
        }
 
+       free(line);
+       close(s);
+       unlink("fakesmtp.pid");
+       unlink("fakesmtp.port");
+
        return (EXIT_SUCCESS);
 
 }
index 71b2c118867bfa4e2fb0750931dc40210f57c9cc..2abfad7e99080227c72ff1ead93b9daea04524ec 100644 (file)
@@ -702,11 +702,9 @@ run_digests
 
 resend_requeue_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        echo "test@test" > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        # Not a directory
 cat >> list/requeue/1 <<EOF
@@ -902,11 +900,9 @@ EOF
 
 resend_queue_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        echo "test@test" > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        touch list/queue/file
        touch list/queue/plop.hey
index 4b19363438e8ccb5ba5040e280b8b4cbb11ae161..525c77d9b07f173968ee1291ff5330b516ebaba2 100644 (file)
@@ -80,7 +80,7 @@ Bcc: list@test
 EOF
        echo "list@test" > list/control/listaddress
 # ensure we don't try to really send email to a real mailserver
-       echo "25678" > list/control/smtpport
+       echo 1 > list/control/smtpport
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        atf_check -s exit:0 $mlmmjprocess -L list -m mailfile
@@ -97,13 +97,11 @@ EOF
 # EXTENSION=owner must read the owner file and deliver to its address.
 owner_recipextra_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo "list@test" > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        echo "theowner@test" > list/control/owner
        cat > mailfile <<EOF
@@ -128,7 +126,7 @@ cleanup_queue_on_owner_write_failure_body()
        # first voodoo succeeds but the second fails on dup().
        init_ml list
        echo "list@test" > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       echo 1 > list/control/smtpport
        echo "theowner@test" > list/control/owner
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
index 639ce1c178d8c0acf1e9b2b1347c231de3c8b209..ec76c2aa6ef80341391fc0ae445cdbdddf650505 100644 (file)
@@ -100,13 +100,11 @@ EOF
 
 simple_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        cat > incoming-invalid << EOF
 From: bob@test
@@ -190,13 +188,11 @@ EOF
 
 subscribe_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -390,13 +386,11 @@ EOF
 
 subscribe_digest_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -591,13 +585,11 @@ EOF
 
 subscribe_nomail_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -794,13 +786,11 @@ EOF
 
 subscribe_both_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -995,13 +985,11 @@ EOF
 
 subscribe_nomail_confunsub_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -1198,13 +1186,11 @@ EOF
 
 subscribe_digest_confunsub_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > subscribe << EOF
@@ -1397,13 +1383,11 @@ EOF
 }
 
 ctrl_list_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > ctrllist << EOF
@@ -1478,13 +1462,11 @@ EOF
 }
 
 ctrl_help_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > ctrlhelp << EOF
@@ -1546,13 +1528,11 @@ EOF
 }
 
 ctrl_faq_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > ctrlhelp << EOF
@@ -1584,13 +1564,11 @@ EOF
 }
 
 ctrl_get_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        cat > ctrlget << EOF
@@ -1668,13 +1646,11 @@ EOF
 }
 
 subscription_moderation_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "me@modos" > list/control/owner
@@ -1863,13 +1839,11 @@ moderation_init_body() {
                moderator="test-moderators@mlmmjtest"
        fi
 
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "me@modos" > list/control/moderators
@@ -2043,13 +2017,11 @@ moderation_selfmoderate_autosubscribe_body() {
 }
 
 moderation_notifymod_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "me@modos" > list/control/moderators
@@ -2208,13 +2180,11 @@ EOF
 }
 
 moderation_notmetoo_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "me@modos" > list/control/moderators
@@ -2335,13 +2305,11 @@ EOF
 }
 
 moderation_reject_invalid_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "me@modos" > list/control/moderators
@@ -2423,13 +2391,11 @@ EOF
 }
 
 maxmailsize_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "1" > list/control/maxmailsize
@@ -2491,13 +2457,11 @@ EOF
 }
 
 maxmailsize0_body() {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        echo "0" > list/control/maxmailsize
@@ -2560,13 +2524,11 @@ EOF
 
 normal_email_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        printf "user@test\nuser2@test" > list/subscribers.d/u
@@ -2764,13 +2726,11 @@ EOF
 
 delheaders_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        printf "X-H1\nNope\n" > list/control/delheaders
 
@@ -2815,13 +2775,11 @@ EOF
 
 delheaders_extras_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        printf "X-k3\nx-h1\nx-L\n\n\n \n\t\nplop\nx-sym-colon:\nNope\n" > list/control/delheaders
 
@@ -2890,13 +2848,11 @@ EOF
 
 customheaders_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        printf "X-H1: test\nNope: really not\n" > list/control/customheaders
 
@@ -2986,13 +2942,11 @@ EOF
 
 customheaders_blanks_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        printf "X-H1: test\nNope: really not\n\n   \n" > list/control/customheaders
 
@@ -3082,13 +3036,11 @@ EOF
 
 customheaders_with_subst_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
        printf "X-H1: test\nNope: really not\nX-Poster-Address: \$posteraddr\$\n" > list/control/customheaders
 
@@ -3182,13 +3134,11 @@ EOF
 
 verp_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "postfix" > list/control/verp
        echo 2 > list/control/maxverprecips
        echo "heloname" > list/control/smtphelo
@@ -3261,13 +3211,11 @@ EOF
 
 normal_email_with_dot_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        printf "user@test\nuser2@test" > list/subscribers.d/u
@@ -3324,13 +3272,11 @@ EOF
 
 multi_line_headers_body()
 {
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml list
        rmdir list/text
        ln -s ${top_srcdir}/listtexts/en list/text
        echo test@mlmmjtest > list/control/listaddress
-       echo "25678" > list/control/smtpport
+       start_fakesmtp list
        echo "heloname" > list/control/smtphelo
 
        printf "user@test\nuser2@test" > list/subscribers.d/u
index 8e441073d9bce73390afe3da2d830fae737f79c7..3a5e74fad91a04275c774aa4ae81f9129772c798 100644 (file)
@@ -77,11 +77,9 @@ EOF
 resend_removes_subfile_on_success_body()
 {
        mlmmjsend=$(command -v mlmmj-send)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml ml
        echo "ml@test" > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        cat > mailfile <<EOF
 From: sender@test
@@ -105,11 +103,9 @@ EOF
 resend_fd_no_unlink_body()
 {
        mlmmjsend=$(command -v mlmmj-send)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        init_ml ml
        echo "ml@test" > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        cat > mailfile <<EOF
 From: sender@test
index b2dfe13af6771a8f0193b1d4329dad3b577cacd5..c336d90ed4f5f8a6cc7997b5682f4e7f71f994a9 100644 (file)
@@ -42,10 +42,8 @@ add_normal_welcome_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-sub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        rmdir ml/text
        ln -s ${top_srcdir}/listtexts/en ml/text
@@ -90,10 +88,8 @@ add_normal_welcome_confirm_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-sub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        rmdir ml/text
        ln -s ${top_srcdir}/listtexts/en ml/text
@@ -142,10 +138,8 @@ add_normal_welcome_confirm_and_send_owner_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-sub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        touch ml/control/notifysub
        rmdir ml/text
@@ -212,10 +206,8 @@ add_normal_welcome_moderate_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-sub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        rmdir ml/text
        ln -s ${top_srcdir}/listtexts/en ml/text
@@ -454,13 +446,11 @@ remove_normal_confirm_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-unsub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
        echo "john@doe.org" > ml/subscribers.d/j
        echo "bob@doe.org" >> ml/subscribers.d/j
        echo "rebecca@doe.org" >> ml/subscribers.d/j
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        rmdir ml/text
        ln -s ${top_srcdir}/listtexts/en ml/text
@@ -572,13 +562,11 @@ remove_normal_confirm_and_send_owner_body()
 {
        init_ml ml
        mlmmjsub=$(command -v mlmmj-unsub)
-       atf_check $top_builddir/tests/fakesmtpd
-       trap kill_fakesmtp EXIT TERM
        echo test@mlmmjtest > ml/control/listaddress
        echo "john@doe.org" > ml/subscribers.d/j
        echo "bob@doe.org" >> ml/subscribers.d/j
        echo "rebecca@doe.org" >> ml/subscribers.d/j
-       echo "25678" > ml/control/smtpport
+       start_fakesmtp ml
        echo "heloname" > ml/control/smtphelo
        touch ml/control/notifysub
        rmdir ml/text
@@ -714,7 +702,7 @@ remove_normal_owner_body()
        init_ml ml
        mlmmjsub=$(command -v mlmmj-unsub)
        printf "To: test@mlmmjtest1\r\nSubject: test\n\nplop" > mail
-       echo 25678 > ml/control/smtpport
+       echo 1 > ml/control/smtpport
        echo test@mlmmjtest > ml/control/listaddress
        echo owner@mlmmjtest > ml/control/owner
        echo "john@doe.org" > ml/subscribers.d/j
index e0e326dca6fcc3aac1b2d16d4bf20b4031ae6e7a..f1af7261d7c9b3efca221abdda9c21a0f24d3fd1 100644 (file)
@@ -38,7 +38,21 @@ init_ml()
 
 kill_fakesmtp()
 {
-       pid=$(cat fakesmtp.pid)
-       kill -15 $pid
+       if [ -f fakesmtp.pid ]; then
+               pid=$(cat fakesmtp.pid)
+               kill -15 $pid 2>/dev/null
+               wait $pid 2>/dev/null
+       fi
+       rm -f fakesmtp.pid fakesmtp.port
+}
+
+# Start fakesmtpd and configure the list to use its dynamic port.
+# Usage: start_fakesmtp <listdir>
+start_fakesmtp()
+{
+       local ml="$1"
+       atf_check $top_builddir/tests/fakesmtpd
+       trap kill_fakesmtp EXIT TERM INT
+       cat fakesmtp.port > "$ml/control/smtpport"
 }