]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
listcontrol: stop forking when unsubscribing
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 12 Apr 2023 08:47:51 +0000 (10:47 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 12 Apr 2023 08:47:51 +0000 (10:47 +0200)
include/subscriberfuncs.h
src/listcontrol.c
src/mlmmj-unsub.c
src/subscriberfuncs.c

index 0c4787154770f46bb869d3f8a6a94b69695ac66f..577a21bf00320125ffc2903cca478b68b162b1bb 100644 (file)
@@ -35,3 +35,4 @@ void generate_subscription(struct ml *ml, const char *subaddr, enum subtype type
 void generate_subconfirm(struct ml *ml, const char *subaddr, enum subtype typesub,
     enum subreason reasonsub, bool sub);
 void send_confirmation_mail(struct ml *ml, const char *subaddr, enum subtype typesub, enum subreason reasonsub, bool sub);
+bool do_unsubscribe(struct ml *ml, const char *addr, enum subtype typesub, enum subreason reasonsub, bool inform_not_subscribed, bool confirm_unsubscription, bool quiet, bool send_goodbye_mail);
index f852ddd703c4de5871ac7909aab40806ce931abe..a284f06d28f0010f150bc6865d6e063db9a9baa4 100644 (file)
@@ -372,9 +372,9 @@ int listcontrol(strlist *fromemails, struct ml *ml,
                }
                log_oper(ml->fd, OPLOGFNAME, "mlmmj-unsub: %s requests"
                        " unsubscribe", tll_front(*fromemails));
-               exec_or_die(mlmmjunsub, "-L", ml->dir, "-a",
-                   tll_front(*fromemails), "-r",
-                   (nosubconfirm ? "-c" : "-C"), NULL);
+               do_unsubscribe(ml, tll_front(*fromemails), SUB_ALL, SUB_REQUEST,
+                   false, !nosubconfirm, false, nosubconfirm);
+               exit(EXIT_SUCCESS);
                break;
 
        /* listname+unsubconf-digest-COOKIE@domain.tld */
index bfb353ca1ea2e590b6c149508313e1a13770bb9c..20f8784e20f4c8740957c7cdab0cbd94cfca7972 100644 (file)
@@ -70,13 +70,12 @@ static void print_help(const char *prg)
 int main(int argc, char **argv)
 {
        int opt;
-       bool normal = false, digest = false, nomail = false, subbed;
-       bool unsubconfirm = false, notifysub = false;
+       bool normal = false, digest = false, nomail = false;
+       bool unsubconfirm = false;
        bool changeuid = true, quiet = false;
        bool inform_not_subscribed = true;
        bool send_goodbye_mail = false;
        char *address = NULL;
-       const char *subdir;
        enum subtype typesub = SUB_ALL;
        enum subreason reasonsub = SUB_ADMIN;
        uid_t uid;
@@ -135,7 +134,7 @@ int main(int argc, char **argv)
                        exit(0);
                }
        }
-       if(ml.dir == 0 || address == 0) {
+       if(ml.dir == NULL || address == NULL) {
                errx(EXIT_FAILURE, "You have to specify -L and -a\n"
                    "%s -h for help", argv[0]);
        }
@@ -164,9 +163,6 @@ int main(int argc, char **argv)
                    "%s -h for help", argv[0]);
        }
 
-       /* Make the address lowercase */
-       address = lowercase(address);
-
        if(changeuid) {
                uid = getuid();
                if(!uid && fstat(ml.fd, &st) == 0 && uid != st.st_uid) {
@@ -179,40 +175,8 @@ int main(int argc, char **argv)
                        }
                }
        }
-
-       if (typesub == SUB_ALL) {
-               subbed = is_subbed(ml.fd, address, false) != SUB_NONE;
-       } else {
-               int subdirfd = open_subscriber_directory(ml.fd, typesub, &subdir);
-               if (subdirfd == -1) {
-                       log_error(LOG_ARGS, "Could not opendir(%s/%s)", ml.dir, subdir);
-                       exit(EXIT_FAILURE);
-               }
-               subbed = is_subbed_in(subdirfd, subdir, address);
-       }
-
-       if(!subbed) {
-               /* Address is not subscribed */
-               if(inform_not_subscribed)
-                       generate_subscription(&ml, address, typesub, false);
-               exit(EXIT_SUCCESS);
-       }
-
-       if(unsubconfirm)
-               generate_subconfirm(&ml, address, typesub, reasonsub, false);
-
-       unsubscribe(ml.fd, address, typesub);
-
-       if(send_goodbye_mail)
-               send_confirmation_mail(&ml, address, typesub, reasonsub, false);
-
-       notifysub = !quiet && statctrl(ml.ctrlfd, "notifysub");
-
-       /* Notify list owner about subscription */
-       if (notifysub)
-               notify_sub(&ml, address, typesub, reasonsub, false);
-
-       free(address);
-
-       return EXIT_SUCCESS;
+       if (do_unsubscribe(&ml, address, typesub, reasonsub, inform_not_subscribed,
+           unsubconfirm, quiet, send_goodbye_mail))
+               return(EXIT_SUCCESS);
+       return(EXIT_FAILURE);
 }
index 50dd7b72b90505e2d9c62fd7bb0bbd9f0e3f0979..5708f35a927d38a36f9c2c1549ab3235ed0af7af 100644 (file)
@@ -39,6 +39,7 @@
 #include "send_mail.h"
 #include "strgen.h"
 #include "send_help.h"
+#include "statctrl.h"
 
 char *subtype_strs[] = {
        "normal",
@@ -351,3 +352,47 @@ send_confirmation_mail(struct ml *ml, const char *subaddr, enum subtype typesub,
 
        send_help_noexit(ml, queuefilename, subaddr);
 }
+
+bool
+do_unsubscribe(struct ml *ml, const char *addr, enum subtype typesub,
+     enum subreason reasonsub, bool inform_not_subscribed,
+     bool confirm_unsubscription, bool quiet, bool send_goodbye_mail)
+{
+       char *address;
+       bool subscribed = false;
+
+       address = lowercase(addr);
+
+       if (typesub == SUB_ALL) {
+               subscribed = is_subbed(ml->fd, address, false) != SUB_NONE;
+       } else {
+               const char *subdir;
+               int fd = open_subscriber_directory(ml->fd, typesub, &subdir);
+               if (fd == -1) {
+                       log_error(LOG_ARGS, "Could not opendir(%s/%s)", ml->dir,
+                           subdir);
+                       return (false);
+               }
+               subscribed = is_subbed_in(fd, subdir, address);
+               close(fd);
+       }
+
+       if (!subscribed) {
+               if (inform_not_subscribed)
+                       generate_subscription(ml, address, typesub, false);
+               return (true);
+       }
+       if (confirm_unsubscription)
+               generate_subconfirm(ml, address, typesub, reasonsub, false);
+
+       unsubscribe(ml->fd, address, typesub);
+       if (send_goodbye_mail)
+               send_confirmation_mail(ml, address, typesub, reasonsub, false);
+
+       /* Notify list owner about subscription */
+       if (!quiet && statctrl(ml->ctrlfd, "notifysub"))
+               notify_sub(ml, address, typesub, reasonsub, false);
+
+       free(address);
+       return (true);
+}