#include <limits.h>
char *ctrlvalue(int ctrlfd, const char *ctrlstr);
-char *ctrlcontent(const char *listdir, const char *ctrlstr);
-char *textcontent(const char *listdir, const char *ctrlstr);
+char *ctrlcontent(int ctrlfd, const char *ctrlstr);
+char *textcontent(int listfd, const char *ctrlstr);
intmax_t ctrlim(int ctrlfd, const char *ctrlstr, intmax_t min,
intmax_t max, intmax_t fallback);
uintmax_t ctrluim(int ctrlfd, const char *ctrlstr, uintmax_t min,
int listcontrol(struct email_container *fromemails, const char *listdir,
const char *controlstr, const char *mlmmjsub,
const char *mlmmjunsub, const char *mlmmjsend,
- const char *mailname, int fd);
+ const char *mailname, int listfd, int ctrlfd);
#endif /* LISTCONTROL_H */
void finish_file_lines(file_lines_state *s);
char *substitute(const char *line, const char *listaddr, const char *listdelim,
- const char *listdir, text *txt);
+ int listfd, int ctrlfd, text *txt);
text *open_text_file(const char *listdir, const char *filename);
text *open_text(const char *listdir, const char *purpose, const char *action,
void register_formatted(text *txt, const char *token,
rewind_function rew, get_function get, void * state);
char *get_processed_text_line(text *txt, int headers,
- const char *listaddr, const char *listdelim, const char *listdir, int ctrlfd);
+ const char *listaddr, const char *listdelim, const char *listdir, int listfd, int ctrlfd);
char *prepstdreply(text *txt, const char *listdir,
- const char *from, const char *to, const char *replyto, int ctrlfd);
+ const char *from, const char *to, const char *replyto, int listfd, int ctrlfd);
void close_text(text *txt);
#endif /* PREPSTDREPLY_H */
#define SEND_DIGEST_H
int send_digest(const char *listdir, int lastindex, int index,
- int issue, const char *addr, const char *mlmmjsend, int ctrlfd);
+ int issue, const char *addr, const char *mlmmjsend, int listfd, int ctrlfd);
#endif /* SEND_DIGEST_H */
#define SEND_LIST_H
void send_list(const char *listdir, const char *emailaddr,
- const char *mlmmjsend, int ctrlfd);
+ const char *mlmmjsend, int ctrlfd, int listfd);
#endif
#include "xmalloc.h"
static char *
-_ctrlval(int ctrlfd, const char *ctrlstr, int oneline)
+ctrlval(int ctrlfd, const char *ctrlstr, int oneline)
{
int fd;
FILE *fp;
return (buf);
}
-static char *ctrlvalat(int dfd, const char *subdir,
- const char *ctrlstr, int oneline)
+char *
+ctrlvalue(int ctrlfd, const char *ctrlstr)
{
- char *buf;
- int ctrlfd;
-
- if (dfd == -1)
- return NULL;
-
- ctrlfd = openat(dfd, subdir, O_DIRECTORY|O_CLOEXEC);
-
- if(ctrlfd < 0)
- return NULL;
-
- buf = _ctrlval(ctrlfd, ctrlstr, oneline);
- close(ctrlfd);
- return (buf);
+ return (ctrlval(ctrlfd, ctrlstr, true));
}
-static char *ctrlval(const char *listdir, const char *subdir,
- const char *ctrlstr, int oneline)
+char *
+ctrlcontent(int ctrlfd, const char *ctrlstr)
{
- int dfd = open(listdir, O_DIRECTORY|O_CLOEXEC);
- char *ret = ctrlvalat(dfd, subdir, ctrlstr, oneline);
- if (dfd != -1)
- close(dfd);
- return (ret);
-}
-
-char *ctrlvalue(int ctrlfd, const char *ctrlstr)
-{
- return (_ctrlval(ctrlfd, ctrlstr, true));
+ return (ctrlval(ctrlfd, ctrlstr, false));
}
-char *ctrlcontent(const char *listdir, const char *ctrlstr)
+char *
+textcontent(int listfd, const char *ctrlstr)
{
- return ctrlval(listdir, "control", ctrlstr, 0);
-}
-
-char *textcontent(const char *listdir, const char *ctrlstr)
-{
- return ctrlval(listdir, "text", ctrlstr, 0);
+ int fd = openat(listfd, "text", O_DIRECTORY|O_CLOEXEC);
+ char *ret = ctrlval(fd, ctrlstr, false);
+ close(fd);
+ return (ret);
}
intmax_t
intmax_t fallback)
{
const char *errstr;
- char *val = _ctrlval(ctrlfd, ctrlstr, true);
+ char *val = ctrlval(ctrlfd, ctrlstr, true);
intmax_t ret;
if (val == NULL)
uintmax_t fallback)
{
const char *errstr;
- char *val = _ctrlval(ctrlfd, ctrlstr, true);
+ char *val = ctrlval(ctrlfd, ctrlstr, true);
uintmax_t ret;
if (val == NULL)
ctrltimet(int dfd, const char *ctrlstr, time_t fallback)
{
const char *errstr;
- char *val = _ctrlval(dfd, ctrlstr, true);
+ char *val = ctrlval(dfd, ctrlstr, true);
time_t ret;
if (val == NULL)
int listcontrol(struct email_container *fromemails, const char *listdir,
const char *controlstr, const char *mlmmjsub,
const char *mlmmjunsub, const char *mlmmjsend,
- const char *mailname, int ctrlfd)
+ const char *mailname, int listfd, int ctrlfd)
{
char *bouncenr, *tmpstr;
char *param = NULL, *conffilename, *moderatefilename, *gatekeepfilename;
const char *subtype = NULL;
const char *subtypename = NULL;
bounce_t bret;
- int listfd;
/* A closed list doesn't allow subscribtion and unsubscription */
closedlist = statctrl(ctrlfd, "closedlist");
fromemails->emaillist[0]);
queuefilename = prepstdreply(txt, listdir,
"$listowner$",
- fromemails->emaillist[0], NULL, ctrlfd);
+ fromemails->emaillist[0], NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(listdir, queuefilename,
fromemails->emaillist[0]);
queuefilename = prepstdreply(txt, listdir,
"$listowner$",
- fromemails->emaillist[0], NULL, ctrlfd);
+ fromemails->emaillist[0], NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(listdir, queuefilename,
fromemails->emaillist[0]);
queuefilename = prepstdreply(txt, listdir,
"$listowner$",
- fromemails->emaillist[0], NULL, ctrlfd);
+ fromemails->emaillist[0], NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(listdir, queuefilename,
txt = open_text(listdir, "help", NULL, NULL, NULL, "listhelp");
MY_ASSERT(txt);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", fromemails->emaillist[0], NULL, ctrlfd);
+ "$listowner$", fromemails->emaillist[0], NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(listdir, queuefilename,
txt = open_text(listdir, "faq", NULL, NULL, NULL, "listfaq");
MY_ASSERT(txt);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", fromemails->emaillist[0], NULL, ctrlfd);
+ "$listowner$", fromemails->emaillist[0], NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
send_help(listdir, queuefilename,
" Ignoring mail");
return -1;
} else {
- send_list(listdir, owners->strs[owner_idx], mlmmjsend, ctrlfd);
+ send_list(listdir, owners->strs[owner_idx], mlmmjsend,
+ listfd, ctrlfd);
}
break;
#include "utils.h"
-void do_probe(const char *listdir, const char *mlmmjsend, const char *addr, int ctrlfd)
+void do_probe(const char *listdir, const char *mlmmjsend, const char *addr,
+ int listfd, int ctrlfd)
{
text *txt;
file_lines_state *fls;
fls = init_truncated_file_lines(addr, 0, ':');
register_formatted(txt, "bouncenumbers",
rewind_file_lines, get_file_line, fls);
- queuefilename = prepstdreply(txt, listdir, "$listowner$", myaddr, NULL, ctrlfd);
+ queuefilename = prepstdreply(txt, listdir, "$listowner$", myaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
if (probe) {
/* send out a probe */
- do_probe(listdir, mlmmjsend, address, ctrlfd);
+ do_probe(listdir, mlmmjsend, address, listfd, ctrlfd);
/* do_probe() will never return */
exit(EXIT_FAILURE);
}
if (index > lastindex) {
lastissue++;
- send_digest(listdir, lastindex+1, index, lastissue, NULL, mlmmjsend, ctrlfd);
+ send_digest(listdir, lastindex+1, index, lastissue, NULL, mlmmjsend, dfd, ctrlfd);
}
if (lseek(fd, 0, SEEK_SET) < 0) {
static void newmoderated(const char *listdir, const char *mailfilename,
const char *mlmmjsend, const char *efromsender,
const char *subject, const char *posteraddr,
- enum modreason modreason, int ctrlfd)
+ enum modreason modreason, int listfd, int ctrlfd)
{
char *from, *listfqdn, *listname, *moderators = NULL;
char *replyto, *listaddr = getlistaddr(ctrlfd), *listdelim;
rewind_memory_lines, get_memory_line, mls);
register_originalmail(txt, mailfilename);
queuefilename = prepstdreply(txt, listdir, "$listowner$", to, replyto,
- ctrlfd);
+ listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
rewind_memory_lines, get_memory_line, mls);
register_originalmail(txt, mailfilename);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", efromsender, NULL, ctrlfd);
+ "$listowner$", efromsender, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
testfrom = &fromemails;
listcontrol(testfrom, listdir, recipextra,
mlmmjsub, mlmmjunsub, mlmmjsend,
- donemailname, ctrlfd);
+ donemailname, listfd, ctrlfd);
return EXIT_SUCCESS;
}
register_unformatted(txt, "maxmailsize", maxmailsizestr);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", posteraddr, NULL, ctrlfd);
+ "$listowner$", posteraddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
free(listdelim);
register_unformatted(txt, "posteraddr", posteraddr);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", posteraddr, NULL, ctrlfd);
+ "$listowner$", posteraddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename)
close_text(txt);
free(listdelim);
register_unformatted(txt, "posteraddr", posteraddr);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", posteraddr, NULL, ctrlfd);
+ "$listowner$", posteraddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename)
close_text(txt);
free(listaddr);
register_unformatted(txt, "posteraddr", testaddr);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", testaddr, NULL, ctrlfd);
+ "$listowner$", testaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename)
close_text(txt);
free(listaddr);
}
newmoderated(listdir, mqueuename,
mlmmjsend, efrom, subject, posteraddr,
- modreason, ctrlfd);
+ modreason, listfd, ctrlfd);
return EXIT_SUCCESS;
}
static void moderate_sub(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
- const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub,
+ int listfd, int ctrlfd)
{
int i, fd, status;
text *txt;
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
queuefilename = prepstdreply(txt, listdir, "$listowner$", to, replyto,
- ctrlfd);
+ listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", subaddr, NULL, ctrlfd);
+ "$listowner$", subaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void confirm_sub(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
- const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ const char *mlmmjsend, enum subtype typesub,
+ enum subreason reasonsub, int listfd, int ctrlfd)
{
text *txt;
char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, NULL, ctrlfd);
+ "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void notify_sub(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
- const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ const char *mlmmjsend, enum subtype typesub,
+ enum subreason reasonsub, int listfd, int ctrlfd)
{
char *listfqdn, *listname, *fromaddr, *tostr;
text *txt;
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "newsub", subaddr); /* DEPRECATED */
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", "$listowner$", NULL, ctrlfd);
+ "$listowner$", "$listowner$", NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void generate_subconfirm(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
- const char *mlmmjsend, enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ const char *mlmmjsend, enum subtype typesub,
+ enum subreason reasonsub, int listfd, int ctrlfd)
{
int subconffd;
char *confirmaddr, *listname, *listfqdn, *confirmfilename = NULL;
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, confirmaddr, ctrlfd);
+ "$helpaddr$", subaddr, confirmaddr, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void generate_subscribed(const char *listdir, const char *subaddr,
const char *mlmmjsend, enum subtype typesub, const char *listaddr,
- const char *listdelim, int ctrlfd)
+ const char *listdelim, int listfd, int ctrlfd)
{
text *txt;
char *queuefilename, *fromaddr, *listname, *listfqdn;
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, NULL, ctrlfd);
+ "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
if(subbed == typesub) {
if(!nogensubscribed)
generate_subscribed(listdir, address, mlmmjsend,
- typesub, listaddr, listdelim, ctrlfd);
+ typesub, listaddr, listdelim, listfd, ctrlfd);
return EXIT_SUCCESS;
} else if(subbed != SUB_NONE) {
reasonsub = SUB_SWITCH;
if(subbed == SUB_NONE && subconfirm)
generate_subconfirm(listdir, listaddr, listdelim,
- address, mlmmjsend, typesub, reasonsub, ctrlfd);
+ address, mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
if(modstr == NULL && subbed == SUB_NONE && !force &&
statctrl(ctrlfd, "submod")) {
moderate_sub(listdir, listaddr, listdelim,
- address, mlmmjsend, typesub, reasonsub, ctrlfd);
+ address, mlmmjsend, typesub, reasonsub, listfd,
+ ctrlfd);
}
if (typesub == SUB_BOTH) {
if(childpid < 0) {
log_error(LOG_ARGS, "Could not fork; owner not notified");
confirm_sub(listdir, listaddr, listdelim, address,
- mlmmjsend, typesub, reasonsub, ctrlfd);
+ mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
}
if(childpid > 0) {
/* child confirms subscription */
if(childpid == 0)
confirm_sub(listdir, listaddr, listdelim, address,
- mlmmjsend, typesub, reasonsub, ctrlfd);
+ mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
}
notifysub = !quiet && reasonsub != SUB_SWITCH &&
/* Notify list owner about subscription */
if (notifysub)
notify_sub(listdir, listaddr, listdelim, address, mlmmjsend,
- typesub, reasonsub, ctrlfd);
+ typesub, reasonsub, listfd, ctrlfd);
free(address);
free(listaddr);
void confirm_unsub(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
const char *mlmmjsend,
- enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ enum subtype typesub, enum subreason reasonsub, int listfd,
+ int ctrlfd)
{
text *txt;
char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, NULL, ctrlfd);
+ "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void notify_unsub(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
const char *mlmmjsend,
- enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ enum subtype typesub, enum subreason reasonsub, int listfd, int ctrlfd)
{
char *listfqdn, *listname, *fromaddr, *tostr;
text *txt;
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "oldsub", subaddr); /* DEPRECATED */
queuefilename = prepstdreply(txt, listdir,
- "$listowner$", "$listowner$", NULL, ctrlfd);
+ "$listowner$", "$listowner$", NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
void generate_unsubconfirm(const char *listdir, const char *listaddr,
const char *listdelim, const char *subaddr,
const char *mlmmjsend,
- enum subtype typesub, enum subreason reasonsub, int ctrlfd)
+ enum subtype typesub, enum subreason reasonsub, int listfd, int ctrlfd)
{
char *confirmaddr, *listname, *listfqdn, *tmpstr;
text *txt;
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, confirmaddr, ctrlfd);
+ "$helpaddr$", subaddr, confirmaddr, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
static void generate_notsubscribed(const char *listdir, const char *subaddr,
const char *mlmmjsend, enum subtype typesub, const char *listaddr,
- const char *listdelim, int ctrlfd)
+ const char *listdelim, int listfd, int ctrlfd)
{
text *txt;
char *queuefilename, *fromaddr, *listname, *listfqdn;
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
queuefilename = prepstdreply(txt, listdir,
- "$helpaddr$", subaddr, NULL, ctrlfd);
+ "$helpaddr$", subaddr, NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);
/* Address is not subscribed */
if(!nogennotsubscribed) {
generate_notsubscribed(listdir, address, mlmmjsend,
- typesub, listaddr, listdelim, ctrlfd);
+ typesub, listaddr, listdelim, listfd, ctrlfd);
}
exit(EXIT_SUCCESS);
if(unsubconfirm)
generate_unsubconfirm(listdir, listaddr, listdelim, address,
- mlmmjsend, typesub, reasonsub, ctrlfd);
+ mlmmjsend, typesub, reasonsub, listfd, ctrlfd);
unsubscribe(listfd, address, typesub);
log_error(LOG_ARGS, "Could not fork");
confirm_unsub(listdir, listaddr, listdelim,
address, mlmmjsend,
- typesub, reasonsub, ctrlfd);
+ typesub, reasonsub, listfd, ctrlfd);
}
if(childpid > 0) {
if(childpid == 0)
confirm_unsub(listdir, listaddr, listdelim,
address, mlmmjsend,
- typesub, reasonsub, ctrlfd);
+ typesub, reasonsub, listfd, ctrlfd);
}
notifysub = !quiet && statctrl(ctrlfd, "notifysub");
/* Notify list owner about subscription */
if (notifysub)
notify_unsub(listdir, listaddr, listdelim, address, mlmmjsend,
- typesub, reasonsub, ctrlfd);
+ typesub, reasonsub, listfd, ctrlfd);
free(listaddr);
free(listdelim);
static void substitute_one(char **line_p, char **pos_p, int *width_p,
const char *listaddr, const char *listdelim,
- const char *listdir, text *txt)
+ int listfd, int ctrlfd, text *txt)
{
/* It is important for this function to leave the length of the
* processed portion unchanged, or increase it by just one ASCII
fqdn);
} else if(strncmp(token, "control ", 8) == 0) {
token = filename_token(token + 8);
- if (token != NULL) value = ctrlcontent(listdir, token);
+ if (token != NULL) value = ctrlcontent(ctrlfd, token);
} else if(strncmp(token, "text ", 5) == 0) {
token = filename_token(token + 5);
- if (token != NULL) value = textcontent(listdir, token);
+ if (token != NULL) value = textcontent(listfd, token);
} else if(strcmp(token, "originalmail") == 0) {
/* DEPRECATED: use %originalmail% instead */
value = xstrdup(" %originalmail 100%");
char *substitute(const char *line, const char *listaddr, const char *listdelim,
- const char *listdir, text *txt)
+ int listfd, int ctrlfd, text *txt)
{
char *new;
char *pos;
while (*pos != '\0') {
if (*pos == '$') {
substitute_one(&new, &pos, &width,
- listaddr, listdelim, listdir, txt);
+ listaddr, listdelim, listfd, ctrlfd, txt);
/* The function sets up for the next character
* to process, so continue straight away. */
continue;
char *get_processed_text_line(text *txt, int headers,
const char *listaddr, const char *listdelim,
- const char *listdir, int ctrlfd)
+ const char *listdir, int listfd, int ctrlfd)
{
char *line;
const char *item;
} else if (*pos == '$' && txt->skip == NULL) {
if (peeking) break;
substitute_one(&line, &pos, &width, listaddr,
- listdelim, listdir, txt);
+ listdelim, listfd, ctrlfd, txt);
if (len != pos - line) {
/* Cancel any break inhibition if the
* length changed (which will be
char *prepstdreply(text *txt, const char *listdir,
- const char *from, const char *to, const char *replyto, int ctrlfd)
+ const char *from, const char *to, const char *replyto, int listfd, int ctrlfd)
{
size_t len, i;
int outfd;
free(str);
}
- tmp = substitute(from, listaddr, listdelim, listdir, txt);
+ tmp = substitute(from, listaddr, listdelim, listfd, ctrlfd, txt);
headers[0] = concatstr(2, "From: ", tmp);
free(tmp);
- tmp = substitute(to, listaddr, listdelim, listdir, txt);
+ tmp = substitute(to, listaddr, listdelim, listfd, ctrlfd, txt);
headers[1] = concatstr(2, "To: ", tmp);
free(tmp);
headers[2] = genmsgid(listfqdn);
headers[7] = xstrdup("Content-Transfer-Encoding: 8bit");
if(replyto) {
- tmp = substitute(replyto, listaddr, listdelim, listdir, txt);
+ tmp = substitute(replyto, listaddr, listdelim, listfd, ctrlfd, txt);
headers[8] = concatstr(2, "Reply-To: ", tmp);
free(tmp);
}
for(;;) {
line = get_processed_text_line(txt, 1, listaddr, listdelim,
- listdir, ctrlfd);
+ listdir, listfd, ctrlfd);
if (!line) {
log_error(LOG_ARGS, "No body in listtext");
break;
if (line == NULL) {
line = get_processed_text_line(txt, 0, listaddr, listdelim,
- listdir, ctrlfd);
+ listdir, listfd, ctrlfd);
}
while(line) {
if(dprintf(outfd, "%s\n", line) < 0) {
}
free(line);
line = get_processed_text_line(txt, 0, listaddr, listdelim,
- listdir, ctrlfd);
+ listdir, listfd, ctrlfd);
}
fsync(outfd);
int send_digest(const char *listdir, int firstindex, int lastindex,
- int issue, const char *addr, const char *mlmmjsend, int ctrlfd)
+ int issue, const char *addr, const char *mlmmjsend, int listfd, int ctrlfd)
{
int i, fd, archivefd, hdrfd;
size_t len;
register_formatted(txt, "digestthreads", rewind_thread_list,
get_thread_list_line, tls);
- line = get_processed_text_line(txt, 1, listaddr, listdelim, listdir, ctrlfd);
+ line = get_processed_text_line(txt, 1, listaddr, listdelim, listdir,
+ listfd, ctrlfd);
if (line == NULL) {
log_error(LOG_ARGS, "No content in digest listtext");
/* Skip the empty line after the subject */
line = get_processed_text_line(txt, 1, listaddr, listdelim,
- listdir, ctrlfd);
+ listdir, listfd, ctrlfd);
if (line == NULL || *line != '\0') {
log_error(LOG_ARGS, "Too many headers "
"in digest listtext");
for (;;) {
line = get_processed_text_line(txt, 0, listaddr, listdelim,
- listdir, ctrlfd);
+ listdir, listfd, ctrlfd);
if (line == NULL) break;
if(dprintf(fd, "%s\n", line) < 0) {
free(line);
void send_list(const char *listdir, const char *emailaddr,
- const char *mlmmjsend, int ctrlfd)
+ const char *mlmmjsend, int ctrlfd, int listfd)
{
text *txt;
subs_list_state *normalsls, *digestsls, *nomailsls;
rewind_subs_list, get_sub, digestsls);
register_formatted(txt, "nomailsubs",
rewind_subs_list, get_sub, nomailsls);
- queuefilename = prepstdreply(txt, listdir, "$listowner$", emailaddr, NULL, ctrlfd);
+ queuefilename = prepstdreply(txt, listdir, "$listowner$", emailaddr,
+ NULL, listfd, ctrlfd);
MY_ASSERT(queuefilename);
close_text(txt);