char *listaddr, *listdelim, *tmp, *retstr = NULL;
char *listfqdn, *line, *utfline, *utfsub, *utfsub2;
char *str = NULL;
+ char **moredata;
char *headers[10] = { NULL }; /* relies on NULL to flag end */
if ((infd = open_listtext(listdir, filename)) < 0) {
do {
tmp = random_str();
- myfree(retstr);
+ if (retstr)
+ myfree(retstr);
retstr = concatstr(3, listdir, "/queue/", tmp);
myfree(tmp);
myfree(listaddr);
myfree(listdelim);
myfree(listfqdn);
+ myfree(retstr);
return NULL;
}
+ moredata = mymalloc(2*(tokencount+6) * sizeof(char *));
+ for (i=0; i<2*tokencount; i++) {
+ moredata[i] = data[i];
+ }
+ for (i=0; i<6; i++) {
+ moredata[2*(tokencount+i)] = mystrdup("randomN");
+ moredata[2*(tokencount+i)][6] = '0' + i;
+ moredata[2*(tokencount+i)+1] = random_str();
+ }
+ tokencount += 6;
+
tmp = substitute(from, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
headers[0] = concatstr(2, "From: ", tmp);
myfree(tmp);
tmp = substitute(to, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
headers[1] = concatstr(2, "To: ", tmp);
myfree(tmp);
headers[2] = genmsgid(listfqdn);
if(replyto) {
tmp = substitute(replyto, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
headers[8] = concatstr(2, "Reply-To: ", tmp);
myfree(tmp);
}
continuation of previous header line */
utfsub = unistr_escaped_to_utf8(line);
str = substitute(utfsub, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
myfree(utfsub);
len = strlen(str);
str[len] = '\n';
log_error(LOG_ARGS, "Could not write std mail");
myfree(str);
myfree(line);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
myfree(str);
} else {
utfsub = unistr_escaped_to_utf8(tmp);
*tmp = '\0';
utfsub2 = substitute(utfsub, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
myfree(utfsub);
if (strncasecmp(line, "Subject:", len) == 0) {
tmp = unistr_utf8_to_header(utfsub2);
log_error(LOG_ARGS, "Could not write std mail");
myfree(str);
myfree(line);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
myfree(str);
}
if (line)
myfree(line);
myfree(str);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
}
myfree(str);
if (line)
myfree(line);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
if (line) {
if(writen(outfd,str,strlen(str)) < 0) {
myfree(str);
myfree(utfline);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
log_error(LOG_ARGS, "Could not write std mail");
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
myfree(str);
i++;
myfree(utfline);
} else {
str = substitute(utfline, listaddr, listdelim,
- tokencount, data);
+ tokencount, moredata);
myfree(utfline);
if(writen(outfd, str, strlen(str)) < 0) {
myfree(str);
- myfree(listaddr);
- myfree(listdelim);
- myfree(listfqdn);
log_error(LOG_ARGS, "Could not write std mail");
- return NULL;
+ myfree(retstr);
+ retstr = NULL;
+ goto freeandreturn;
}
myfree(str);
}
fsync(outfd);
close(outfd);
+freeandreturn:
myfree(listaddr);
myfree(listdelim);
myfree(listfqdn);
+ for (i=tokencount-6; i<tokencount; i++) {
+ myfree(moredata[2*i]);
+ myfree(moredata[2*i+1]);
+ }
+ myfree(moredata);
+
return retstr;
}