struct stat st;
pid_t childpid, pid;
time_t t;
- int status;
+ int status, fromrequeuedir = 0;
if(chdir(dirname) < 0) {
log_error(LOG_ARGS, "Could not chdir(%s)", dirname);
* continue
*/
myfree(archivefilename);
- continue;
+
+ /* If the list is set not to archive we want to look
+ * in /requeue/ for a mailfile
+ */
+ archivefilename = concatstr(4, listdir, "/requeue/",
+ dp->d_name, "/mailfile");
+ if(stat(archivefilename, &st) < 0) {
+ myfree(archivefilename);
+ continue;
+ }
+ fromrequeuedir = 1;
}
subfilename = concatstr(3, dirname, dp->d_name, "/subscribers");
if(stat(subfilename, &st) < 0) {
+ if (fromrequeuedir)
+ unlink(archivefilename);
myfree(archivefilename);
myfree(subfilename);
continue;
gotsigterm = 1;
}
+char *get_index_from_filename(const char *filename)
+{
+ char *myfilename, *indexstr, *ret;
+ size_t len;
+
+ myfilename = mystrdup(filename);
+ if (!myfilename) {
+ return NULL;
+ }
+
+ len = strlen(myfilename);
+ if (len > 9 && (strcmp(myfilename + len - 9, "/mailfile") == 0)) {
+ myfilename[len - 9] = '\0';
+ }
+
+ indexstr = strrchr(myfilename, '/');
+ if (indexstr) {
+ indexstr++; /* skip the slash */
+ } else {
+ indexstr = myfilename;
+ }
+
+ ret = mystrdup(indexstr);
+ myfree(myfilename);
+
+ return ret;
+}
+
char *bounce_from_adr(const char *recipient, const char *listadr,
const char *listdelim, const char *mailfilename)
{
return NULL;
}
- indexstr = strrchr(mymailfilename, '/');
- if (indexstr) {
- indexstr++; /* skip the slash */
- } else {
- indexstr = mymailfilename;
- }
+ indexstr = get_index_from_filename(mymailfilename);
myrecipient = mystrdup(recipient);
if (!myrecipient) {
myfree(myrecipient);
myfree(mylistadr);
myfree(mylistdelim);
+ myfree(indexstr);
myfree(mymailfilename);
return bounceaddr;
const char *mlmmjbounce, const char *hdrs, size_t hdrslen,
const char *body, size_t bodylen)
{
- int res = 0, i;
+ int res = 0, i, status;
char *bounceaddr, *addr, *index;
for(i = 0; i < addrs->count; i++) {
/* we got SIGTERM, so save the addresses and bail */
log_error(LOG_ARGS, "TERM signal recieved, "
"shutting down.");
- index = mybasename(archivefilename);
- return requeuemail(listdir, index, addrs, i);
+ index = get_index_from_filename(archivefilename);
+ status = requeuemail(listdir, index, addrs, i);
+ myfree(index);
+ return status;
}
if(from) {
res = send_mail(sockfd, from, addr, replyto,
}
if(res && listaddr && archivefilename) {
/* we failed, so save the addresses and bail */
- index = mybasename(archivefilename);
- return requeuemail(listdir, index, addrs, i);
+ index = get_index_from_filename(archivefilename);
+ status = requeuemail(listdir, index, addrs, i);
+ myfree(index);
+ return status;
}
}
return 0;
char *mlmmjbounce = NULL, *bindir, *mailmap, *probefile, *a;
char *body = NULL, *hdrs = NULL, *memmailsizestr = NULL, *verp = NULL;
char relay[16], *listname, *listfqdn, *verpfrom, *maxverprecipsstr;
- char strindex[32], *reply, *strport;
+ char strindex[32], *reply, *strport, *requeuefilename;
ssize_t memmailsize = 0;
DIR *subddir;
struct dirent *dp;
archivefilename);
}
} else {
- unlink(mailfilename);
+ len = strlen(listdir) + 9 + 20 + 9;
+ requeuefilename = mymalloc(len);
+ snprintf(requeuefilename, len, "%s/requeue/%d/mailfile", listdir,
+ mindex);
+ if (rename(mailfilename, requeuefilename) < 0)
+ unlink(mailfilename);
+ myfree(requeuefilename);
}
myfree(archivefilename);
} else if(deletewhensent)