From: Baptiste Daroussin Date: Tue, 2 Nov 2021 14:13:06 +0000 (+0100) Subject: cleanup: eliminate some concatstr for file descriptor manipulation X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=364e4dc552bfc3db84cbe8ff1d35813c31ba5c75;p=thirdparty%2Fmlmmj.git cleanup: eliminate some concatstr for file descriptor manipulation --- diff --git a/src/send_list.c b/src/send_list.c index 13b21de9..0365e316 100644 --- a/src/send_list.c +++ b/src/send_list.c @@ -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");