]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
cleanup: eliminate some concatstr for file descriptor manipulation
authorBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 2 Nov 2021 14:13:06 +0000 (15:13 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 3 Nov 2021 13:10:28 +0000 (14:10 +0100)
src/send_list.c

index 13b21de964b6d2cd106471a3ea25003183e83a47..0365e316fcd5c716662401b460df4df18342e80e 100644 (file)
@@ -44,7 +44,8 @@
 struct subs_list_state;
 typedef struct subs_list_state subs_list_state;
 struct subs_list_state {
-       char *dirname;
+       struct mlmmj_list *list;
+       const char *dirname;
        DIR *dirp;
        int fd;
        char *line;
@@ -52,10 +53,11 @@ struct subs_list_state {
 };
 
 
-static subs_list_state *init_subs_list(const char *dirname)
+static subs_list_state *init_subs_list(struct mlmmj_list *list, const char *dirname)
 {
        subs_list_state *s = mymalloc(sizeof(subs_list_state));
-       s->dirname = mystrdup(dirname);
+       s->dirname = dirname;
+       s->list = list;
        s->dirp = NULL;
        s->fd = -1;
        s->line = NULL;
@@ -66,12 +68,22 @@ static subs_list_state *init_subs_list(const char *dirname)
 
 static void rewind_subs_list(void *state)
 {
+       int dirfd;
+
        subs_list_state *s = (subs_list_state *)state;
        if (s == NULL) return;
-       if (s->dirp != NULL) closedir(s->dirp);
-       s->dirp = opendir(s->dirname);
-       if(s->dirp == NULL) {
-               log_error(LOG_ARGS, "Could not opendir(%s);\n", s->dirname);
+       if (s->dirp != NULL) {
+               closedir(s->dirp);
+               s->dirp = NULL;
+       }
+       dirfd = openat(s->list->fd, s->dirname, O_DIRECTORY);
+       if (dirfd == -1) {
+               log_error(LOG_ARGS, "Could not opendir();\n");
+       } else {
+               s->dirp = fdopendir(dirfd);
+               if(s->dirp == NULL) {
+                       log_error(LOG_ARGS, "Could not opendir();\n");
+               }
        }
        s->used = 1;
 }
@@ -131,7 +143,6 @@ static void finish_subs_list(subs_list_state *s)
        if (s->line != NULL) myfree(s->line);
        if (s->fd != -1) close(s->fd);
        if (s->dirp != NULL) closedir(s->dirp);
-       myfree(s->dirname);
        myfree(s);
 }
 
@@ -154,21 +165,15 @@ void send_list(struct mlmmj_list *list, const char *emailaddr,
        text *txt;
        subs_list_state *normalsls, *digestsls, *nomailsls;
        char *queuefilename;
-       char *fromaddr, *subdir, *nomaildir, *digestdir;
+       char *fromaddr;
        int fd;
 
        fromaddr = concatstr(4, list->name, list->delim,
            "bounces-help@", list->fqdn);
 
-       subdir = concatstr(2, list->dir, "/subscribers.d/");
-       digestdir = concatstr(2, list->dir, "/digesters.d/");
-       nomaildir = concatstr(2, list->dir, "/nomailsubs.d/");
-       normalsls = init_subs_list(subdir);
-       digestsls = init_subs_list(digestdir);
-       nomailsls = init_subs_list(nomaildir);
-       myfree(subdir);
-       myfree(digestdir);
-       myfree(nomaildir);
+       normalsls = init_subs_list(list, "subscribers.d");
+       digestsls = init_subs_list(list, "digesters.d");
+       nomailsls = init_subs_list(list, "nomailsubs.d");
 
        txt = open_text(list, "list", NULL, NULL, subtype_strs[SUB_ALL],
                        "listsubs");