diff options
Diffstat (limited to 'usr.sbin/smtpd/bounce.c')
-rw-r--r-- | usr.sbin/smtpd/bounce.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/usr.sbin/smtpd/bounce.c b/usr.sbin/smtpd/bounce.c index f31b322ef29..c0248cfb3e7 100644 --- a/usr.sbin/smtpd/bounce.c +++ b/usr.sbin/smtpd/bounce.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bounce.c,v 1.43 2012/08/08 08:50:42 eric Exp $ */ +/* $OpenBSD: bounce.c,v 1.44 2012/08/09 09:48:02 eric Exp $ */ /* * Copyright (c) 2009 Gilles Chehade <gilles@openbsd.org> @@ -60,10 +60,6 @@ struct bounce { struct io io; }; -/* XXX remove later */ -void scheduler_envelope_update(struct envelope *); -void scheduler_envelope_delete(struct envelope *); - static void bounce_send(struct bounce *, const char *, ...); static int bounce_next(struct bounce *); static void bounce_status(struct bounce *, const char *, ...); @@ -197,9 +193,10 @@ bounce_next(struct bounce *bounce) static void bounce_status(struct bounce *bounce, const char *fmt, ...) { - va_list ap; - char *status; - int len; + va_list ap; + char *status; + int len, msg; + struct envelope *evp; /* ignore if the envelope has already been updated/deleted */ if (bounce->evp.id == 0) @@ -210,17 +207,26 @@ bounce_status(struct bounce *bounce, const char *fmt, ...) fatal("bounce: vasprintf"); va_end(ap); - if (*status == '2' || *status == '5' || *status == '6') { - log_debug("#### %s: queue_envelope_delete: %016" PRIx64, - __func__, bounce->evp.id); - queue_envelope_delete(&bounce->evp); - scheduler_envelope_delete(&bounce->evp); + if (*status == '2') + msg = IMSG_QUEUE_DELIVERY_OK; + else if (*status == '5' || *status == '6') + msg = IMSG_QUEUE_DELIVERY_PERMFAIL; + else + msg = IMSG_QUEUE_DELIVERY_TEMPFAIL; + + evp = &bounce->evp; + if (msg == IMSG_QUEUE_DELIVERY_TEMPFAIL) { + evp->retry++; + envelope_set_errormsg(evp, "%s", status); + queue_envelope_update(evp); + imsg_compose_event(env->sc_ievs[PROC_SCHEDULER], msg, 0, 0, -1, + evp, sizeof *evp); } else { - bounce->evp.retry++; - envelope_set_errormsg(&bounce->evp, "%s", status); - queue_envelope_update(&bounce->evp); - scheduler_envelope_update(&bounce->evp); + queue_envelope_delete(evp); + imsg_compose_event(env->sc_ievs[PROC_SCHEDULER], msg, 0, 0, -1, + &evp->id, sizeof evp->id); } + bounce->evp.id = 0; free(status); } @@ -234,9 +240,6 @@ bounce_free(struct bounce *bounce) iobuf_clear(&bounce->iobuf); io_clear(&bounce->io); free(bounce); - - stat_decrement(STATS_SCHEDULER); - stat_decrement(STATS_SCHEDULER_BOUNCES); } static void |