]> git.ipfire.org Git - people/ms/dma.git/commitdiff
dma: provide proper bounce error message
authorSimon Schubert <simon.schubert@epfl.ch>
Thu, 9 Jul 2009 19:15:54 +0000 (21:15 +0200)
committerSimon Schubert <corecode@dragonflybsd.org>
Thu, 16 Jul 2009 14:13:05 +0000 (16:13 +0200)
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 <roam@ringlet.net>
dma.c
dma.h
net.c

diff --git a/dma.c b/dma.c
index 659963563e21b7feec69bbd0bb5772dbbba4d9f3..a9a316444dc05dfa2bc3170f14792daed512f7ed 100644 (file)
--- 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 4f754536ab7600a7f75dc2861091dcfa83ab07c0..581bf8e8a1c3f17e70d1f45b00c35df7bf857d53 100644 (file)
--- 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 11ac4eb010ec779490e71c4cd3aa852ca1cb2b72..60db6705adf1067eab50f3bbcad7e3125073661e 100644 (file)
--- 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;
                }