{
DIR *queuedir;
struct dirent *dp;
- char *archivefilename, *subfilename, *subnewname;
+ char *archivefilename, *subnewname;
struct stat st;
time_t t;
bool fromrequeuedir;
unlinkat(fd, dp->d_name, AT_REMOVEDIR) == 0)
continue;
+ int requeuefd = openat(fd, dp->d_name, O_DIRECTORY);
+
xasprintf(&archivefilename, "archive/%s", dp->d_name);
+ int archivefd = openat(ml->fd, archivefilename, O_RDONLY);
+ free(archivefilename);
/* Explicitly initialize for each mail we examine */
fromrequeuedir = false;
- if(faccessat(ml->fd, archivefilename, F_OK, 0) < 0) {
- /* Might be it's just not moved to the archive
- * yet because it's still getting sent, so just
- * continue
- */
- free(archivefilename);
-
+ if (archivefd == -1) {
/* If the list is set not to archive we want to look
* in /requeue/ for a mailfile
*/
- xasprintf(&archivefilename, "requeue/%s/mailfile",
- dp->d_name);
- if(faccessat(ml->fd, archivefilename, F_OK, 0) < 0) {
- free(archivefilename);
+ archivefd = openat(requeuefd, "mailfile", O_RDONLY);
+ if (archivefd == -1) {
+ close(requeuefd);
continue;
}
fromrequeuedir = true;
}
- xasprintf(&subfilename, "%s/subscribers", dp->d_name);
- if(faccessat(fd, subfilename, F_OK, 0) < 0) {
- if (fromrequeuedir) {
- if (unlinkat(ml->fd, archivefilename, 0) == -1) {
- log(" - Cound not remove %s: %s\n",
- archivefilename, strerror(errno));
- ret = false;
- }
+ int subfd = openat(requeuefd, "subscribers", O_RDONLY);
+ if (subfd == -1) {
+ if (fromrequeuedir && unlinkat(requeuefd, "mailfile", 0) == -1) {
+ log(" - Cound not remove requeue/%s/mailfile: %s\n",
+ dp->d_name, strerror(errno));
+ ret = false;
}
- free(archivefilename);
- free(subfilename);
+ close(requeuefd);
continue;
}
-
- int subfd = openat(fd, subfilename, O_RDONLY);
- unlinkat(fd, subfilename, 0);
+ unlinkat(requeuefd, "subscribers", 0);
xasprintf(&subnewname, "%d", subfd);
+ xasprintf(&archivefilename, "%d", archivefd);
exec_and_wait(mlmmjsend, "-l", "3", "-L", ml->dir, "-m",
archivefilename, "-s", subnewname, "-a", "-D", NULL);
free(subnewname);
+ free(archivefilename);
if (fromrequeuedir)
- unlinkat(ml->fd, archivefilename, 0);
+ unlinkat(requeuefd, "mailfile", 0);
close(subfd);
+ close(requeuefd);
}
closedir(queuedir);
/* initialize file with mail to send */
- if ((mailfd = open(mailfilename, O_RDWR)) == -1 ||
- !lock(mailfd, true)) {
+ mailfd = strtoim(mailfilename, 0, INT_MAX, &errp);
+ if (errp == NULL) {
+ /* cannot delete a mail sent from file descriptor */
+ deletewhensent = false;
+ }
+
+ if (errp != NULL && ((mailfd = open(mailfilename, O_RDWR)) == -1 ||
+ !lock(mailfd, true))) {
if (ml.dir != NULL && mailfd == -1) {
if ((mailfd = openat(ml.fd, mailfilename, O_RDWR)) == -1 ||
!lock(mailfd, true)) {
atf_check $mlmmjmaintd -L list -F
cat > expect1.txt <<EOF
EHLO heloname\r
-MAIL FROM:<test+bounces-3-user1=test1@test>\r
+MAIL FROM:<test+bounces-user1=test1@test>\r
RCPT TO:<user1@test1>\r
DATA\r
From: plop\r
.\r
QUIT\r
EOF
- atf_check -o file:expect1.txt sed -e "/^Message-ID:/d; /^Date:/d; s/confsub-.*@mlmmjtest/confsub-@mlmmjtest/g" mail-1.txt
+ atf_check -o file:expect1.txt sed -e "/^Message-ID:/d; /^Date:/d; s/bounces-.*-/bounces-/g" mail-1.txt
atf_check -s exit:1 test -f mail-2.txt
atf_check -s exit:1 test -f list/requeue/3/mailfile
cat > list/archive/1 <<EOF
# now with archive
cat > expect2.txt <<EOF
EHLO heloname\r
-MAIL FROM:<test+bounces-1-user1=test1@test>\r
+MAIL FROM:<test+bounces-user1=test1@test>\r
RCPT TO:<user1@test1>\r
DATA\r
From: plop\r
body\r
\r
.\r
-MAIL FROM:<test+bounces-1-user2=test2@test>\r
+MAIL FROM:<test+bounces-user2=test2@test>\r
RCPT TO:<user2@test2>\r
DATA\r
From: plop\r
body\r
\r
.\r
-MAIL FROM:<test+bounces-1-user3=test3@test>\r
+MAIL FROM:<test+bounces-user3=test3@test>\r
RCPT TO:<user3@test3>\r
DATA\r
From: plop\r
QUIT\r
EOF
atf_check $mlmmjmaintd -L list -F
- atf_check -o file:expect2.txt sed -e "/^Message-ID:/d; /^Date:/d; s/confsub-.*@mlmmjtest/confsub-@mlmmjtest/g" mail-2.txt
+ atf_check -o file:expect2.txt sed -e "/^Message-ID:/d; /^Date:/d; s/bounces-.*-/bounces-/g" mail-2.txt
atf_check -s exit:1 test -f mail-4.txt
atf_check -s exit:0 test -f list/archive/1
}