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;
};
-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;
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;
}
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);
}
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");