From: Baptiste Daroussin Date: Tue, 2 Nov 2021 17:07:38 +0000 (+0100) Subject: mlmmj-maintd: convert delolder to file descriptor manipulation X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=77e2979c2eb1dfaa8ba30e4d57cfe19b23e72ce4;p=thirdparty%2Fmlmmj.git mlmmj-maintd: convert delolder to file descriptor manipulation --- diff --git a/include/mlmmj-maintd.h b/include/mlmmj-maintd.h index 562222b1..ab09ec60 100644 --- a/include/mlmmj-maintd.h +++ b/include/mlmmj-maintd.h @@ -27,7 +27,6 @@ #include #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); diff --git a/src/mlmmj-maintd.c b/src/mlmmj-maintd.c index 4855261f..0d0b29d0 100644 --- a/src/mlmmj-maintd.c +++ b/src/mlmmj-maintd.c @@ -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)