changeset 275:9a847bfdc764

Don't fail in mlmmj-process b/c of EEXIST on the queuefilenames
author mmj
date Fri, 25 Jun 2004 17:04:03 +1000
parents 3cd2ac31e671
children f670b8a4e457
files src/mlmmj-process.c
diffstat 1 files changed, 28 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/mlmmj-process.c	Fri Jun 25 17:02:32 2004 +1000
+++ b/src/mlmmj-process.c	Fri Jun 25 17:04:03 2004 +1000
@@ -70,7 +70,7 @@
 {
 	char *from, *fqdn, *listname;
 	char *buf, *moderatorfilename, *listaddr = getlistaddr(listdir);
-	char *queuefilename, *moderatorsfilename, *randomstr = random_str();
+	char *queuefilename = NULL, *moderatorsfilename, *randomstr = NULL;
 	char *mailbasename = mybasename(mailfilename), *s1;
 	int moderatorfd, queuefd, moderatorsfd, mailfd;
 	size_t count = 0;
@@ -106,16 +106,22 @@
 		exit(EXIT_FAILURE);
 	}
 
+        do {
+                randomstr = random_str();
+                myfree(queuefilename);
 	queuefilename = concatstr(3, listdir, "/queue/", randomstr);
+                myfree(randomstr);
 	
-	if((queuefd = open(queuefilename, O_WRONLY|O_CREAT|O_EXCL,
-					S_IRUSR|S_IWUSR)) < 0) {
+                queuefd = open(queuefilename, O_RDWR|O_CREAT|O_EXCL,
+					      S_IRUSR|S_IWUSR);
+
+        } while ((queuefd < 0) && (errno == EEXIST));
+
+	if(queuefd < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", queuefilename);
 		myfree(queuefilename);
-		myfree(randomstr);
 		exit(EXIT_FAILURE);
 	}
-	myfree(randomstr);
 
 	from = concatstr(3, listname, "+owner@", fqdn);
 	s1 = concatstr(15, "From: ", from, "\nTo: ", listname, "-moderators@",
@@ -326,7 +332,7 @@
 	int subonlypost = 0, addrtocc = 1, intocc = 0;
 	char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL;
 	char *footerfilename = NULL, *donemailname = NULL;
-	char *randomstr = random_str(), *mqueuename;
+	char *randomstr = NULL, *mqueuename;
 	char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
 	char *bindir, *subjectprefix, *discardname, *listaddr;
 	char *listfqdn, *listname, *fromaddr, *fromstr, *subject;
@@ -383,21 +389,20 @@
 		exit(EXIT_FAILURE);
 	}
 
-	donemailname = concatstr(3, listdir, "/queue/", randomstr);
-	donemailfd = open(donemailname, O_RDWR|O_CREAT|O_EXCL,
-					S_IRUSR|S_IWUSR);
-	while(donemailfd < 0 && errno == EEXIST) {
+        do {
 		myfree(donemailname);
+                myfree(randomstr);
 		randomstr = random_str();
 		donemailname = concatstr(3, listdir, "/queue/", randomstr);
-		fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL,
+
+                donemailfd = open(donemailname, O_RDWR|O_CREAT|O_EXCL,
 					S_IRUSR|S_IWUSR);
-	}
+
+        } while ((donemailfd < 0) && (errno == EEXIST));
 	
 	if(donemailfd < 0) {
+		log_error(LOG_ARGS, "could not create %s", donemailname);
 		myfree(donemailname);
-		log_error(LOG_ARGS, "could not create mail file in queue"
-				    "directory");
 		exit(EXIT_FAILURE);
 	}
 #if 0
@@ -463,6 +468,7 @@
 			rename(donemailname, discardname);
 			myfree(donemailname);
 			myfree(discardname);
+			myfree(randomstr);
 			/* TODO: free emailstructs */
 			exit(EXIT_SUCCESS);
 		}
@@ -616,6 +622,7 @@
 			myfree(subject);
 			unlink(donemailname);
 			myfree(donemailname);
+			myfree(randomstr);
 			execlp(mlmmjsend, mlmmjsend,
 					"-l", "1",
 					"-T", fromemails.emaillist[0],
@@ -646,6 +653,7 @@
 		return EXIT_SUCCESS;
 	}
 
+	myfree(randomstr);
 
 	if(noprocess) {
 		myfree(donemailname);