From 39f7c85a4d09b236583a62985312b8fbf222f8b9 Mon Sep 17 00:00:00 2001 From: Simon Schubert Date: Thu, 9 Jul 2009 21:15:54 +0200 Subject: [PATCH] dma: provide proper bounce error message This may not be the best solution - the error message buffer has now turned dynamic, but the only alternative I see is to make it a static array in net.c... and I'm not quite sure if I want to do that just now. Submitted-by: Peter Pentchev --- libexec/dma/dma.c | 16 +++++++--------- libexec/dma/dma.h | 2 +- libexec/dma/net.c | 18 ++++++++++++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/libexec/dma/dma.c b/libexec/dma/dma.c index 659963563e..a9a316444d 100644 --- a/libexec/dma/dma.c +++ b/libexec/dma/dma.c @@ -458,7 +458,7 @@ go_background(struct queue *queue) } static void -bounce(struct qitem *it, const char *reason) +bounce(struct qitem *it, char *reason) { struct queue bounceq; struct qitem *bit; @@ -515,6 +515,7 @@ Message headers follow.\n\ VERSION, hostname(), it->addr, reason); + free(reason); if (error < 0) goto fail; if (fflush(bit->queuef) != 0) @@ -550,7 +551,7 @@ fail: } static int -deliver_local(struct qitem *it, const char **errmsg) +deliver_local(struct qitem *it, char **errmsg) { char fn[PATH_MAX+1]; char line[1000]; @@ -598,7 +599,7 @@ deliver_local(struct qitem *it, const char **errmsg) if (linelen == 0 || line[linelen - 1] != '\n') { syslog(LOG_CRIT, "%s: local delivery failed: corrupted queue file", it->queueid); - *errmsg = "corrupted queue file"; + *errmsg = strdup("corrupted queue file"); error = -1; goto chop; } @@ -635,7 +636,7 @@ deliver(struct qitem *it) { int error; unsigned int backoff = MIN_RETRY; - const char *errmsg = "unknown bounce reason"; + char *errmsg = strdup("unknown bounce reason"); struct timeval now; struct stat st; @@ -666,12 +667,9 @@ retry: } if (gettimeofday(&now, NULL) == 0 && (now.tv_sec - st.st_mtimespec.tv_sec > MAX_TIMEOUT)) { - char *msg; - - if (asprintf(&msg, + asprintf(&errmsg, "Could not deliver for the last %d seconds. Giving up.", - MAX_TIMEOUT) > 0) - errmsg = msg; + MAX_TIMEOUT); goto bounce; } sleep(backoff); diff --git a/libexec/dma/dma.h b/libexec/dma/dma.h index 4f754536ab..581bf8e8a1 100644 --- a/libexec/dma/dma.h +++ b/libexec/dma/dma.h @@ -162,7 +162,7 @@ extern int smtp_init_crypto(struct qitem *, int, int); /* net.c */ extern int read_remote(int, int, char *); extern ssize_t send_remote_command(int, const char*, ...); -extern int deliver_remote(struct qitem *, const char **); +extern int deliver_remote(struct qitem *, char **); /* base64.c */ extern int base64_encode(const void *, int, char **); diff --git a/libexec/dma/net.c b/libexec/dma/net.c index 11ac4eb010..60db6705ad 100644 --- a/libexec/dma/net.c +++ b/libexec/dma/net.c @@ -314,7 +314,7 @@ open_connection(struct qitem *it, const char *host) } int -deliver_remote(struct qitem *it, const char **errmsg) +deliver_remote(struct qitem *it, char **errmsg) { struct authuser *a; char *host, line[1000]; @@ -323,11 +323,14 @@ deliver_remote(struct qitem *it, const char **errmsg) host = strrchr(it->addr, '@'); /* Should not happen */ - if (host == NULL) + if (host == NULL) { + asprintf(errmsg, "Internal error: badly formed address %s", + it->addr); return(-1); - else + } else { /* Step over the @ */ host++; + } /* Smarthost support? */ if (config->smarthost != NULL && strlen(config->smarthost) > 0) { @@ -370,6 +373,8 @@ deliver_remote(struct qitem *it, const char **errmsg) 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", + host, neterr); return (-1); } } @@ -379,6 +384,8 @@ deliver_remote(struct qitem *it, const char **errmsg) 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", + host, neterr); return (-1); } } @@ -405,6 +412,7 @@ deliver_remote(struct qitem *it, const char **errmsg) if (error < 0) { syslog(LOG_ERR, "%s: remote delivery failed:" " SMTP login failed: %m", it->queueid); + asprintf(errmsg, "SMTP login to %s failed", host); return (-1); } /* SMTP login is not available, so try without */ @@ -418,6 +426,8 @@ deliver_remote(struct qitem *it, const char **errmsg) 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", \ + host, neterr); \ return (-1); \ } else if (res != exp) { \ syslog(LOG_ERR, "%s: remote delivery deferred: " \ @@ -447,7 +457,7 @@ deliver_remote(struct qitem *it, const char **errmsg) if (linelen == 0 || line[linelen - 1] != '\n') { syslog(LOG_CRIT, "%s: remote delivery failed:" "corrupted queue file", it->queueid); - *errmsg = "corrupted queue file"; + *errmsg = strdup("corrupted queue file"); error = -1; goto out; } -- 2.41.0