Mercurial > hg > mlmmj
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);