]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Avoid possible race wrt. moderation
authormmj <none@none>
Wed, 27 Apr 2005 18:02:10 +0000 (04:02 +1000)
committermmj <none@none>
Wed, 27 Apr 2005 18:02:10 +0000 (04:02 +1000)
ChangeLog
Makefile.am
src/listcontrol.c

index e7d7b2376a72f40f386302273ad59a16aba57934..fd25bf18470ab76a225fd0e65bd1bdf2e9a50767 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+ o When sending moderated mails, rename them so that they wont be moderated
+   again while sending
 1.2.5
  o Make listname+list send the list of regular subscribers to the owner who
    requested it.
index 4af500e0d760d68e4a75c87e17a3faa761f2ee6a..30235671871f2d3700f096213b0b71225f06fade 100644 (file)
@@ -3,7 +3,7 @@
 AUTOMAKE_OPTIONS = foreign dist-bzip2
 EXTRA_DIST = include VERSION LICENSE UPGRADE src/log_error.c FAQ \
             TUNABLES README.access contrib man listtexts/de \
-            listtexts/da
+            listtexts/da README.exim4 README.sendmail
 CLEANFILES = *~ mlmmj-*.tar.*
 
 dist-hook:
index c7a42c48e62fb873c7434d193f086d4eb202ef47..3ef5bf123f36c022b95db39e111838f806b3eb08 100644 (file)
@@ -102,7 +102,7 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
 {
        char *atsign, *recipdelimsign, *bouncenr, *tmpstr;
        char *controlstr, *param, *conffilename, *moderatefilename;
-       char *c, *archivefilename;
+       char *c, *archivefilename, *sendfilename;
        const char *subswitch;
        size_t len;
        struct stat stbuf;
@@ -483,16 +483,25 @@ int listcontrol(struct email_container *fromemails, const char *listdir,
                /* TODO Add accept/reject parameter to moderate */
                unlink(mailname);
                moderatefilename = concatstr(3, listdir, "/moderation/", param);
+               sendfilename = concatstr(2, moderatefilename, ".sending");
                myfree(param);
+
                if(stat(moderatefilename, &stbuf) < 0) {
                        myfree(moderatefilename);
                        exit(EXIT_SUCCESS); /* just exit, no mail to moderate */
                }
+               /* Rename it to avoid mail being sent twice */
+               if(rename(moderatefilename, sendfilename) < 0) {
+                       log_error(LOG_ARGS, "Could not rename to .sending");
+                       exit(EXIT_FAILURE);
+               }
+
                log_oper(listdir, OPLOGFNAME, "%s moderated %s",
                                fromemails->emaillist[0], moderatefilename);
+               myfree(moderatefilename);
                execlp(mlmmjsend, mlmmjsend,
                                "-L", listdir,
-                               "-m", moderatefilename, (char *)NULL);
+                               "-m", sendfilename, (char *)NULL);
                log_error(LOG_ARGS, "execlp() of '%s' failed",
                                        mlmmjsend);
                exit(EXIT_FAILURE);