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, struct mlmmj_list *list);
-char *prepstdreply(text *txt, struct mlmmj_list *list,
- const char *from, const char *to, const char *replyto, bool infd);
-struct queuedmail *prepqstdreply(text *txt, struct mlmmj_list *list,
+struct queuedmail *prepstdreply(text *txt, struct mlmmj_list *list,
const char *from, const char *to, const char *replyto);
void close_text(text *txt);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr",
fromemails->emaillist[0]);
- q = prepqstdreply(txt, list, "$listowner$",
+ q = prepstdreply(txt, list, "$listowner$",
fromemails->emaillist[0], NULL);
MY_ASSERT(q);
close_text(txt);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr",
fromemails->emaillist[0]);
- q = prepqstdreply(txt, list, "$listowner$",
+ q = prepstdreply(txt, list, "$listowner$",
fromemails->emaillist[0], NULL);
MY_ASSERT(q);
close_text(txt);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr",
fromemails->emaillist[0]);
- q = prepqstdreply(txt, list, "$listowner$",
+ q = prepstdreply(txt, list, "$listowner$",
fromemails->emaillist[0], NULL);
MY_ASSERT(q);
close_text(txt);
fromemails->emaillist[0]);
txt = open_text(list, "help", NULL, NULL, NULL, "listhelp");
MY_ASSERT(txt);
- q = prepqstdreply(txt, list,
+ q = prepstdreply(txt, list,
"$listowner$", fromemails->emaillist[0], NULL);
MY_ASSERT(q);
close_text(txt);
fromemails->emaillist[0]);
txt = open_text(list, "faq", NULL, NULL, NULL, "listfaq");
MY_ASSERT(txt);
- q = prepqstdreply(txt, list,
+ q = prepstdreply(txt, list,
"$listowner$", fromemails->emaillist[0], NULL);
MY_ASSERT(q);
close_text(txt);
file_lines_state *fls;
char *probefile;
char *myaddr, *from, *a, *queuefilename;
+ struct queuedmail *q;
int fd;
time_t t;
fls = init_truncated_file_lines(addr, 0, ':');
register_formatted(txt, "bouncenumbers",
rewind_file_lines, get_file_line, fls);
- queuefilename = prepstdreply(txt, list, "$listowner$", myaddr, NULL, false);
- MY_ASSERT(queuefilename);
+ q = prepstdreply(txt, list, "$listowner$", myaddr, NULL);
+ MY_ASSERT(q);
close_text(txt);
finish_file_lines(fls);
free(probefile);
+ xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
execlp(mlmmjsend, mlmmjsend,
"-l", "5",
"-L", list->dir,
int fd = open(mailfilename, O_RDONLY);
register_originalmail(txt, fd);
close(fd);
- queuefilename = prepstdreply(txt, list, "$listowner$", to, replyto, false);
- MY_ASSERT(queuefilename);
+ q = prepstdreply(txt, list, "$listowner$", to, replyto);
+ MY_ASSERT(q);
close_text(txt);
/* we might need to exec more than one mlmmj-send */
myq.fd = openat(list->queuefd, myq.name, O_RDONLY);
if (send_single_mail(list, &mh, &myq))
exit(EXIT_SUCCESS);
- } else
+ } else {
+ char *queuefilename;
+ xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
execlp(mlmmjsend, mlmmjsend,
"-l", "2",
"-L", list->dir,
"-F", from,
"-m", queuefilename, (char *)NULL);
+ }
log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjsend);
exit(EXIT_FAILURE);
}
- free(queuefilename);
+ queuedmail_free(q);
/* send mail to poster that the list is moderated */
int fd2 = open(mailfilename, O_RDONLY);
register_originalmail(txt, fd2);
close(fd2);
- q = prepqstdreply(txt, list, "$listowner$", efromsender, NULL);
+ q = prepstdreply(txt, list, "$listowner$", efromsender, NULL);
MY_ASSERT(q);
close_text(txt);
if (causestr != NULL)
register_unformatted(txt, cause, causestr);
register_originalmail(txt, done->fd);
- q = prepqstdreply(txt, list, "$listowner$", posteraddr, NULL);
+ q = prepstdreply(txt, list, "$listowner$", posteraddr, NULL);
MY_ASSERT(q);
close_text(txt);
unlinkat(list->queuefd, done->name, 0);
int i, fd, status, nosubmodmails = 0;
text *txt;
memory_lines_state *mls;
- char *a = NULL, *queuefilename, *from, *str;
+ char *a = NULL, *from, *str;
char *modfilename, *mods, *to, *replyto, *moderators = NULL;
char *cookie, *obstruct;
const char *modetype;
register_unformatted(txt, "moderators", "%gatekeepers%"); /* DEPRECATED */
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
- queuefilename = prepstdreply(txt, list, "$listowner$", to, replyto, false);
- MY_ASSERT(queuefilename);
+ q = prepstdreply(txt, list, "$listowner$", to, replyto);
+ MY_ASSERT(q);
close_text(txt);
/* we might need to exec more than one mlmmj-send */
while(pid == -1 && errno == EINTR);
}
finish_memory_lines(mls);
+ char *queuefilename;
+ xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
execl(mlmmjsend, mlmmjsend,
"-a",
"-l", "4",
free(to);
free(replyto);
-
+ queuedmail_free(q);
/* send mail to requester that the list is submod'ed */
xasprintf(&from, "%s%sbounces-help@%s", list->name, list->delim,
register_unformatted(txt, "moderators", "%gatekeepers"); /* DEPRECATED */
register_formatted(txt, "gatekeepers",
rewind_memory_lines, get_memory_line, mls);
- q = prepqstdreply(txt, list, "$listowner$", subaddr, NULL);
- MY_ASSERT(queuefilename);
+ q = prepstdreply(txt, list, "$listowner$", subaddr, NULL);
+ MY_ASSERT(q);
close_text(txt);
finish_memory_lines(mls);
free(listtext);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
MY_ASSERT(q);
close_text(txt);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "newsub", subaddr); /* DEPRECATED */
- q = prepqstdreply(txt, list, "$listowner$", "$listowner$", NULL);
+ q = prepstdreply(txt, list, "$listowner$", "$listowner$", NULL);
MY_ASSERT(q);
close_text(txt);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
MY_ASSERT(q);
close_text(txt);
struct mail_headers mh;
"sub-subscribed");
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
MY_ASSERT(q);
close_text(txt);
free(listtext);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
MY_ASSERT(q);
close_text(txt);
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "oldsub", subaddr); /* DEPRECATED */
- q = prepqstdreply(txt, list, "$listowner$", "$listowner$", NULL);
+ q = prepstdreply(txt, list, "$listowner$", "$listowner$", NULL);
MY_ASSERT(q);
close_text(txt);
register_unformatted(txt, "subaddr", subaddr);
register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
register_unformatted(txt, "confirmaddr", confirmaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
MY_ASSERT(q);
close_text(txt);
"unsub-notsubscribed");
MY_ASSERT(txt);
register_unformatted(txt, "subaddr", subaddr);
- q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+ q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
MY_ASSERT(q);
close_text(txt);
free(txt);
}
-
-char *prepstdreply(text *txt, struct mlmmj_list *list,
- const char *from, const char *to,
- const char *replyto, bool infd)
-{
- size_t len, i;
- int outfd;
- char *tmp;
- char *retstr = NULL;
- char *line;
- char *str;
- char *headers[10] = { NULL }; /* relies on NULL to flag end */
-
- do {
- if (infd) {
- if (list->queuefd == -1)
- list->queuefd = openat(list->fd, "queue", O_DIRECTORY);
- free(retstr);
- retstr = random_str();
- outfd = openat(list->queuefd, retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
- } else {
- tmp = random_str();
- free(retstr);
- retstr = concatstr(3, list->dir, "/queue/", tmp);
- free(tmp);
- outfd = open(retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
- }
- } while ((outfd < 0) && (errno == EEXIST));
-
- if(outfd < 0) {
- log_error(LOG_ARGS, "Could not open std mail %s", retstr);
- free(retstr);
- free(txt);
- return NULL;
- }
-
- for (i=0; i<6; i++) {
- tmp = xstrdup("randomN");
- tmp[6] = '0' + i;
- str = random_str();
- register_unformatted(txt, tmp, str);
- free(tmp);
- free(str);
- }
-
- tmp = substitute(from, list, txt);
- xasprintf(&headers[0], "From: %s", tmp);
- free(tmp);
- tmp = substitute(to, list, txt);
- xasprintf(&headers[1], "To: %s", tmp);
- free(tmp);
- headers[2] = genmsgid(list->fqdn);
- chomp(headers[2]);
- headers[3] = gendatestr();
- chomp(headers[3]);
- headers[4] = xstrdup("Subject: mlmmj administrivia");
- headers[5] = xstrdup("MIME-Version: 1.0");
- headers[6] = xstrdup("Content-Type: text/plain; charset=utf-8");
- headers[7] = xstrdup("Content-Transfer-Encoding: 8bit");
-
- if(replyto) {
- tmp = substitute(replyto, list, txt);
- xasprintf(&headers[8], "Reply-To: %s", tmp);
- free(tmp);
- }
-
- for(;;) {
- line = get_processed_text_line(txt, 1, list);
- if (!line) {
- log_error(LOG_ARGS, "No body in listtext");
- break;
- }
- if (*line == '\0') {
- /* end of headers */
- free(line);
- line = NULL;
- break;
- }
- if (*line == ' ' || *line == '\t') {
- /* line beginning with linear whitespace is a
- continuation of previous header line */
- if(dprintf(outfd, "%s\n", line) < 0) {
- log_error(LOG_ARGS, "Could not write std mail");
- free(line);
- free(retstr);
- retstr = NULL;
- goto freeandreturn;
- }
- } else {
- tmp = line;
- len = 0;
- while (*tmp && *tmp != ':') {
- tmp++;
- len++;
- }
- if (!*tmp) {
- log_error(LOG_ARGS, "No headers or invalid "
- "header in listtext");
- break;
- }
- tmp++;
- len++;
- /* remove the standard header if one matches */
- for (i=0; headers[i] != NULL; i++) {
- if (strncasecmp(line, headers[i], len) == 0) {
- free(headers[i]);
- while (headers[i] != NULL) {
- headers[i] = headers[i+1];
- i++;
- }
- break;
- }
- }
- if (strncasecmp(line, "Subject:", len) == 0) {
- tmp = unistr_utf8_to_header(tmp);
- free(line);
- xasprintf(&line, "Subject: %s", tmp);
- free(tmp);
- }
- if(dprintf(outfd, "%s\n", line) < 0) {
- log_error(LOG_ARGS, "Could not write std mail");
- free(line);
- free(retstr);
- retstr = NULL;
- goto freeandreturn;
- }
- }
- free(line);
- line = NULL;
- }
-
- for (i=0; headers[i] != NULL; i++) {
- if(dprintf(outfd, "%s\n", headers[i]) < 0) {
- log_error(LOG_ARGS, "Could not write std mail");
- if (line)
- free(line);
- free(retstr);
- retstr = NULL;
- goto freeandreturn;
- }
- }
-
- /* end the headers */
- if(dprintf(outfd, "\n") < 0) {
- log_error(LOG_ARGS, "Could not write std mail");
- if (line)
- free(line);
- free(retstr);
- retstr = NULL;
- goto freeandreturn;
- }
-
- if (line == NULL) {
- line = get_processed_text_line(txt, 0, list);
- }
- while(line) {
- if(dprintf(outfd, "%s\n", line) < 0) {
- free(str);
- log_error(LOG_ARGS, "Could not write std mail");
- free(retstr);
- retstr = NULL;
- goto freeandreturn;
- }
- free(line);
- line = get_processed_text_line(txt, 0, list);
- }
-
- fsync(outfd);
- close(outfd);
-
-freeandreturn:
- return retstr;
-}
-
-struct queuedmail *prepqstdreply(text *txt, struct mlmmj_list *list,
+struct queuedmail *prepstdreply(text *txt, struct mlmmj_list *list,
const char *from, const char *to,
const char *replyto)
{
rewind_subs_list, get_sub, digestsls);
register_formatted(txt, "nomailsubs",
rewind_subs_list, get_sub, nomailsls);
- q = prepqstdreply(txt, list, "$listowner$", emailaddr, NULL);
+ q = prepstdreply(txt, list, "$listowner$", emailaddr, NULL);
MY_ASSERT(q);
close_text(txt);
text *txt = open_text(&list, "finish", "sub", "request", "normal", "sub-confirm");
ATF_CHECK(txt != NULL);
register_unformatted(txt, "subaddr", "john@doe.net");
- struct queuedmail *q = prepqstdreply(txt, &list, "$helpaddr$", "john@doe.net", NULL);
+ struct queuedmail *q = prepstdreply(txt, &list, "$helpaddr$", "john@doe.net", NULL);
xasprintf(&qname, "%s/queue/%s", list.dir, q->name);
if (!atf_utils_grep_file("^To: john@doe.net", qname) ||
!atf_utils_grep_file("^The email address .*john@doe.net.*", qname) ||