From: Baptiste Daroussin Date: Wed, 5 Jan 2022 10:22:04 +0000 (+0100) Subject: prepstdreply: eliminate the temporary prepqstdreply X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Frefactor;p=thirdparty%2Fmlmmj.git prepstdreply: eliminate the temporary prepqstdreply now every consumer have been converted to handle files relative to the list directory --- diff --git a/include/prepstdreply.h b/include/prepstdreply.h index 4f58c2e6..fa9d0e7a 100644 --- a/include/prepstdreply.h +++ b/include/prepstdreply.h @@ -62,9 +62,7 @@ void register_originalmail(text *txt, int fd); 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); diff --git a/src/listcontrol.c b/src/listcontrol.c index d5936def..9b7cdd1d 100644 --- a/src/listcontrol.c +++ b/src/listcontrol.c @@ -225,7 +225,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list, 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); @@ -272,7 +272,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list, 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); @@ -319,7 +319,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list, 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); @@ -795,7 +795,7 @@ permit: 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); @@ -816,7 +816,7 @@ permit: 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); diff --git a/src/mlmmj-bounce.c b/src/mlmmj-bounce.c index b0f8e52e..791feeb8 100644 --- a/src/mlmmj-bounce.c +++ b/src/mlmmj-bounce.c @@ -53,6 +53,7 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char file_lines_state *fls; char *probefile; char *myaddr, *from, *a, *queuefilename; + struct queuedmail *q; int fd; time_t t; @@ -76,8 +77,8 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char 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); @@ -98,6 +99,7 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char free(probefile); + xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name); execlp(mlmmjsend, mlmmjsend, "-l", "5", "-L", list->dir, diff --git a/src/mlmmj-process.c b/src/mlmmj-process.c index de41f5c7..ef475556 100644 --- a/src/mlmmj-process.c +++ b/src/mlmmj-process.c @@ -173,8 +173,8 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename, 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 */ @@ -206,17 +206,20 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename, 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 */ @@ -231,7 +234,7 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename, 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); @@ -458,7 +461,7 @@ send_denymail(struct mlmmj_list *list, const char *cause, const char *subcause, 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); diff --git a/src/mlmmj-sub.c b/src/mlmmj-sub.c index 059c25e5..16c86823 100644 --- a/src/mlmmj-sub.c +++ b/src/mlmmj-sub.c @@ -55,7 +55,7 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr, 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; @@ -156,8 +156,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr, 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 */ @@ -179,6 +179,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr, 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", @@ -193,7 +195,7 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr, 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, @@ -208,8 +210,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr, 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); @@ -314,7 +316,7 @@ static void confirm_sub(struct mlmmj_list *list, const char *subaddr, 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); @@ -363,7 +365,7 @@ static void notify_sub(struct mlmmj_list *list, const char *subaddr, 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); @@ -454,7 +456,7 @@ static void generate_subconfirm(struct mlmmj_list *list, const char *subaddr, 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; @@ -504,7 +506,7 @@ static void generate_subscribed(struct mlmmj_list *list, const char *subaddr, "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); diff --git a/src/mlmmj-unsub.c b/src/mlmmj-unsub.c index 20516861..b7b5bf1c 100644 --- a/src/mlmmj-unsub.c +++ b/src/mlmmj-unsub.c @@ -68,7 +68,7 @@ static void confirm_unsub(struct mlmmj_list *list, const char *subaddr, 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); @@ -112,7 +112,7 @@ static void notify_unsub(struct mlmmj_list *list, const char *subaddr, 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); @@ -196,7 +196,7 @@ static void generate_unsubconfirm(struct mlmmj_list *list, const char *subaddr, 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); @@ -247,7 +247,7 @@ static void generate_notsubscribed(struct mlmmj_list *list, const char *subaddr, "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); diff --git a/src/prepstdreply.c b/src/prepstdreply.c index 2c76bd18..ec2c5579 100644 --- a/src/prepstdreply.c +++ b/src/prepstdreply.c @@ -1580,181 +1580,7 @@ void close_text(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) { diff --git a/src/send_list.c b/src/send_list.c index 31585274..9d08af2a 100644 --- a/src/send_list.c +++ b/src/send_list.c @@ -185,7 +185,7 @@ void send_list(struct mlmmj_list *list, const char *emailaddr) 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); diff --git a/tests/mlmmj.c b/tests/mlmmj.c index a2d6710a..b69bbc63 100644 --- a/tests/mlmmj.c +++ b/tests/mlmmj.c @@ -260,7 +260,7 @@ ATF_TC_BODY(open_text, tc) 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) ||