summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/src/acl.c7
-rw-r--r--src/src/deliver.c12
-rw-r--r--src/src/functions.h1
-rw-r--r--src/src/transports/smtp.c10
4 files changed, 26 insertions, 4 deletions
diff --git a/src/src/acl.c b/src/src/acl.c
index 064ee6ccb..911ecfed2 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -3743,7 +3743,12 @@ for (; cb != NULL; cb = cb->next)
case ACLC_SET:
{
int old_pool = store_pool;
- if (cb->u.varname[0] == 'c') store_pool = POOL_PERM;
+ if ( cb->u.varname[0] == 'c'
+#ifdef EXPERIMENTAL_EVENT
+ || event_name /* An event is being delivered */
+#endif
+ )
+ store_pool = POOL_PERM;
acl_var_create(cb->u.varname)->data.ptr = string_copy(arg);
store_pool = old_pool;
}
diff --git a/src/src/deliver.c b/src/src/deliver.c
index e1f4e0e29..65f148c07 100644
--- a/src/src/deliver.c
+++ b/src/src/deliver.c
@@ -785,12 +785,14 @@ if (action)
return NULL;
}
-static void
+void
msg_event_raise(const uschar * event, const address_item * addr)
{
const uschar * save_domain = deliver_domain;
uschar * save_local = deliver_localpart;
const uschar * save_host = deliver_host;
+const uschar * save_address = deliver_host_address;
+const int save_port = deliver_host_port;
if (!addr->transport)
return;
@@ -802,9 +804,13 @@ deliver_localpart = addr->local_part;
deliver_host = addr->host_used ? addr->host_used->name : NULL;
(void) event_raise(addr->transport->event_action, event,
- addr->host_used || Ustrcmp(addr->transport->driver_name, "lmtp") == 0
- ? addr->message : NULL);
+ addr->host_used
+ || Ustrcmp(addr->transport->driver_name, "smtp") == 0
+ || Ustrcmp(addr->transport->driver_name, "lmtp") == 0
+ ? addr->message : NULL);
+deliver_host_port = save_port;
+deliver_host_address = save_address;
deliver_host = save_host;
deliver_localpart = save_local;
deliver_domain = save_domain;
diff --git a/src/src/functions.h b/src/src/functions.h
index 6f6c643b8..e9f7ab658 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -166,6 +166,7 @@ extern void enq_end(uschar *);
extern BOOL enq_start(uschar *, unsigned);
#ifdef EXPERIMENTAL_EVENT
extern uschar *event_raise(uschar *, const uschar *, uschar *);
+extern void msg_event_raise(const uschar *, const address_item *);
#endif
extern void exim_exit(int);
extern void exim_nullstd(void);
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 59afe42aa..66d632fad 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -919,12 +919,22 @@ while (count-- > 0)
addr->basic_errno = ERRNO_RCPT4XX;
addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+#ifdef EXPERIMENTAL_EVENT
+ event_defer_errno = addr->more_errno;
+ msg_event_raise(US"msg:rcpt:host:defer", addr);
+#endif
+
/* Log temporary errors if there are more hosts to be tried.
If not, log this last one in the == line. */
if (host->next)
log_write(0, LOG_MAIN, "H=%s [%s]: %s", host->name, host->address, addr->message);
+#ifdef EXPERIMENTAL_EVENT
+ else
+ msg_event_raise(US"msg:rcpt:defer", addr);
+#endif
+
/* Do not put this message on the list of those waiting for specific
hosts, as otherwise it is likely to be tried too often. */