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>
libexec/dma/dma.c
libexec/dma/dma.h
libexec/dma/net.c

index 6599635..a9a3164 100644 (file)
@@ -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);
index 4f75453..581bf8e 100644 (file)
@@ -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 **);
index 11ac4eb..60db670 100644 (file)
@@ -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;
                }