From: Baptiste Daroussin Date: Thu, 28 Oct 2021 12:46:15 +0000 (+0200) Subject: subscription: use filedescriptors to check for subscription membership X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a438b41a48b33f827862c6d60cb8c9fdcf9c7ea;p=thirdparty%2Fmlmmj.git subscription: use filedescriptors to check for subscription membership --- diff --git a/include/subscriberfuncs.h b/include/subscriberfuncs.h index 647ea776..68274bb2 100644 --- a/include/subscriberfuncs.h +++ b/include/subscriberfuncs.h @@ -24,9 +24,12 @@ #ifndef SUBSCRIBERFUNC_H #define SUBSCRIBERFUNC_H +#include +#include "mlmmj.h" + off_t find_subscriber(int fd, const char *address); -int is_subbed_in(const char *subddirname, const char *address); -enum subtype is_subbed(const char *listdir, const char *address, int both); +bool is_subbed_in(int fd, const char *address); +enum subtype is_subbed(struct mlmmj_list *list, const char *address, int both); int open_subscriber_directory(struct mlmmj_list *list, enum subtype typesub, const char **subdir); #endif /* SUBSCRIBERFUNC_H */ diff --git a/src/listcontrol.c b/src/listcontrol.c index ff34ae02..0db3618f 100644 --- a/src/listcontrol.c +++ b/src/listcontrol.c @@ -841,7 +841,7 @@ permit: } subonlyget = statctrl(list, "subonlyget"); if(subonlyget) { - if(is_subbed(list->dir, fromemails->emaillist[0], 0) == + if(is_subbed(list, fromemails->emaillist[0], 0) == SUB_NONE) { errno = 0; log_error(LOG_ARGS, "A get request was sent" diff --git a/src/memory.c b/src/memory.c index 461dfea7..b8bc4600 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,5 +1,5 @@ /* Copyright (C) 2004 Morten K. Poulsen -/* Copyright (C) 2021 Baptiste Daroussin + * Copyright (C) 2021 Baptiste Daroussin * * $Id$ * diff --git a/src/mlmmj-bounce.c b/src/mlmmj-bounce.c index 27e13fb9..7c1e6f28 100644 --- a/src/mlmmj-bounce.c +++ b/src/mlmmj-bounce.c @@ -336,7 +336,7 @@ int main(int argc, char **argv) *a = '@'; /* make sure it's a subscribed address */ - if(is_subbed(list.dir, address, 0) == SUB_NONE) { + if(is_subbed(&list, address, 0) == SUB_NONE) { log_error(LOG_ARGS, "%s is bouncing but not subscribed?", address); if(mailname) diff --git a/src/mlmmj-process.c b/src/mlmmj-process.c index 88797a17..61e54e53 100644 --- a/src/mlmmj-process.c +++ b/src/mlmmj-process.c @@ -961,7 +961,7 @@ int main(int argc, char **argv) exit(EXIT_SUCCESS); } if(subonlypost) { - foundaddr = (is_subbed(list.dir, posteraddr, 0) != + foundaddr = (is_subbed(&list, posteraddr, 0) != SUB_NONE); } else if (modonlypost) { foundaddr = is_moderator(list.dir, posteraddr, NULL); diff --git a/src/mlmmj-sub.c b/src/mlmmj-sub.c index 828b8a25..832a4438 100644 --- a/src/mlmmj-sub.c +++ b/src/mlmmj-sub.c @@ -724,7 +724,7 @@ int main(int argc, char **argv) } } - subbed = is_subbed(list.dir, address, 1); + subbed = is_subbed(&list, address, 1); if(subbed == typesub) { if(!nogensubscribed) diff --git a/src/mlmmj-unsub.c b/src/mlmmj-unsub.c index cbc6e1b0..b6f013c2 100644 --- a/src/mlmmj-unsub.c +++ b/src/mlmmj-unsub.c @@ -431,7 +431,7 @@ int main(int argc, char **argv) int status; char *address = NULL; struct mlmmj_list list; - char *mlmmjsend, *bindir, *subdir, *subddirname; + char *mlmmjsend, *bindir; char *lowcaseaddr; enum subtype typesub = SUB_ALL; enum subreason reasonsub = SUB_ADMIN; @@ -557,23 +557,10 @@ int main(int argc, char **argv) } if (typesub == SUB_ALL) { - subbed = is_subbed(list.dir, address, 0) != SUB_NONE; + subbed = is_subbed(&list, address, 0) != SUB_NONE; } else { - switch(typesub) { - default: - case SUB_NORMAL: - subdir = "/subscribers.d/"; - break; - case SUB_DIGEST: - subdir = "/digesters.d/"; - break; - case SUB_NOMAIL: - subdir = "/nomailsubs.d/"; - break; - } - myasprintf(&subddirname, "%s%s", list.dir, subdir); - subbed = is_subbed_in(subddirname, address); - myfree(subddirname); + subbed = is_subbed_in( + open_subscriber_directory(&list, typesub, NULL), address); } if(!subbed) { diff --git a/src/subscriberfuncs.c b/src/subscriberfuncs.c index 4b963239..ee29b902 100644 --- a/src/subscriberfuncs.c +++ b/src/subscriberfuncs.c @@ -111,16 +111,19 @@ off_t find_subscriber(int fd, const char *address) return (off_t)-1; } -int is_subbed_in(const char *subddirname, const char *address) +bool +is_subbed_in(int fd, const char *address) { int retval = 0, subread; - char *subreadname; off_t suboff; DIR *subddir; struct dirent *dp; - if((subddir = opendir(subddirname)) == NULL) { - log_error(LOG_ARGS, "Could not opendir(%s)", subddirname); + if (fd == -1) + return (false); + + if((subddir = fdopendir(fd)) == NULL) { + log_error(LOG_ARGS, "Could not opendir()"); exit(EXIT_FAILURE); } @@ -130,17 +133,14 @@ int is_subbed_in(const char *subddirname, const char *address) if(!strcmp(dp->d_name, "..")) continue; - subreadname = concatstr(2, subddirname, dp->d_name); - subread = open(subreadname, O_RDONLY); + subread = openat(fd, dp->d_name, O_RDONLY); if(subread < 0) { - log_error(LOG_ARGS, "Could not open %s", subreadname); - myfree(subreadname); + log_error(LOG_ARGS, "Could not open %s", dp->d_name); continue; } suboff = find_subscriber(subread, address); close(subread); - myfree(subreadname); if(suboff == -1) { continue; @@ -154,32 +154,26 @@ int is_subbed_in(const char *subddirname, const char *address) return retval; } -enum subtype is_subbed(const char *listdir, const char *address, int both) +enum subtype is_subbed(struct mlmmj_list *list, const char *address, int both) { - int retval; - char *subddirname; + int fd; enum subtype typesub = SUB_NONE; - - subddirname = concatstr(2, listdir, "/subscribers.d/"); - retval = is_subbed_in(subddirname, address); - myfree(subddirname); - if (retval) { + + fd = openat(list->fd, "subscribers.d", O_DIRECTORY|O_CLOEXEC); + if(is_subbed_in(fd, address)) { if (!both) return SUB_NORMAL; typesub = SUB_NORMAL; } - subddirname = concatstr(2, listdir, "/digesters.d/"); - retval = is_subbed_in(subddirname, address); - myfree(subddirname); - if (retval) { + fd = openat(list->fd, "digesters.d", O_DIRECTORY|O_CLOEXEC); + if (is_subbed_in(fd, address)) { if (typesub == SUB_NORMAL) return SUB_BOTH; return SUB_DIGEST; } - subddirname = concatstr(2, listdir, "/nomailsubs.d/"); - retval = is_subbed_in(subddirname, address); - myfree(subddirname); - if (retval) return SUB_NOMAIL; + fd = openat(list->fd, "nomailsubs.d", O_DIRECTORY|O_CLOEXEC); + if (is_subbed_in(fd, address)) + return SUB_NOMAIL; return typesub; }