changeset 163:39c46b88720d

Lets get rid of stdio shall we :-)
author mmj
date Fri, 04 Jun 2004 00:30:09 +1000
parents ae31156a16c1
children 1e60714b0bd5
files src/Makefile.am src/dumpfd2fd.c src/mlmmj-process.c
diffstat 3 files changed, 73 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile.am	Fri Jun 04 00:29:59 2004 +1000
+++ b/src/Makefile.am	Fri Jun 04 00:30:09 2004 +1000
@@ -25,7 +25,7 @@
 			mylocking.c listcontrol.c random-int.c strgen.c \
 			header_token.c print-version.c send_help.c \
 			do_all_the_voodo_here.c mygetline.c gethdrline.c \
-			log_error.c statctrl.c ctrlvalue.c
+			log_error.c statctrl.c ctrlvalue.c dumpfd2fd.c
 
 mlmmj_sub_SOURCES = mlmmj-sub.c writen.c mylocking.c \
 			getlistaddr.c chomp.c random-int.c strgen.c \
--- a/src/dumpfd2fd.c	Fri Jun 04 00:29:59 2004 +1000
+++ b/src/dumpfd2fd.c	Fri Jun 04 00:30:09 2004 +1000
@@ -26,10 +26,10 @@
 			if(errno == EINTR)
 				continue;
 			else
-				return errno;
+				return -1; /* Caller can check errno */
 		}
 		if(writen(outfd, &buf, n) < 0)
-			return errno;
+			return -1; /* Caller can check errno */
 	}
 	
 	return 0;
--- a/src/mlmmj-process.c	Fri Jun 04 00:29:59 2004 +1000
+++ b/src/mlmmj-process.c	Fri Jun 04 00:30:09 2004 +1000
@@ -32,11 +32,11 @@
 void newmoderated(const char *listdir, const char *mailfilename,
 		  const char *mlmmjsend)
 {
-	char *to, *from, *subject, *fqdn, *listname, *replyto;
+	char *from, *fqdn, *listname;
 	char *buf, *moderatorfilename, *listaddr = getlistaddr(listdir);
 	char *queuefilename, *moderatorsfilename, *randomstr = random_str();
-	char *mailbasename = mybasename(mailfilename);
-	FILE *moderatorfile, *queuefile, *moderatorsfile, *mailfile;
+	char *mailbasename = mybasename(mailfilename), *s1, *s2;
+	int moderatorfd, queuefd, moderatorsfd, mailfd;
 	size_t count = 0;
 	
 	printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename,
@@ -45,15 +45,17 @@
 	fqdn = genlistfqdn(listaddr);
 	listname = genlistname(listaddr);
 	moderatorfilename = concatstr(2, listdir, "/text/moderation");
-	if((moderatorfile = fopen(moderatorfilename, "r")) == NULL) {
+	if((moderatorfd = open(moderatorfilename, O_RDONLY)) < 0) {
 		log_error(LOG_ARGS, "Could not open text/moderation");
 		free(moderatorfilename);
 		exit(EXIT_FAILURE);
 	}
-	queuefilename = concatstr(3, listdir, "/moderation/queue", randomstr);
+	free(moderatorfilename);
+	queuefilename = concatstr(3, listdir, "/moderation/queue/", randomstr);
 	printf("%s\n", queuefilename);
 	
-	if((queuefile = fopen(queuefilename, "w")) == NULL) {
+	if((queuefd = open(queuefilename, O_WRONLY|O_CREAT|O_EXCL,
+					S_IRUSR|S_IWUSR)) < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", queuefilename);
 		free(queuefilename);
 		free(randomstr);
@@ -62,67 +64,69 @@
 	free(randomstr);
 
 	moderatorsfilename = concatstr(2, listdir, "/moderators");
-	if((moderatorsfile = fopen(moderatorsfilename, "r")) == NULL) {
+	if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
 		free(queuefilename);
 		free(moderatorsfilename);
-		fclose(queuefile);
+		close(queuefd);
 		exit(EXIT_FAILURE);
 	}
-	free(moderatorfilename);
+	free(moderatorsfilename);
 
-	if((mailfile = fopen(mailfilename, "r")) == NULL) {
+	if((mailfd = open(mailfilename, O_RDONLY)) < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", mailfilename);
 		free(queuefilename);
 		free(moderatorsfilename);
-		fclose(queuefile);
+		close(queuefd);
 		exit(EXIT_FAILURE);
 	}
 
-	fputs("From: ", queuefile);
 	from = concatstr(3, listname, "+owner@", fqdn);
-	fputs(from, queuefile);
-	fputc('\n', queuefile);
-	to = concatstr(5, "To: ", listname, "-moderators@", fqdn, "\n");
-	fputs(to, queuefile);
-	free(to);
-	replyto = concatstr(7, "Reply-To: ", listname, "+moderate-",
+	s1 = concatstr(3, "From: ", from, "\n");
+	s2 = concatstr(6, s1, "To: ", listname, "-moderators@", fqdn, "\n");
+	free(s1);
+	s1 = concatstr(8, s2, "Reply-To: ", listname, "+moderate-",
 			       mailbasename, "@", fqdn, "\n");
-	fputs(replyto, queuefile);
-	free(replyto);
-	subject = concatstr(3, "Subject: Moderation needed for ", listaddr,
+	free(s2);
+	s2 = concatstr(4, s1, "Subject: Moderation needed for ", listaddr,
 			       "\n\n");
-	fputs(subject, queuefile);
-	free(subject);
+	free(s1);
+	if(writen(queuefd, s2, strlen(s2)) < 0) {
+		log_error(LOG_ARGS, "Could not write to %s", queuefilename);
+		exit(EXIT_FAILURE);
+	}
+	free(s2);
 	
-	while((buf = myfgetline(moderatorfile))) {
+	while((buf = mygetline(moderatorfd))) {
 		if(strncmp(buf, "*LISTADDR*", 10) == 0) {
-			fputs(listaddr, queuefile);
+			writen(queuefd, listaddr, strlen(listaddr));
 		} else if(strncmp(buf, "*MODERATEADDR*", 14) == 0) {
-			fputs(listname, queuefile);
-			fputs("+moderate-", queuefile);
-			fputs(mailbasename, queuefile);
-			fputc('@', queuefile);
-			fputs(fqdn, queuefile);
+			s1 = concatstr(5, listname, "+moderate-",
+					mailbasename, "@", fqdn);
+			writen(queuefd, s1, strlen(s1));
+			free(s1);
 		} else if(strncmp(buf, "*MODERATORS*", 12) == 0) {
 			free(buf);
-			while((buf = myfgetline(moderatorsfile))) {
-				fputs(buf, queuefile);
+			while((buf = mygetline(moderatorsfd))) {
+				writen(queuefd, buf, strlen(buf));
 				free(buf);
 				buf = NULL;
 			}
 		} else
-			fputs(buf, queuefile);
+			writen(queuefd, buf, strlen(buf));
 		free(buf);
 	}
-	fclose(moderatorfile);
-	while((buf = myfgetline(mailfile)) && count < 100) {
-		fputc(' ', queuefile);
-		fputs(buf, queuefile);
+	close(moderatorfd);
+	close(moderatorsfd);
+	while((buf = mygetline(mailfd)) && count < 100) {
+		s1 = concatstr(2, " ", buf);
 		free(buf);
+		writen(queuefd, s1, strlen(s1));
+		free(s1);
 		count++;
 	}
-	fclose(queuefile);
+	close(queuefd);
+	close(mailfd);
 
 	execlp(mlmmjsend, mlmmjsend,
 				"-l", "2",
@@ -150,12 +154,12 @@
 int main(int argc, char **argv)
 {
 	int i, fd, opt, noprocess = 0, moderated = 0;
+	int hdrfd, footfd, rawmailfd, donemailfd;
 	char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL;
 	char *footerfilename = NULL, *donemailname = NULL;
 	char *randomstr = random_str(), *mqueuename;
 	char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
 	char *bindir, *subjectprefix, *discardname;
-	FILE *headerfile, *footerfile, *rawmailfile, *donemailfile;
 	struct email_container fromemails = { 0, NULL };
 	struct email_container toemails = { 0, NULL };
 	struct email_container ccemails = { 0, NULL };
@@ -202,59 +206,55 @@
 	}
 
 	donemailname = concatstr(3, listdir, "/queue/", randomstr);
-	fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
-	while(fd == -1 && errno == EEXIST) {
+	donemailfd = open(donemailname, O_RDWR|O_CREAT|O_EXCL,
+					S_IRUSR|S_IWUSR);
+	while(donemailfd < 0 && errno == EEXIST) {
 		free(donemailname);
 		randomstr = random_str();
 		donemailname = concatstr(3, listdir, "/queue/", randomstr);
-		fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
+		fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL,
+					S_IRUSR|S_IWUSR);
 	}
 	
-	if(fd == -1) {
+	if(donemailfd < 0) {
 		free(donemailname);
 		log_error(LOG_ARGS, "could not create mail file in queue"
 				    "directory");
 		exit(EXIT_FAILURE);
 	}
-
-	if((donemailfile = fdopen(fd, "w")) == NULL) {
+#if 0
+	log_error(LOG_ARGS, "donemailname = [%s]\n", donemailname);
+#endif
+	if((rawmailfd = open(mailfile, O_RDONLY)) < 0) {
 		free(donemailname);
-		log_error(LOG_ARGS, "could not fdopen() output mail file");
-		exit(EXIT_FAILURE);
-	}
-
-#if 0
-	log_error(LOG_ARGS, "[%s]\n", donemailname);
-#endif
-	if((rawmailfile = fopen(mailfile, "r")) == NULL) {
-		free(donemailname);
-		log_error(LOG_ARGS, "could not fopen() input mail file");
+		log_error(LOG_ARGS, "could not open() input mail file");
 		exit(EXIT_FAILURE);
 	}
 
 	headerfilename = concatstr(2, listdir, "/control/customheaders");
-	headerfile = fopen(headerfilename, "r");
+	hdrfd = open(headerfilename, O_RDONLY);
 	free(headerfilename);
 	
 	footerfilename = concatstr(2, listdir, "/control/footer");
-	footerfile = fopen(footerfilename, "r");
+	footfd = open(footerfilename, O_RDONLY);
 	free(footerfilename);
 	
 	subjectprefix = ctrlvalue(listdir, "prefix");	
 	
-	do_all_the_voodo_here(rawmailfile, donemailfile, headerfile,
-				footerfile, badheaders, readhdrs,
-				subjectprefix);
+	if(do_all_the_voodo_here(rawmailfd, donemailfd, hdrfd, footfd,
+				badheaders, readhdrs, subjectprefix) < 0) {
+		log_error(LOG_ARGS, "Error in do_all_the_voodo_here.");
+		exit(EXIT_FAILURE);
+	}
 
-	fclose(rawmailfile);
+	close(rawmailfd);
 	unlink(mailfile);
-	close(fd);
-	fclose(donemailfile);
+	close(donemailfd);
 
-	if(headerfile)
-		fclose(headerfile);
-	if(footerfile)
-		fclose(footerfile);
+	if(hdrfd)
+		close(hdrfd);
+	if(footfd)
+		close(footfd);
 
 	if(readhdrs[0].token) { /* From: addresses */
 		for(i = 0; i < readhdrs[0].valuecount; i++) {
@@ -288,7 +288,8 @@
 		log_error(LOG_ARGS, "listcontrol(from, %s, %s, %s, %s, %s, %s)\n", listdir, toemails.emaillist[0], mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce);
 #endif
 		listcontrol(&fromemails, listdir, toemails.emaillist[0],
-			    mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce);
+			    mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce,
+			    donemailname);
 		return EXIT_SUCCESS;
 	}
 #if 0
@@ -306,9 +307,6 @@
 				mqueuename);
 		free(randomstr);
 		if(rename(donemailname, mqueuename) < 0) {
-			printf("could not rename(%s,%s)\n", 
-					    donemailname, mqueuename);
-			perror("rename");
 			log_error(LOG_ARGS, "could not rename(%s,%s)", 
 					    donemailname, mqueuename);
 			free(donemailname);