return 0;
}
-int requeuemail(const char *listdir, const char *index, struct strlist *addrs,
+int requeuemail(struct mlmmj_list *list, const char *index, struct strlist *addrs,
int addrcount)
{
int addrfd, i;
const char *addr;
char *dirname, *addrfilename;
-
- dirname = concatstr(3, listdir, "/requeue/", index);
+
+ xasprintf(&dirname, "%s/requeue/%s", list->dir, index);
if(mkdir(dirname, 0750) < 0 && errno != EEXIST) {
log_error(LOG_ARGS, "Could not mkdir(%s) for "
"requeueing. Mail cannot "
free(dirname);
return -1;
}
- addrfilename = concatstr(2, dirname, "/subscribers");
+ xasprintf(&addrfilename, "%s/subscribers");
free(dirname);
addrfd = open(addrfilename, O_WRONLY|O_CREAT|O_APPEND,
S_IRUSR|S_IWUSR);
log_error(LOG_ARGS, "TERM signal received, "
"shutting down.");
index = get_index_from_filename(archivefilename);
- status = requeuemail(list->dir, index, addrs, i);
+ status = requeuemail(list, index, addrs, i);
free(index);
return status;
}
if(res && list->addr && archivefilename) {
/* we failed, so save the addresses and bail */
index = get_index_from_filename(archivefilename);
- status = requeuemail(list->dir, index, addrs, i);
+ status = requeuemail(list, index, addrs, i);
free(index);
return status;
}
char *mailfilename = NULL, *subfilename = NULL, *omit = NULL;
char *replyto = NULL, *bounceaddr = NULL, *to_addr = NULL;
char *relayhost = NULL, *archivefilename = NULL, *tmpstr;
- char *listctrl = NULL, *subddirname = NULL;
+ char *listctrl = NULL;
char *mlmmjbounce = NULL, *bindir, *mailmap, *probefile, *a;
char *body = NULL, *hdrs = NULL, *verp = NULL;
char relay[16], *verpfrom;
struct mlmmj_list list;
unsigned short smtpport = 25;
struct sigaction sigact;
+ int subdirfd;
+ const char *dir;
mlmmj_list_init(&list);
CHECKFULLPATH(argv[0]);
case '5':
break;
case '2': /* Moderators */
- subfilename = concatstr(2, list.dir, "/control/moderators");
- if((subfd = open(subfilename, O_RDONLY)) < 0) {
- log_error(LOG_ARGS, "Could not open '%s':",
- subfilename);
+ if((subfd = openat(list.fd, "control/moderators", O_RDONLY)) < 0) {
+ log_error(LOG_ARGS, "Could not open "
+ "'%s/control/moderators':", list.dir);
free(hdrs);
free(body);
- free(subfilename);
/* No moderators is no error. Could be the sysadmin
* likes to do it manually.
*/
archivefilename = "digest";
/* fall through */
default: /* normal list mail */
- if (!digest) {
- subddirname = concatstr(2, list.dir, "/subscribers.d/");
- } else {
- subddirname = concatstr(2, list.dir, "/digesters.d/");
- }
- if((subddir = opendir(subddirname)) == NULL) {
+ dir = "digesters.d";
+ if (!digest)
+ dir = "subscribers.d";
+ subdirfd = openat(list.fd, dir, O_DIRECTORY);
+ if((subddir = fdopendir(subdirfd)) == NULL) {
log_error(LOG_ARGS, "Could not opendir(%s)",
- subddirname);
- free(subddirname);
+ dir);
+ close(subdirfd);
free(hdrs);
free(body);
exit(EXIT_FAILURE);
continue;
if(!strcmp(dp->d_name, ".."))
continue;
- subfilename = concatstr(2, subddirname, dp->d_name);
- if((subfd = open(subfilename, O_RDONLY)) < 0) {
- log_error(LOG_ARGS, "Could not open '%s'",
- subfilename);
- free(subfilename);
+ if((subfd = openat(subdirfd, dp->d_name, O_RDONLY)) < 0) {
+ log_error(LOG_ARGS, "Could not open '%s/%s'",
+ dir, dp->d_name);
continue;
}
do {
hdrslen, body,
bodylen, verp);
if(sendres)
- requeuemail(list.dir,
+ requeuemail(&list,
strindex,
&stl, 0);
} else {
stl.count = 0;
}
} while(res > 0);
- free(subfilename);
close(subfd);
}
hdrs, hdrslen, body, bodylen,
verp);
if(sendres)
- requeuemail(list.dir, strindex, &stl,
+ requeuemail(&list, strindex, &stl,
0);
} else {
sendres = send_mail_many_list(sockfd, NULL,
free(stl.strs);
free(verpfrom);
closedir(subddir);
- free(subddirname);
break;
}