#ifndef PREPSTDREPLY_H
#define PREPSTDREPLY_H
+#include <stdbool.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 *listaddr, const char *listdelim, 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);
char *prepstdreply(text *txt, const char *listdir,
const char *from, const char *to, const char *replyto, int listfd, int ctrlfd);
void close_text(text *txt);
free(txt);
}
-
-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, const char *listdir, const char *from, const char *to,
+ const char *replyto, int listfd, int ctrlfd, int tofd)
{
- size_t len, i;
- int outfd;
- char *listaddr, *listdelim, *tmp, *retstr = NULL;
- char *listfqdn, *line;
- char *str;
+ bool ret = false;
+ char *tmp, *line;
+ int i;
+ size_t len;
+ char *listaddr, *listdelim, *listfqdn, *str;
char *headers[10] = { NULL }; /* relies on NULL to flag end */
listaddr = getlistaddr(ctrlfd);
listdelim = getlistdelim(ctrlfd);
listfqdn = genlistfqdn(listaddr);
- do {
- tmp = random_str();
- if (retstr)
- free(retstr);
- retstr = concatstr(3, listdir, "/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(listaddr);
- free(listdelim);
- free(listfqdn);
- free(retstr);
- free(txt);
- return NULL;
- }
-
for (i=0; i<6; i++) {
tmp = xstrdup("randomN");
tmp[6] = '0' + i;
if (*line == ' ' || *line == '\t') {
/* line beginning with linear whitespace is a
continuation of previous header line */
- if(dprintf(outfd, "%s\n", line) < 0) {
+ if(dprintf(tofd, "%s\n", line) < 0) {
log_error(LOG_ARGS, "Could not write std mail");
free(line);
- free(retstr);
- retstr = NULL;
goto freeandreturn;
}
} else {
line = concatstr(2, "Subject: ", tmp);
free(tmp);
}
- if(dprintf(outfd, "%s\n", line) < 0) {
+ if(dprintf(tofd, "%s\n", line) < 0) {
log_error(LOG_ARGS, "Could not write std mail");
free(line);
- free(retstr);
- retstr = NULL;
goto freeandreturn;
}
}
}
for (i=0; headers[i] != NULL; i++) {
- if(dprintf(outfd, "%s\n", headers[i]) < 0) {
+ if(dprintf(tofd, "%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) {
+ if(dprintf(tofd, "\n") < 0) {
log_error(LOG_ARGS, "Could not write std mail");
if (line)
free(line);
- free(retstr);
- retstr = NULL;
goto freeandreturn;
}
listdir, listfd, ctrlfd);
}
while(line) {
- if(dprintf(outfd, "%s\n", line) < 0) {
+ if(dprintf(tofd, "%s\n", line) < 0) {
free(str);
log_error(LOG_ARGS, "Could not write std mail");
- free(retstr);
- retstr = NULL;
goto freeandreturn;
}
free(line);
listdir, listfd, ctrlfd);
}
- fsync(outfd);
- close(outfd);
+ fsync(tofd);
+ close(tofd);
+
+ ret = true;
freeandreturn:
free(listaddr);
free(listdelim);
free(listfqdn);
- return retstr;
+ return ret;
+}
+
+char *prepstdreply(text *txt, const char *listdir,
+ const char *from, const char *to, const char *replyto, int listfd, int ctrlfd)
+{
+ int outfd;
+ char *tmp, *retstr = NULL;
+
+
+ do {
+ tmp = random_str();
+ if (retstr)
+ free(retstr);
+ retstr = concatstr(3, listdir, "/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;
+ }
+ if (!prepstdreply_to(txt, listdir, from, to, replyto, listfd, ctrlfd, outfd))
+ return (NULL);
+ return (retstr);
}