From: Simon Schubert Date: Thu, 9 Jul 2009 19:15:54 +0000 (+0200) Subject: dma: provide proper bounce error message X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a43346d54aa1ce1efe15b9e05526e92cd6dc7064;p=people%2Fms%2Fdma.git 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 --- diff --git a/dma.c b/dma.c index 6599635..a9a3164 100644 --- a/dma.c +++ b/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/dma.h b/dma.h index 4f75453..581bf8e 100644 --- a/dma.h +++ b/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/net.c b/net.c index 11ac4eb..60db670 100644 --- a/net.c +++ b/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; }