changeset 117:9a39dff171fa

added mydirname() and mybasename() which doesn't mess with their argument, and returns newly allocated strings
author mortenp
date Thu, 27 May 2004 23:04:29 +1000
parents f619b85b02d1
children a634575fd7d5
files include/strgen.h src/mlmmj-process.c src/mlmmj-recieve.c src/mlmmj-send.c src/mlmmj-sub.c src/mlmmj-unsub.c src/strgen.c
diffstat 7 files changed, 55 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/include/strgen.h	Thu May 27 17:16:50 2004 +1000
+++ b/include/strgen.h	Thu May 27 23:04:29 2004 +1000
@@ -16,5 +16,7 @@
 char *genlistfqdn(const char *listaddr);
 char *concatstr(int count, ...);
 char *hostnamestr(void);
+char *mydirname(const char *path);
+char *mybasename(const char *path);
 
 #endif /* STRGEN_H */
--- a/src/mlmmj-process.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/mlmmj-process.c	Thu May 27 23:04:29 2004 +1000
@@ -35,7 +35,7 @@
 	char *to, *from, *subject, *fqdn, *listname, *replyto;
 	char *buf, *moderatorfilename, *listaddr = getlistaddr(listdir);
 	char *queuefilename, *moderatorsfilename, *randomstr = random_str();
-	char *mailbasename = basename(strdup(mailfilename));
+	char *mailbasename = mybasename(mailfilename);
 	FILE *moderatorfile, *queuefile, *moderatorsfile, *mailfile;
 	size_t count = 0;
 	
@@ -155,7 +155,7 @@
 	char *footerfilename = NULL, *donemailname = NULL;
 	char *randomstr = random_str(), *basename, *mqueuename;
 	char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
-	char *argv0 = strdup(argv[0]), *subjectprefix;
+	char *bindir, *subjectprefix;
 	FILE *headerfile, *footerfile, *rawmailfile, *donemailfile;
 	struct email_container toemails = { 0, NULL };
 	const char *badheaders[] = { "From ", "Return-Path:", NULL };
@@ -168,17 +168,12 @@
 
 	log_set_name(argv[0]);
 
-	mlmmjsend = concatstr(2, dirname(argv0), "/mlmmj-send");
-	free(argv0);
-	argv0 = strdup(argv[0]);
-	mlmmjsub = concatstr(2, dirname(argv0), "/mlmmj-sub");
-	free(argv0);
-	argv0 = strdup(argv[0]);
-	mlmmjunsub = concatstr(2, dirname(argv0), "/mlmmj-unsub");
-	free(argv0);
-	argv0 = strdup(argv[0]);
-	mlmmjbounce = concatstr(2, dirname(argv0), "/mlmmj-bounce");
-	free(argv0);
+	bindir = mydirname(argv[0]);
+	mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
+	mlmmjsub = concatstr(2, bindir, "/mlmmj-sub");
+	mlmmjunsub = concatstr(2, bindir, "/mlmmj-unsub");
+	mlmmjbounce = concatstr(2, bindir, "/mlmmj-bounce");
+	free(bindir);
 	
 	while ((opt = getopt(argc, argv, "hVPm:L:")) != -1) {
 		switch(opt) {
--- a/src/mlmmj-recieve.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/mlmmj-recieve.c	Thu May 27 23:04:29 2004 +1000
@@ -39,14 +39,15 @@
 {
 	char *infilename = NULL, *listdir = NULL, *line = NULL;
 	char *randomstr = random_str();
-	char *mlmmjprocess, *argv0 = strdup(argv[0]);
+	char *mlmmjprocess, *bindir;
 	int fd, opt, noprocess = 0, nofork = 0;
 	pid_t childpid;
 	
 	log_set_name(argv[0]);
 
-	mlmmjprocess = concatstr(2, dirname(argv0), "/mlmmj-process");
-	free(argv0);
+	bindir = mydirname(argv[0]);
+	mlmmjprocess = concatstr(2, bindir, "/mlmmj-process");
+	free(bindir);
 	
 	while ((opt = getopt(argc, argv, "hPVL:F")) != -1) {
 		switch(opt) {
--- a/src/mlmmj-send.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/mlmmj-send.c	Thu May 27 23:04:29 2004 +1000
@@ -286,7 +286,6 @@
 {
 	int sendres = 0;
 	char *bounceaddr, *addr, *index, *dirname, *addrfilename;
-	char *myarchivefilename = strdup(archivefilename);
 	FILE *addrfile;
 
 	while((addr = myfgetline(subfile))) {
@@ -303,8 +302,7 @@
 		}
 		if(sendres && listaddr && archivefilename) {
 			/* we failed, so save the addresses and bail */
-			index = basename(myarchivefilename);	
-			free(myarchivefilename);
+			index = mybasename(archivefilename);	
 			dirname = concatstr(3, listdir, "/requeue/", index);
 			free(index);
 			if(mkdir(dirname, 0750) < 0) {
@@ -402,7 +400,7 @@
 		switch(opt) {
 		case 'a':
 			archive = 0;
-			break
+			break;
 		case 'D':
 			deletewhensent = 0;
 			break;
@@ -545,6 +543,7 @@
 			log_error(LOG_ARGS, "Could not opendir(%s)",
 					    subddirname);
 			free(subddirname);
+			exit(EXIT_FAILURE);
 		}
 		free(subddirname);
 
--- a/src/mlmmj-sub.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/mlmmj-sub.c	Thu May 27 23:04:29 2004 +1000
@@ -207,13 +207,14 @@
 int main(int argc, char **argv)
 {
 	char *listaddr, *listdir = NULL, *address = NULL, *subfilename = NULL;
-	char *mlmmjsend, *argv0 = strdup(argv[0]), chstr[2];
+	char *mlmmjsend, *bindir, chstr[2];
 	int subconfirm = 0, confirmsub = 0, opt, subfilefd, lock;
 	size_t len;
 	off_t suboff;
 
-	mlmmjsend = concatstr(2, dirname(argv0), "/mlmmj-send");
-	free(argv0);
+	bindir = mydirname(argv[0]);
+	mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
+	free(bindir);
 	
 	log_set_name(argv[0]);
 
--- a/src/mlmmj-unsub.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/mlmmj-unsub.c	Thu May 27 23:04:29 2004 +1000
@@ -245,14 +245,15 @@
 	int subread, subwrite, rlock, wlock, opt, unsubres;
 	int confirmunsub = 0, unsubconfirm = 0;
 	char *listaddr, *listdir = NULL, *address = NULL, *subreadname = NULL;
-	char *subwritename, *mlmmjsend, *argv0 = strdup(argv[0]);
+	char *subwritename, *mlmmjsend, *bindir;
 	char *subddirname;
 	off_t suboff;
 	DIR *subddir;
 	struct dirent *dp;
 	
-	mlmmjsend = concatstr(2, dirname(argv0), "/mlmmj-send");
-	free(argv0);
+	bindir = mydirname(argv[0]);
+	mlmmjsend = concatstr(2, bindir, "/mlmmj-send");
+	free(bindir);
 
 	log_set_name(argv[0]);
 
--- a/src/strgen.c	Thu May 27 17:16:50 2004 +1000
+++ b/src/strgen.c	Thu May 27 23:04:29 2004 +1000
@@ -12,6 +12,7 @@
 #include <stdarg.h>
 #include <unistd.h>
 #include <netdb.h>
+#include <libgen.h>
 
 #include "strgen.h"
 #include "wrappers.h"
@@ -129,3 +130,32 @@
         return strdup(hostlookup->h_name);
 }
 
+char *mydirname(const char *path)
+{
+	char *mypath, *dname, *ret;
+
+	mypath = strdup(path);
+	dname = dirname(mypath);
+	ret = strdup(dname);
+
+	/* We don't free mypath until we have strdup()'ed dname, because
+	 * dirname() returns a pointer into mypath  -- mortenp 20040527 */
+	free(mypath);
+
+	return ret;
+}
+
+char *mybasename(const char *path)
+{
+	char *mypath, *bname, *ret;
+
+	mypath = strdup(path);
+	bname = basename(mypath);
+	ret = strdup(bname);
+
+	/* We don't free mypath until we have strdup()'ed bname, because
+	 * basename() returns a pointer into mypath  -- mortenp 20040527 */
+	free(mypath);
+	
+	return ret;
+}