]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
mlmmj-maintd: convert delolder to file descriptor manipulation
authorBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 2 Nov 2021 17:07:38 +0000 (18:07 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 3 Nov 2021 13:10:28 +0000 (14:10 +0100)
include/mlmmj-maintd.h
src/mlmmj-maintd.c

index 562222b15038a543a3d8b535d697ff0ed2ef53b4..ab09ec60a323b7d12191ae069de8f84c57cd54a2 100644 (file)
@@ -27,7 +27,6 @@
 #include <sys/types.h>
 #include "mlmmj.h"
 
-int delolder(const char *dirname, time_t than);
 int clean_moderation(struct mlmmj_list *list);
 int clean_discarded(struct mlmmj_list *list);
 int resend_queue(struct mlmmj_list *list, const char *mlmmjsend);
index 4855261f71eca571347a67dd52fe65d12f82e91b..0d0b29d0369d72639c5707ff5b20b0874180d5de 100644 (file)
@@ -102,24 +102,23 @@ static int mydaemon(const char *rootdir)
        return 0;
 }
 
-int delolder(const char *dirname, time_t than)
+static int
+delolder(int dirfd, time_t than)
 {
        DIR *dir;
        struct dirent *dp;
        struct stat st;
        time_t t;
 
-       if(chdir(dirname) < 0) {
-               log_error(LOG_ARGS, "Could not chdir(%s)", dirname);
+       if (dirfd == -1)
                return -1;
-       }
-       if((dir = opendir(dirname)) == NULL) {
-               log_error(LOG_ARGS, "Could not opendir(%s)", dirname);
+       if ((dir = fdopendir(dirfd)) == NULL) {
+               log_error(LOG_ARGS, "Could not opendir");
                return -1;
        }
 
        while((dp = readdir(dir)) != NULL) {
-               if(stat(dp->d_name, &st) < 0) {
+               if(fstatat(dirfd, dp->d_name, &st, 0) < 0) {
                        log_error(LOG_ARGS, "Could not stat(%s)", dp->d_name);
                        continue;
                }
@@ -127,7 +126,7 @@ int delolder(const char *dirname, time_t than)
                        continue;
                t = time(NULL);
                if(t - st.st_mtime > than)
-                       unlink(dp->d_name);
+                       unlinkat(dirfd, dp->d_name, 0);
        }
        closedir(dir);
 
@@ -140,8 +139,7 @@ int clean_moderation(struct mlmmj_list *list)
 
        time_t modreqlife = 0;
        char *modreqlifestr;
-       char *moddirname;
-       int ret;
+       int fd;
 
        modreqlifestr = ctrlvalue(list, "modreqlife");
        if(modreqlifestr) {
@@ -151,42 +149,29 @@ int clean_moderation(struct mlmmj_list *list)
        if(modreqlife == 0)
                modreqlife = MODREQLIFE;
 
-       moddirname = concatstr(2, list->dir, "/moderation");
-       ret = delolder(moddirname, modreqlife);
-               
-       myfree(moddirname);
-
-       return ret;
+       fd = openat(list->fd, "moderation", O_DIRECTORY);
+       return delolder(fd, modreqlife);
 }
 
 int clean_discarded(struct mlmmj_list *list)
 {
-       char *discardeddirname = concatstr(2, list->dir, "/queue/discarded");
-       int ret = delolder(discardeddirname, DISCARDEDLIFE);
-
-       myfree(discardeddirname);
+       int fd = openat(list->fd, "queue/discarded", O_DIRECTORY);
 
-       return ret;
+       return delolder(fd, DISCARDEDLIFE);
 }
 
 int clean_subconf(struct mlmmj_list *list)
 {
-       char *subconfdirname = concatstr(2, list->dir, "/subconf");
-       int ret = delolder(subconfdirname, CONFIRMLIFE);
-
-       myfree(subconfdirname);
+       int fd = openat(list->fd, "subconf", O_DIRECTORY);
 
-       return ret;
+       return delolder(fd, CONFIRMLIFE);
 }
 
 int clean_unsubconf(struct mlmmj_list *list)
 {
-       char *unsubconfdirname = concatstr(2, list->dir, "/unsubconf");
-       int ret = delolder(unsubconfdirname, CONFIRMLIFE);
-
-       myfree(unsubconfdirname);
+       int fd = openat(list->fd, "unbsubconf", O_DIRECTORY);
 
-       return ret;
+       return delolder(fd, CONFIRMLIFE);
 }
 
 int discardmail(const char *old, const char *new, time_t age)