aboutsummaryrefslogtreecommitdiffstats
path: root/sink.c
diff options
context:
space:
mode:
Diffstat (limited to 'sink.c')
-rw-r--r--sink.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/sink.c b/sink.c
index 92477ef9..afd1439e 100644
--- a/sink.c
+++ b/sink.c
@@ -258,6 +258,7 @@ static int send_bouncemail(struct query *ctl, struct msgblk *msg,
char daemon_name[15 + HOSTLEN] = "MAILER-DAEMON@";
char boundary[BUFSIZ], *bounce_to;
int sock;
+ struct idlist *ish;
static char *fqdn_of_host = NULL;
const char *md1 = "MAILER-DAEMON", *md2 = "MAILER-DAEMON@";
@@ -276,10 +277,37 @@ static int send_bouncemail(struct query *ctl, struct msgblk *msg,
lose the NDN here */
strlcat(daemon_name, fqdn_of_host, sizeof(daemon_name));
+ /* XXX FIXME: we blindly assume that any host on our smtphunt list
+ * and offers SMTP will accept our bounce; however, in global lmtp
+ * mode we'll just try localhost instead. */
/* we need only SMTP for this purpose */
- /* XXX FIXME: hardcoding localhost is nonsense if smtphost can be
- * configured */
- if ((sock = SockOpen("localhost", SMTP_PORT, NULL, &ai1)) == -1)
+ sock = -1;
+ if (ctl->smtphunt && ctl->listener == SMTP_MODE) {
+ for (ish = ctl->smtphunt ; ish; ish = ish->next) {
+ char *x = xstrdup(ish->id), *y, *port;
+
+ /* skip over LMTP entries */
+ if (x[0] == '/') {
+ free(x);
+ continue;
+ }
+
+ if ((y = strrchr(x, '/'))) {
+ *y = '\0';
+ port = y + 1;
+ } else {
+ port = SMTP_PORT;
+ }
+ sock = SockOpen(x, port, NULL, &ai1);
+ free(x);
+ if (sock != -1)
+ break;
+ }
+ } else {
+ sock = SockOpen("localhost", SMTP_PORT, NULL, &ai1);
+ }
+
+ if (sock == -1)
return(FALSE);
if (SMTP_ok(sock, SMTP_MODE) != SM_OK)