}
static void
-bounce(struct qitem *it, char *reason)
+bounce(struct qitem *it, const char *reason)
{
struct queue bounceq;
struct qitem *bit;
reason,
config->features & FULLBOUNCE? "Original message follows.":
"Message headers follow.");
- free(reason);
if (error < 0)
goto fail;
if (fflush(bit->queuef) != 0)
}
static int
-deliver_local(struct qitem *it, char **errmsg)
+deliver_local(struct qitem *it, const char **errmsg)
{
char fn[PATH_MAX+1];
char line[1000];
if (linelen == 0 || line[linelen - 1] != '\n') {
syslog(LOG_CRIT, "%s: local delivery failed: corrupted queue file",
it->queueid);
- *errmsg = strdup("corrupted queue file");
+ *errmsg = "corrupted queue file";
error = -1;
goto chop;
}
{
int error;
unsigned int backoff = MIN_RETRY;
- char *errmsg = strdup("unknown bounce reason");
+ const char *errmsg = "unknown bounce reason";
struct timeval now;
struct stat st;
}
if (gettimeofday(&now, NULL) == 0 &&
(now.tv_sec - st.st_mtimespec.tv_sec > MAX_TIMEOUT)) {
- asprintf(&errmsg,
+ asprintf(__DECONST(void *, &errmsg),
"Could not deliver for the last %d seconds. Giving up.",
MAX_TIMEOUT);
goto bounce;
}
int
-deliver_remote(struct qitem *it, char **errmsg)
+deliver_remote(struct qitem *it, const char **errmsg)
{
struct authuser *a;
char *host, line[1000];
int fd, error = 0, do_auth = 0, res = 0;
size_t linelen;
+ /* asprintf can't take const */
+ void *errmsgc = __DECONST(char **, errmsg);
host = strrchr(it->addr, '@');
/* Should not happen */
if (host == NULL) {
- asprintf(errmsg, "Internal error: badly formed address %s",
+ asprintf(errmsgc, "Internal error: badly formed address %s",
it->addr);
return(-1);
} else {
if (read_remote(fd, 0, NULL) != 2) {
syslog(LOG_ERR, "%s: remote delivery deferred: "
" EHLO failed: %s", it->queueid, neterr);
- asprintf(errmsg, "%s did not like our EHLO:\n%s",
+ asprintf(errmsgc, "%s did not like our EHLO:\n%s",
host, neterr);
return (-1);
}
if (read_remote(fd, 0, NULL) != 2) {
syslog(LOG_ERR, "%s: remote delivery deferred: "
" EHLO failed: %s", it->queueid, neterr);
- asprintf(errmsg, "%s did not like our EHLO:\n%s",
+ asprintf(errmsgc, "%s did not like our EHLO:\n%s",
host, neterr);
return (-1);
}
if (error < 0) {
syslog(LOG_ERR, "%s: remote delivery failed:"
" SMTP login failed: %m", it->queueid);
- asprintf(errmsg, "SMTP login to %s failed", host);
+ asprintf(errmsgc, "SMTP login to %s failed", host);
return (-1);
}
/* SMTP login is not available, so try without */
if (res == 5) { \
syslog(LOG_ERR, "%s: remote delivery failed: " \
c " failed: %s", it->queueid, neterr); \
- asprintf(errmsg, "%s did not like our " c ":\n%s", \
+ asprintf(errmsgc, "%s did not like our " c ":\n%s", \
host, neterr); \
return (-1); \
} else if (res != exp) { \
if (linelen == 0 || line[linelen - 1] != '\n') {
syslog(LOG_CRIT, "%s: remote delivery failed:"
"corrupted queue file", it->queueid);
- *errmsg = strdup("corrupted queue file");
+ *errmsg = "corrupted queue file";
error = -1;
goto out;
}