From: Simon Schubert Date: Thu, 9 Jul 2009 20:21:26 +0000 (+0200) Subject: dma: constify bounce reason and avoid strdup X-Git-Url: https://gitweb.dragonflybsd.org/~corecode/dragonfly.git/commitdiff_plain/5868e44cd9813b03695780d059f28ae46cd29f8c dma: constify bounce reason and avoid strdup 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. --- diff --git a/libexec/dma/dma.c b/libexec/dma/dma.c index f9d1eb6ba0..9ca7f990e3 100644 --- a/libexec/dma/dma.c +++ b/libexec/dma/dma.c @@ -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; diff --git a/libexec/dma/dma.h b/libexec/dma/dma.h index 49a2ae6b33..9128f37650 100644 --- a/libexec/dma/dma.h +++ b/libexec/dma/dma.h @@ -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 **); diff --git a/libexec/dma/net.c b/libexec/dma/net.c index 60db6705ad..7657404351 100644 --- a/libexec/dma/net.c +++ b/libexec/dma/net.c @@ -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; }