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;
}
continue;
t = time(NULL);
if(t - st.st_mtime > than)
- unlink(dp->d_name);
+ unlinkat(dirfd, dp->d_name, 0);
}
closedir(dir);
time_t modreqlife = 0;
char *modreqlifestr;
- char *moddirname;
- int ret;
+ int fd;
modreqlifestr = ctrlvalue(list, "modreqlife");
if(modreqlifestr) {
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)