]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Add a macro to make sure mlmmj binaries are invoked with full path
authormmj <none@none>
Wed, 9 Jun 2004 11:24:56 +0000 (21:24 +1000)
committermmj <none@none>
Wed, 9 Jun 2004 11:24:56 +0000 (21:24 +1000)
src/mlmmj-bounce.c
src/mlmmj-maintd.c
src/mlmmj-process.c
src/mlmmj-recieve.c
src/mlmmj-send.c
src/mlmmj-sub.c
src/mlmmj-unsub.c

index 8b37144e6e9f013fd350ca34748ec5c4b7371b30..1b829c2c475b71e536e50b07b1f6ef677dd7c089 100644 (file)
@@ -181,6 +181,8 @@ int main(int argc, char **argv)
 
        log_set_name(argv[0]);
 
+       CHECKFULLPATH(argv[0]);
+
        bindir = mydirname(argv[0]);
        mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
        free(bindir);
index 15b8199a28af2f18db37286cdfad020b901c3738..0a07136327bc6d1f32d7cf7a5d22e809d3b6e6e0 100644 (file)
@@ -471,16 +471,123 @@ int probe_bouncers(const char *listdir, const char *mlmmjbounce)
        return 0;
 }
 
-int unsub_bouncers(const char *listdir)
+int unsub_bouncers(const char *listdir, const char *mlmmjunsub)
 {
-#if 0
        DIR *bouncedir;
+       char *dirname = concatstr(2, listdir, "/bounce/");
+       char *probefile, *address, *a, *firstbounce, *bouncedata;
+       char *logstr;
        struct dirent *dp;
-#endif
+       struct stat st;
+       pid_t pid, childpid;
+       int status, fd;
+       time_t bouncetime, t;
+       
+       if(chdir(dirname) < 0) {
+               log_error(LOG_ARGS, "Could not chdir(%s)", dirname);
+               free(dirname);
+               return 1;
+       }
+               
+       if((bouncedir = opendir(dirname)) == NULL) {
+               log_error(LOG_ARGS, "Could not opendir(%s)", dirname);
+               free(dirname);
+               return 1;
+       }
+
+       free(dirname);
+
+       while((dp = readdir(bouncedir)) != NULL) {
+               if((strcmp(dp->d_name, "..") == 0) ||
+                  (strcmp(dp->d_name, ".") == 0))
+                               continue;
+
+               if(stat(dp->d_name, &st) < 0) {
+                       log_error(LOG_ARGS, "Could not stat(%s)", dp->d_name);
+                       continue;
+               }
+               
+               if(strstr(dp->d_name, "-probe"))
+                       continue;
+               
+               probefile = concatstr(2, dp->d_name, "-probe");
+               
+               /* Skip files which already have a probe out */
+               if(stat(probefile, &st) == 0) {
+                       free(probefile);
+                       continue;
+               }
+               free(probefile);
+
+               /* Get the first line of the bounce file to check if it's
+                * been bouncing for long enough
+                */
+               fd = open(dp->d_name, O_RDONLY);
+               if(fd < 0) {
+                       log_error(LOG_ARGS, "Could not open %s", dp->d_name);
+                       continue;
+               }
+               firstbounce = mygetline(fd);
+               close(fd);
+               if(firstbounce == NULL)
+                       continue;
+
+               /* End the string at the comment */
+               a = strchr(firstbounce, '#');
+               if(a == NULL) {
+                       free(firstbounce);
+                       continue;
+               }
+               *a = '\0';
+               bouncedata = strdup(a+1); /* Save for the log */
+               chomp(bouncedata);
+               a = strchr(firstbounce, ':');
+               if(a == NULL) {
+                       free(firstbounce);
+                       continue;
+               }
+
+               a++; /* Increase to first digit */
+               bouncetime = (time_t)strtol(a, NULL, 10);
+               free(firstbounce);
+               t = time(NULL);
+               if(t - bouncetime < BOUNCELIFE + WAITPROBE)
+                       continue; /* ok, don't unsub this one */
+               
+               /* Ok, go ahead and unsubscribe the address */
+               address = strdup(dp->d_name);
+               a = strchr(address, '=');
+               if(a == NULL) { /* skip malformed */
+                       free(address);
+                       continue;
+               }
+               *a = '@';
+
+               childpid = fork();
+               
+               if(childpid < 0) {
+                       log_error(LOG_ARGS, "Could not fork");
+                       continue;
+               }
 
-       /* TODO: Unsubscribe all that still bounces after BOUNCELIFE time
-        * (control/bouncelife later on )
-        */
+               if(childpid > 0) {
+                       WRITEMAINTLOG6(5, "UNSUB: ", address, ". Bounced since",
+                                       bouncedata, ".\n");
+                       free(bouncedata);
+                       do /* Parent waits for the child */
+                               pid = waitpid(childpid, &status, 0);
+                       while(pid == -1 && errno == EINTR);
+                       unlink(dp->d_name);
+               } else {
+                       execlp(mlmmjunsub, mlmmjunsub,
+                                       "-L", listdir,
+                                       "-a", address, 0);
+                       log_error(LOG_ARGS, "Could not execlp %s",
+                                               mlmmjunsub);
+                       return 1;
+               }
+       }
+       closedir(bouncedir);
 
        return 0;
 }
@@ -488,11 +595,13 @@ int unsub_bouncers(const char *listdir)
 int main(int argc, char **argv)
 {
        int opt, daemonize = 1;
-       char *bindir, *listdir = NULL, *mlmmjsend, *mlmmjbounce;
+       char *bindir, *listdir = NULL, *mlmmjsend, *mlmmjbounce, *mlmmjunsub;
        char *logstr, *logname, *random = random_str();
        char uidstr[16];
        struct stat st;
 
+       CHECKFULLPATH(argv[0]);
+
        log_set_name(argv[0]);
 
        while ((opt = getopt(argc, argv, "hFVL:")) != -1) {
@@ -525,34 +634,32 @@ int main(int argc, char **argv)
                exit(EXIT_FAILURE);
        }
        
-       WRITEMAINTLOG4(3, "chdir(", listdir, ");");
+       WRITEMAINTLOG4(3, "chdir(", listdir, ");\n");
        if(chdir(listdir) < 0) {
                log_error(LOG_ARGS, "Could not chdir(%s), exiting. "
                                    "No maintenance performed.", listdir);
                exit(EXIT_FAILURE);
        }
-       WRITELOGOK;     
 
-       WRITEMAINTLOG4(3, "stat(", listdir, ", &st);");
+       WRITEMAINTLOG4(3, "stat(", listdir, ", &st);\n");
        if(stat(listdir, &st) < 0) {
                log_error(LOG_ARGS, "Could not stat listdir '%s'", listdir);
                exit(EXIT_FAILURE);
        }
-       WRITELOGOK;     
 
        chown(logname, st.st_uid, st.st_gid);
 
        snprintf(uidstr, sizeof(uidstr), "%d", (int)st.st_uid);
-       WRITEMAINTLOG4(3, "setuid(", uidstr, ");");
+       WRITEMAINTLOG4(3, "setuid(", uidstr, ");\n");
        if(setuid(st.st_uid) < 0) {
                log_error(LOG_ARGS, "Could not setuid listdir owner");
                exit(EXIT_FAILURE);
        }
-       WRITELOGOK;     
        
        bindir = mydirname(argv[0]);
        mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
        mlmmjbounce = concatstr(2, bindir, "/mlmmj-bounce");
+       mlmmjunsub = concatstr(2, bindir, "/mlmmj-unsub");
        free(bindir);
 
        if(daemonize && daemon(1,0) < 0) {
@@ -562,38 +669,31 @@ int main(int argc, char **argv)
        }
 
        for(;;) {
-               WRITEMAINTLOG4(3, "clean_moderation(", listdir, ");");
+               WRITEMAINTLOG4(3, "clean_moderation(", listdir, ");\n");
                clean_moderation(listdir);
-               WRITELOGOK;     
 
-               WRITEMAINTLOG4(3, "clean_discarded(", listdir, ");");
+               WRITEMAINTLOG4(3, "clean_discarded(", listdir, ");\n");
                clean_discarded(listdir);
-               WRITELOGOK;     
 
                WRITEMAINTLOG6(5, "resend_queue(", listdir, ", ", mlmmjsend,
-                                                       ");");
+                                                       ");\n");
                resend_queue(listdir, mlmmjsend);
-               WRITELOGOK;     
 
                WRITEMAINTLOG6(5, "resend_requeue(", listdir, ", ", mlmmjsend,
-                                                       ");");
+                                                       ");\n");
                resend_requeue(listdir, mlmmjsend);
-               WRITELOGOK;     
 
-               WRITEMAINTLOG4(3, "clean_nolongerbouncing(", listdir, ");");
+               WRITEMAINTLOG4(3, "clean_nolongerbouncing(", listdir, ");\n");
                clean_nolongerbouncing(listdir);
-               WRITELOGOK;     
 
+               WRITEMAINTLOG6(5, "unsub_bouncers(", listdir, ", ",
+                                                       mlmmjunsub, ");\n");
+               unsub_bouncers(listdir, mlmmjunsub);
+               
                WRITEMAINTLOG6(5, "probe_bouncers(", listdir, ", ",
-                                                       mlmmjbounce, ");");
+                                                       mlmmjbounce, ");\n");
                probe_bouncers(listdir, mlmmjbounce);
-               WRITELOGOK;     
 
-#if 0
-               unsub_bouncers(listdir);
-               writen(maintdlogfd, A_OK_LOG, sizeof(A_OK_LOG));
-#endif
-               
                close(maintdlogfd);
                logstr = concatstr(3, listdir, "/", MAINTD_LOGFILE);
                if(rename(logname, logstr) < 0)
index 4be1edf9fd351373a106f22bbd0e3754501bbc61..9bf642f038a6422506c93fd349293db091cb92a8 100644 (file)
@@ -180,6 +180,8 @@ int main(int argc, char **argv)
                { NULL, 0, NULL }
        };
 
+       CHECKFULLPATH(argv[0]);
+
        log_set_name(argv[0]);
 
        bindir = mydirname(argv[0]);
index 3c8bad281b97e1ed5ccde27f7eaa0f3b7438e8ba..5fe40f2f5ba7a00ad6c71f3fbcc12c21968f337f 100644 (file)
@@ -42,6 +42,8 @@ int main(int argc, char **argv)
        char *mlmmjprocess, *bindir;
        int fd, opt, noprocess = 0, nofork = 0;
        pid_t childpid;
+
+       CHECKFULLPATH(argv[0]);
        
        log_set_name(argv[0]);
 
index 4a0b063995039fc562ba2805a6f50193bfdcde4b..9a558c6d905a6fb4471ece5c31c080b81e479923 100644 (file)
@@ -406,6 +406,8 @@ int main(int argc, char **argv)
        DIR *subddir;
        struct dirent *dp;
        struct stat st;
+
+       CHECKFULLPATH(argv[0]);
        
        log_set_name(argv[0]);
 
index 6c4bbc63468402431f4db128fd0229af1123aba4..63129005df6503468fce911cbcbb34ca82be1ab6 100644 (file)
@@ -229,11 +229,13 @@ int main(int argc, char **argv)
        size_t len;
        off_t suboff;
 
+       CHECKFULLPATH(argv[0]);
+
+       log_set_name(argv[0]);
+
        bindir = mydirname(argv[0]);
        mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
        free(bindir);
-       
-       log_set_name(argv[0]);
 
        while ((opt = getopt(argc, argv, "hcCVL:a:")) != -1) {
                switch(opt) {
index e4b75d0e6c96dee652579621ea03cf71470cbf18..e85f2707d7252b83372cbd4a3093ee53beb91f20 100644 (file)
@@ -271,13 +271,15 @@ int main(int argc, char **argv)
        off_t suboff;
        DIR *subddir;
        struct dirent *dp;
+
+       CHECKFULLPATH(argv[0]);
        
+       log_set_name(argv[0]);
+
        bindir = mydirname(argv[0]);
        mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
        free(bindir);
 
-       log_set_name(argv[0]);
-
        while ((opt = getopt(argc, argv, "hcCVL:a:")) != -1) {
                switch(opt) {
                case 'L':