#define PREPSTDREPLY_H
#include <stdbool.h>
+#include "mlmmj.h"
struct text;
typedef struct text text;
rewind_function rew, get_function get, void * state);
char *get_processed_text_line(text *txt, int headers,
const char *listdir, int listfd, int ctrlfd);
-bool prepstdreply_to(text *txt, const char *listdir,
- const char *from, const char *to, const char *replyto, int listfd, int ctrlfd, int tofd, const char *messageid);
-char *prepstdreply(text *txt, const char *listdir,
- const char *from, const char *to, const char *replyto, int listfd, int ctrlfd);
+bool prepstdreply_to(text *txt, struct ml *ml,
+ const char *from, const char *to, const char *replyto, int tofd, const char *messageid);
+char *prepstdreply(text *txt, struct ml *ml,
+ const char *from, const char *to, const char *replyto);
void close_text(text *txt);
-void register_default_unformatted(text *txt, const char *listdelim, const char *listaddr);
+void register_default_unformatted(text *txt, struct ml *ml);
#endif /* PREPSTDREPLY_H */
txt = open_text(ml->fd, "deny", "sub", "disabled",
"digest", "sub-deny-digest");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr",
tll_front(*fromemails));
- queuefilename = prepstdreply(txt, ml->dir,
+ queuefilename = prepstdreply(txt, ml,
"$listowner$",
- tll_front(*fromemails), NULL, ml->fd, ml->ctrlfd);
+ tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(ml, queuefilename,
txt = open_text(ml->fd, "deny", "sub", "disabled",
"nomail", "sub-deny-nomail");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr",
tll_front(*fromemails));
- queuefilename = prepstdreply(txt, ml->dir,
+ queuefilename = prepstdreply(txt, ml,
"$listowner$",
- tll_front(*fromemails), NULL, ml->fd,
- ml->ctrlfd);
+ tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(ml, queuefilename,
txt = open_text(ml->fd, "deny", "sub", "disabled",
"both", "sub-deny-digest");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr",
tll_front(*fromemails));
- queuefilename = prepstdreply(txt, ml->dir,
+ queuefilename = prepstdreply(txt, ml,
"$listowner$",
- tll_front(*fromemails), NULL, ml->fd,ml->ctrlfd);
+ tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(ml, queuefilename,
tll_front(*fromemails));
txt = open_text(ml->fd, "help", NULL, NULL, NULL, "listhelp");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$listowner$", tll_front(*fromemails), NULL, ml->fd,ml->ctrlfd);
+ register_default_unformatted(txt, ml);
+ queuefilename = prepstdreply(txt, ml,
+ "$listowner$", tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(ml, queuefilename,
tll_front(*fromemails));
txt = open_text(ml->fd, "faq", NULL, NULL, NULL, "listfaq");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$listowner$", tll_front(*fromemails), NULL, ml->fd,ml->ctrlfd);
+ register_default_unformatted(txt, ml);
+ queuefilename = prepstdreply(txt, ml,
+ "$listowner$", tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(ml, queuefilename,
txt = open_text(ml->fd, "probe", NULL, NULL, NULL, "bounce-probe");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "bouncenumbers", "%bouncenumbers%"); /* DEPRECATED */
fls = init_file_lines(addr, ':');
register_formatted(txt, "bouncenumbers",
rewind_file_lines, get_file_line, fls);
- queuefilename = prepstdreply(txt, ml->dir, "$listowner$", myaddr, NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", myaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
txt = open_text(ml->fd, "moderate", "post",
modreason_strs[modreason], NULL, "moderation");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_unformatted(txt, "moderateaddr", replyto); /* DEPRECATED */
register_formatted(txt, "moderators",
rewind_memory_lines, get_memory_line, mls);
register_originalmail(txt, mailfilename);
- queuefilename = prepstdreply(txt, ml->dir, "$listowner$", to, replyto,
- ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", to, replyto);
MY_ASSERT(queuefilename);
close_text(txt);
txt = open_text(ml->fd, "wait", "post",
modreason_strs[modreason], NULL, "moderation-poster");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_unformatted(txt, "moderators", "%moderators%"); /* DEPRECATED */
register_formatted(txt, "moderators",
rewind_memory_lines, get_memory_line, mls);
register_originalmail(txt, mailfilename);
- queuefilename = prepstdreply(txt, ml->dir,
- "$listowner$", efromsender, NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", efromsender, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
txt = open_text(ml.fd, "deny", "post",
"maxmailsize", NULL, "maxmailsize");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml.delim, ml.addr);
+ register_default_unformatted(txt, &ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_unformatted(txt, "maxmailsize", maxmailsizestr);
register_originalmail(txt, donemailname);
- queuefilename = prepstdreply(txt, ml.dir,
- "$listowner$", posteraddr, NULL, ml.fd, ml.fd);
+ queuefilename = prepstdreply(txt, &ml, "$listowner$",
+ posteraddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
unlink(donemailname);
txt = open_text(ml.fd, "deny", "post",
"tocc", NULL, "notintocc");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml.delim, ml.addr);
+ register_default_unformatted(txt, &ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_originalmail(txt, donemailname);
- queuefilename = prepstdreply(txt, ml.dir,
- "$listowner$", posteraddr, NULL, ml.fd, ml.ctrlfd);
+ queuefilename = prepstdreply(txt, &ml,
+ "$listowner$", posteraddr, NULL);
MY_ASSERT(queuefilename)
close_text(txt);
unlink(donemailname);
txt = open_text(ml.fd, "deny", "post",
"access", NULL, "access");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml.delim, ml.addr);
+ register_default_unformatted(txt, &ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_originalmail(txt, donemailname);
- queuefilename = prepstdreply(txt, ml.dir,
- "$listowner$", posteraddr, NULL, ml.fd, ml.ctrlfd);
+ queuefilename = prepstdreply(txt, &ml,
+ "$listowner$", posteraddr, NULL);
MY_ASSERT(queuefilename)
close_text(txt);
unlink(donemailname);
"modonlypost", NULL, NULL);
}
MY_ASSERT(txt);
- register_default_unformatted(txt, ml.delim, ml.addr);
+ register_default_unformatted(txt, &ml);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", testaddr);
register_originalmail(txt, donemailname);
- queuefilename = prepstdreply(txt, ml.dir,
- "$listowner$", testaddr, NULL, ml.fd, ml.ctrlfd);
+ queuefilename = prepstdreply(txt, &ml,
+ "$listowner$", testaddr, NULL);
MY_ASSERT(queuefilename)
close_text(txt);
unlink(donemailname);
subreason_strs[reasonsub], subtype_strs[typesub],
"submod-moderator");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "moderateaddr", replyto); /* DEPRECATED */
register_unformatted(txt, "permitaddr", replyto);
register_unformatted(txt, "moderators", "%gatekeepers%"); /* DEPRECATED */
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
- queuefilename = prepstdreply(txt, ml->dir, "$listowner$", to, replyto,
- ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", to, replyto);
MY_ASSERT(queuefilename);
close_text(txt);
subreason_strs[reasonsub], subtype_strs[typesub],
"submod-requester");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "moderators", "%gatekeepers"); /* DEPRECATED */
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
- queuefilename = prepstdreply(txt, ml->dir,
- "$listowner$", subaddr, NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", subaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
listtext);
free(listtext);
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, NULL, ml->fd, ml->fd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
listtext);
free(listtext);
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, confirmaddr, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, confirmaddr);
MY_ASSERT(queuefilename);
close_text(txt);
"deny", "sub", "subbed", subtype_strs[typesub],
"sub-subscribed");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, NULL, ml->fd, ml->fd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
listtext);
free(listtext);
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
listtext);
free(listtext);
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, confirmaddr, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, confirmaddr);
MY_ASSERT(queuefilename);
close_text(txt);
"deny", "unsub", "unsubbed", subtype_strs[typesub],
"unsub-notsubscribed");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
- queuefilename = prepstdreply(txt, ml->dir,
- "$helpaddr$", subaddr, NULL, ml->fd, ml->fd);
+ queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
}
void
-register_default_unformatted(text *txt, const char *listdelim,
- const char *listaddr)
+register_default_unformatted(text *txt, struct ml *ml)
{
- char *listname, *fqdn, *tmp;
-
- fqdn = genlistfqdn(listaddr);
- listname = genlistname(listaddr);
+ char *tmp;
register_unformatted(txt, "", "$");
- register_unformatted(txt, "listaddr", listaddr);
- xasprintf(&tmp, "%s%s", listname, listdelim);
+ register_unformatted(txt, "listaddr", ml->addr);
+ xasprintf(&tmp, "%s%s", ml->name, ml->delim);
register_unformatted(txt, "list+", tmp);
- register_unformatted(txt, "list", listname);
- register_unformatted(txt, "domain", fqdn);
+ register_unformatted(txt, "list", ml->name);
+ register_unformatted(txt, "domain", ml->fqdn);
free(tmp);
- xasprintf(&tmp, "%s%sowner@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "owner");
register_unformatted(txt, "listowner", tmp);
free(tmp);
- xasprintf(&tmp, "%s%shelp@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "help");
register_unformatted(txt, "helpaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%sfaq@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "faq");
register_unformatted(txt, "faqaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%sget-N@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "get-N");
register_unformatted(txt, "listgetN", tmp);
free(tmp);
- xasprintf(&tmp, "%s%sunsubscribe@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "unsubscribe");
register_unformatted(txt, "listunsubaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%sunsubscribe-digest@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "unsubscribe-digest");
register_unformatted(txt, "digestunsubaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%sunsubscribe-nomail@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "unsubscribe-nomail");
register_unformatted(txt, "nomailunsubaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%ssubscribe@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "subscribe");
register_unformatted(txt, "listsubaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%ssubscribe-digest@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "subscribe-digest");
register_unformatted(txt, "digestsubaddr", tmp);
free(tmp);
- xasprintf(&tmp, "%s%ssubscribe-nomail@%s", listname, listdelim, fqdn);
+ gen_addr(tmp, ml, "subscribe-nomail");
register_unformatted(txt, "nomailsubaddr", tmp);
free(tmp);
}
}
bool
-prepstdreply_to(text *txt, const char *listdir, const char *from, const char *to,
- const char *replyto, int listfd, int ctrlfd, int tofd, const char *msgid)
+prepstdreply_to(text *txt, struct ml *ml, const char *from, const char *to,
+ const char *replyto, int tofd, const char *msgid)
{
bool ret = false;
char *tmp, *line;
int i;
size_t len;
- char *listaddr, *listdelim, *listfqdn, *str;
+ char *str;
char *headers[10] = { NULL }; /* relies on NULL to flag end */
- listaddr = getlistaddr(ctrlfd);
- listdelim = getlistdelim(ctrlfd);
- listfqdn = genlistfqdn(listaddr);
-
for (i=0; i<6; i++) {
tmp = xstrdup("randomN");
tmp[6] = '0' + i;
free(str);
}
- tmp = substitute(from, listfd, ctrlfd, txt);
+ tmp = substitute(from, ml->fd, ml->ctrlfd, txt);
xasprintf(&headers[0], "From: %s", tmp);
free(tmp);
- tmp = substitute(to, listfd, ctrlfd, txt);
+ tmp = substitute(to, ml->fd, ml->ctrlfd, txt);
xasprintf(&headers[1], "To: %s", tmp);
free(tmp);
if (msgid)
headers[2] = xstrdup(msgid);
else
- headers[2] = genmsgid(listfqdn);
+ headers[2] = genmsgid(ml->fqdn);
chomp(headers[2]);
if (msgid)
headers[3] = xstrdup(msgid);
headers[7] = xstrdup("Content-Transfer-Encoding: 8bit");
if(replyto) {
- tmp = substitute(replyto, listfd, ctrlfd, txt);
+ tmp = substitute(replyto, ml->fd, ml->fd, txt);
xasprintf(&headers[8], "Reply-To: %s", tmp);
free(tmp);
}
for(;;) {
- line = get_processed_text_line(txt, 1, listdir, listfd, ctrlfd);
+ line = get_processed_text_line(txt, 1, ml->dir, ml->fd, ml->fd);
if (!line) {
log_error(LOG_ARGS, "No body in listtext");
break;
}
if (line == NULL) {
- line = get_processed_text_line(txt, 0, listdir, listfd, ctrlfd);
+ line = get_processed_text_line(txt, 0, ml->dir, ml->fd, ml->ctrlfd);
}
while(line) {
if(dprintf(tofd, "%s\n", line) < 0) {
goto freeandreturn;
}
free(line);
- line = get_processed_text_line(txt, 0, listdir, listfd, ctrlfd);
+ line = get_processed_text_line(txt, 0, ml->dir, ml->fd, ml->ctrlfd);
}
fsync(tofd);
ret = true;
freeandreturn:
- free(listaddr);
- free(listdelim);
- free(listfqdn);
return ret;
}
-char *prepstdreply(text *txt, const char *listdir,
- const char *from, const char *to, const char *replyto, int listfd, int ctrlfd)
+char *prepstdreply(text *txt, struct ml *ml, const char *from, const char *to, const char *replyto)
{
int outfd;
char *tmp, *retstr = NULL;
tmp = random_str();
if (retstr)
free(retstr);
- retstr = concatstr(3, listdir, "/queue/", tmp);
+ xasprintf(&retstr, "%s/queue/%s", ml->dir, tmp);
free(tmp);
outfd = open(retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
free(txt);
return NULL;
}
- if (!prepstdreply_to(txt, listdir, from, to, replyto, listfd, ctrlfd, outfd, NULL))
+ if (!prepstdreply_to(txt, ml, from, to, replyto, outfd, NULL))
return (NULL);
return (retstr);
}
log_error(LOG_ARGS, "Could not open listtext 'digest'");
goto fallback_subject;
}
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
snprintf(buf, sizeof(buf), "%d", firstindex);
register_unformatted(txt, "digestfirst", buf);
txt = open_text(ml->fd, "list", NULL, NULL, subtype_strs[SUB_ALL],
"listsubs");
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_formatted(txt, "listsubs",
rewind_subs_list, get_sub, normalsls);
register_formatted(txt, "normalsubs",
rewind_subs_list, get_sub, digestsls);
register_formatted(txt, "nomailsubs",
rewind_subs_list, get_sub, nomailsls);
- queuefilename = prepstdreply(txt, ml->dir, "$listowner$", emailaddr,
- NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", emailaddr, NULL);
MY_ASSERT(queuefilename);
close_text(txt);
subreason_strs[reasonsub], subtype_strs[typesub],
listtext);
MY_ASSERT(txt);
- register_default_unformatted(txt, ml->delim, ml->addr);
+ register_default_unformatted(txt, ml);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, sub ? "newsub" : "oldsub", subaddr); /* DEPRECATED */
- queuefilename = prepstdreply(txt, ml->dir,
- "$listowner$", "$listowner$", NULL, ml->fd, ml->ctrlfd);
+ queuefilename = prepstdreply(txt, ml, "$listowner$", "$listowner$", NULL);
MY_ASSERT(queuefilename);
close_text(txt);
ml_init(&ml);
ml.dir = "list";
ATF_REQUIRE(ml_open(&ml, false));
- ATF_REQUIRE(prepstdreply_to(txt, ml.dir, "me@fqdn.org", "to@plop.org", NULL, ml.fd, ml.ctrlfd, tofd, "Message-Id: <fake>"));
+ ATF_REQUIRE(prepstdreply_to(txt, &ml, "me@fqdn.org", "to@plop.org", NULL, tofd, "Message-Id: <fake>"));
close_text(txt);
fsync(tofd);
close(tofd);
ml_init(&ml);
ml.dir = "list";
ATF_REQUIRE(ml_open(&ml, false));
- register_default_unformatted(txt, ml.delim, ml.addr);
- ATF_REQUIRE(prepstdreply_to(txt, ml.dir, "me@fqdn.org", "to@plop.org", "bla@me.org", ml.fd, ml.ctrlfd, tofd, "Message-Id: <fake>"));
+ register_default_unformatted(txt, &ml);
+ ATF_REQUIRE(prepstdreply_to(txt, &ml, "me@fqdn.org", "to@plop.org", "bla@me.org", tofd, "Message-Id: <fake>"));
close_text(txt);
fsync(tofd);
close(tofd);