diff src/prepstdreply.c @ 754:ecb991e41a4c

Add $controlN$ substitution The interfaces to substitute() and substitute_one() have changed, as they now need to know the listdir to be able to find control files
author Ben Schmidt
date Wed, 06 Oct 2010 23:30:26 +1100
parents 5edfa9eef6c7
children af2d036b7d0c
line wrap: on
line diff
--- a/src/prepstdreply.c	Wed Oct 06 23:26:26 2010 +1100
+++ b/src/prepstdreply.c	Wed Oct 06 23:30:26 2010 +1100
@@ -32,6 +32,7 @@
 #include <errno.h>
 
 #include "prepstdreply.h"
+#include "ctrlvalue.h"
 #include "strgen.h"
 #include "chomp.h"
 #include "log_error.h"
@@ -44,13 +45,15 @@
 #include "unistr.h"
 
 char *substitute(const char *line, const char *listaddr, const char *listdelim,
-		 size_t datacount, char **data)
+		 size_t datacount, char **data, const char *listdir)
 {
 	char *s1, *s2;
 
-	s1 = substitute_one(line, listaddr, listdelim, datacount, data);
+	s1 = substitute_one(line, listaddr, listdelim, datacount, data,
+			listdir);
 	while(s1) {
-		s2 = substitute_one(s1, listaddr, listdelim, datacount, data);
+		s2 = substitute_one(s1, listaddr, listdelim, datacount, data,
+				listdir);
 		if(s2) {
 			myfree(s1);
 			s1 = s2;
@@ -62,7 +65,8 @@
 }
 
 char *substitute_one(const char *line, const char *listaddr,
-			const char *listdelim, size_t datacount, char **data)
+			const char *listdelim, size_t datacount, char **data,
+			const char *listdir)
 {
 	char *fqdn, *listname, *d1, *d2, *token, *value = NULL;
 	char *retstr, *origline;
@@ -132,6 +136,27 @@
 		value = concatstr(4, listname, listdelim, "subscribe-nomail@",
 				  fqdn);
 		goto concatandreturn;
+	} else if(strncmp(token, "control", 7) == 0) {
+		value = token + 7;
+		if(*value == '\0') {
+			value = mystrdup("");
+			goto concatandreturn;
+		}
+		for(; *value != '\0'; value++) {
+			if(*value >= '0' && *value <= '9') continue;
+			if(*value >= 'A' && *value <= 'Z') continue;
+			if(*value >= 'a' && *value <= 'z') continue;
+			break;
+		}
+		if(*value != '\0') {
+			value = mystrdup(token + 7);
+			goto concatandreturn;
+		}
+		value = token + 7;
+		value = ctrlcontent(listdir, value);
+		if (value == NULL)
+			value = mystrdup("");
+		goto concatandreturn;
 	}
 	if(data) {
 		for(i = 0; i < datacount; i++) {
@@ -237,11 +262,11 @@
 	tokencount += 6;
 
 	tmp = substitute(from, listaddr, listdelim,
-	                 tokencount, moredata);
+	                 tokencount, moredata, listdir);
 	headers[0] = concatstr(2, "From: ", tmp);
 	myfree(tmp);
 	tmp = substitute(to, listaddr, listdelim,
-	                 tokencount, moredata);
+	                 tokencount, moredata, listdir);
 	headers[1] = concatstr(2, "To: ", tmp);
 	myfree(tmp);
 	headers[2] = genmsgid(listfqdn);
@@ -255,7 +280,7 @@
 
 	if(replyto) {
 		tmp = substitute(replyto, listaddr, listdelim,
-		                 tokencount, moredata);
+		                 tokencount, moredata, listdir);
 		headers[8] = concatstr(2, "Reply-To: ", tmp);
 		myfree(tmp);
 	}
@@ -279,7 +304,7 @@
 			   continuation of previous header line */
 			utfsub = unistr_escaped_to_utf8(line);
 			str = substitute(utfsub, listaddr, listdelim,
-			                 tokencount, moredata);
+			                 tokencount, moredata, listdir);
 			myfree(utfsub);
 			len = strlen(str);
 			str[len] = '\n';
@@ -321,7 +346,7 @@
 			utfsub = unistr_escaped_to_utf8(tmp);
 			*tmp = '\0';
 			utfsub2 = substitute(utfsub, listaddr, listdelim,
-			                     tokencount, moredata);
+			                     tokencount, moredata, listdir);
 			myfree(utfsub);
 			if (strncasecmp(line, "Subject:", len) == 0) {
 				tmp = unistr_utf8_to_header(utfsub2);
@@ -427,7 +452,7 @@
 			myfree(utfline);
 		} else {
 			str = substitute(utfline, listaddr, listdelim,
-			                 tokencount, moredata);
+			                 tokencount, moredata, listdir);
 			myfree(utfline);
 			if(writen(outfd, str, strlen(str)) < 0) {
 				myfree(str);