dma: constify bounce reason and avoid strdup
authorSimon Schubert <simon.schubert@epfl.ch>
Thu, 9 Jul 2009 20:21:26 +0000 (22:21 +0200)
committerSimon Schubert <corecode@dragonflybsd.org>
Thu, 16 Jul 2009 14:13:06 +0000 (16:13 +0200)
We don't need to care about freeing the bounce reason string, because
bounce is only called once.  Convert all bounce reason strings to
const char * and avoid calling strdup() on them.  Dynamic strings from
asprintf() need some de-const massaging.

libexec/dma/dma.c
libexec/dma/dma.h
libexec/dma/net.c

index f9d1eb6..9ca7f99 100644 (file)
@@ -527,7 +527,7 @@ go_background(struct queue *queue)
 }
 
 static void
-bounce(struct qitem *it, char *reason)
+bounce(struct qitem *it, const char *reason)
 {
        struct queue bounceq;
        struct qitem *bit;
@@ -587,7 +587,6 @@ There was an error delivering your mail to <%s>.\n\
                reason,
                config->features & FULLBOUNCE? "Original message follows.":
                "Message headers follow.");
-       free(reason);
        if (error < 0)
                goto fail;
        if (fflush(bit->queuef) != 0)
@@ -630,7 +629,7 @@ fail:
 }
 
 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];
@@ -678,7 +677,7 @@ deliver_local(struct qitem *it, char **errmsg)
                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;
                }
@@ -715,7 +714,7 @@ deliver(struct qitem *it)
 {
        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;
 
@@ -746,7 +745,7 @@ retry:
                }
                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;
index 49a2ae6..9128f37 100644 (file)
@@ -165,7 +165,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 *, char **);
+extern int deliver_remote(struct qitem *, const char **);
 
 /* base64.c */
 extern int base64_encode(const void *, int, char **);
index 60db670..7657404 100644 (file)
@@ -314,17 +314,19 @@ open_connection(struct qitem *it, const char *host)
 }
 
 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 {
@@ -373,7 +375,7 @@ deliver_remote(struct qitem *it, 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",
+                       asprintf(errmsgc, "%s did not like our EHLO:\n%s",
                            host, neterr);
                        return (-1);
                }
@@ -384,7 +386,7 @@ deliver_remote(struct qitem *it, 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",
+                       asprintf(errmsgc, "%s did not like our EHLO:\n%s",
                            host, neterr);
                        return (-1);
                }
@@ -412,7 +414,7 @@ deliver_remote(struct qitem *it, 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);
+                       asprintf(errmsgc, "SMTP login to %s failed", host);
                        return (-1);
                }
                /* SMTP login is not available, so try without */
@@ -426,7 +428,7 @@ deliver_remote(struct qitem *it, 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", \
+               asprintf(errmsgc, "%s did not like our " c ":\n%s", \
                    host, neterr); \
                return (-1); \
        } else if (res != exp) { \
@@ -457,7 +459,7 @@ deliver_remote(struct qitem *it, char **errmsg)
                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;
                }