Events: move from Experimental to mainline
[exim.git] / src / src / deliver.c
index e1f4e0e293cb69a24a0be0e750f1eb298b4c0ab9..d85f010e61d2fe8a5ba4f2fa5666009964703fbf 100644 (file)
@@ -703,7 +703,7 @@ if (LOGGING(incoming_interface) && LOGGING(outgoing_interface)
   s = LOGGING(outgoing_port)
     ? string_append(s, sizep, ptrp, 2, US"]:",
        string_sprintf("%d", sending_port))
-    : string_cat(s, sizep, ptrp, "]", 1);
+    : string_cat(s, sizep, ptrp, US"]", 1);
   }
 return s;
 }
@@ -718,11 +718,24 @@ s = string_append(s, sizep, ptrp, 5, US" H=", addr->host_used->name,
 if (LOGGING(outgoing_port))
   s = string_append(s, sizep, ptrp, 2, US":", string_sprintf("%d",
     addr->host_used->port));
+
+#ifdef SUPPORT_SOCKS
+if (LOGGING(proxy) && proxy_local_address)
+  {
+  s = string_append(s, sizep, ptrp, 3, US" PRX=[", proxy_local_address, US"]");
+  if (LOGGING(outgoing_port))
+    s = string_append(s, sizep, ptrp, 2, US":", string_sprintf("%d",
+      proxy_local_port));
+  }
+#endif
+
 return d_log_interface(s, sizep, ptrp);
 }
 
 
 
+
+
 #ifdef SUPPORT_TLS
 static uschar *
 d_tlslog(uschar * s, int * sizep, int * ptrp, address_item * addr)
@@ -750,7 +763,7 @@ return s;
 
 
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
 uschar *
 event_raise(uschar * action, const uschar * event, uschar * ev_data)
 {
@@ -785,12 +798,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,15 +817,19 @@ 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;
 router_name = transport_name = NULL;
 }
-#endif /*EXPERIMENTAL_EVENT*/
+#endif /*DISABLE_EVENT*/
 
 
 
@@ -835,7 +854,7 @@ the log line, and reset the store afterwards. Remote deliveries should always
 have a pointer to the host item that succeeded; local deliveries can have a
 pointer to a single host item in their host list, for use by the transport. */
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
   /* presume no successful remote delivery */
   lookup_dnssec_authenticated = NULL;
 #endif
@@ -853,7 +872,7 @@ else
 
 if (LOGGING(sender_on_delivery) || msg)
   s = string_append(s, &size, &ptr, 3, US" F=<",
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
     testflag(addr, af_utf8_downcvt)
     ? string_address_utf8_to_alabel(sender_address, NULL)
     :
@@ -909,7 +928,7 @@ else
     if (continue_sequence > 1)
       s = string_cat(s, &size, &ptr, US"*", 1);
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
     deliver_host_address = addr->host_used->address;
     deliver_host_port =    addr->host_used->port;
     deliver_host =         addr->host_used->name;
@@ -980,7 +999,7 @@ store we used to build the line after writing it. */
 s[ptr] = 0;
 log_write(0, flags, "%s", s);
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
 if (!msg) msg_event_raise(US"msg:delivery", addr);
 #endif
 
@@ -1420,7 +1439,7 @@ else
 
   log_write(0, LOG_MAIN, "** %s", s);
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
   msg_event_raise(US"msg:fail:delivery", addr);
 #endif
 
@@ -3291,6 +3310,21 @@ while (!done)
 
     switch (subid)
       {
+#ifdef SUPPORT_SOCKS
+      case '2':        /* proxy information; must arrive before A0 and applies to that addr XXX oops*/
+       proxy_session = TRUE;   /*XXX shouod this be cleared somewhere? */
+       if (*ptr == 0)
+         ptr++;
+       else
+         {
+         proxy_local_address = string_copy(ptr);
+         while(*ptr++);
+         memcpy(&proxy_local_port, ptr, sizeof(proxy_local_port));
+         ptr += sizeof(proxy_local_port);
+         }
+       break;
+#endif
+
 #ifdef EXPERIMENTAL_DSN_INFO
       case '1':        /* must arrive before A0, and applies to that addr */
                /* Two strings: smtp_greeting and helo_response */
@@ -4435,15 +4469,13 @@ for (delivery_count = 0; addr_remote; delivery_count++)
 #ifdef SUPPORT_TLS
       if (addr->cipher)
         {
-        ptr = big_buffer;
-        sprintf(CS ptr, "%.128s", addr->cipher);
-        while(*ptr++);
+        ptr = big_buffer + sprintf(CS big_buffer, "%.128s", addr->cipher) + 1;
         if (!addr->peerdn)
          *ptr++ = 0;
        else
           {
-          sprintf(CS ptr, "%.512s", addr->peerdn);
-          while(*ptr++);
+          ptr += sprintf(CS ptr, "%.512s", addr->peerdn);
+          ptr++;
           }
 
         rmt_dlv_checked_write(fd, 'X', '1', big_buffer, ptr - big_buffer);
@@ -4469,9 +4501,7 @@ for (delivery_count = 0; addr_remote; delivery_count++)
 # ifndef DISABLE_OCSP
       if (addr->ocsp > OCSP_NOT_REQ)
        {
-       ptr = big_buffer;
-       sprintf(CS ptr, "%c", addr->ocsp + '0');
-       while(*ptr++);
+       ptr = big_buffer + sprintf(CS big_buffer, "%c", addr->ocsp + '0') + 1;
         rmt_dlv_checked_write(fd, 'X', '4', big_buffer, ptr - big_buffer);
        }
 # endif
@@ -4479,23 +4509,17 @@ for (delivery_count = 0; addr_remote; delivery_count++)
 
       if (client_authenticator)
         {
-        ptr = big_buffer;
-       sprintf(CS big_buffer, "%.64s", client_authenticator);
-        while(*ptr++);
+       ptr = big_buffer + sprintf(CS big_buffer, "%.64s", client_authenticator) + 1;
         rmt_dlv_checked_write(fd, 'C', '1', big_buffer, ptr - big_buffer);
        }
       if (client_authenticated_id)
         {
-        ptr = big_buffer;
-       sprintf(CS big_buffer, "%.64s", client_authenticated_id);
-        while(*ptr++);
+        ptr = big_buffer + sprintf(CS big_buffer, "%.64s", client_authenticated_id) + 1;
         rmt_dlv_checked_write(fd, 'C', '2', big_buffer, ptr - big_buffer);
        }
       if (client_authenticated_sender)
         {
-        ptr = big_buffer;
-       sprintf(CS big_buffer, "%.64s", client_authenticated_sender);
-        while(*ptr++);
+        ptr = big_buffer + sprintf(CS big_buffer, "%.64s", client_authenticated_sender) + 1;
         rmt_dlv_checked_write(fd, 'C', '3', big_buffer, ptr - big_buffer);
        }
 
@@ -4526,19 +4550,34 @@ for (delivery_count = 0; addr_remote; delivery_count++)
         rmt_dlv_checked_write(fd, 'R', '0', big_buffer, ptr - big_buffer);
         }
 
+#ifdef SUPPORT_SOCKS
+      if (LOGGING(proxy) && proxy_session)
+       {
+       ptr = big_buffer;
+       if (proxy_local_address)
+         {
+         DEBUG(D_deliver) debug_printf("proxy_local_address '%s'\n", proxy_local_address);
+         ptr = big_buffer + sprintf(CS ptr, "%.128s", proxy_local_address) + 1;
+         DEBUG(D_deliver) debug_printf("proxy_local_port %d\n", proxy_local_port);
+         memcpy(ptr, &proxy_local_port, sizeof(proxy_local_port));
+         ptr += sizeof(proxy_local_port);
+         }
+       else
+         *ptr++ = '\0';
+       rmt_dlv_checked_write(fd, 'A', '2', big_buffer, ptr - big_buffer);
+       }
+#endif
+
 #ifdef EXPERIMENTAL_DSN_INFO
 /*um, are they really per-addr?  Other per-conn stuff is not (auth, tls).  But host_used is! */
       if (addr->smtp_greeting)
        {
-       ptr = big_buffer;
        DEBUG(D_deliver) debug_printf("smtp_greeting '%s'\n", addr->smtp_greeting);
-        sprintf(CS ptr, "%.128s", addr->smtp_greeting);
-        while(*ptr++);
+       ptr = big_buffer + sprintf(CS big_buffer, "%.128s", addr->smtp_greeting) + 1;
        if (addr->helo_response)
          {
          DEBUG(D_deliver) debug_printf("helo_response '%s'\n", addr->helo_response);
-         sprintf(CS ptr, "%.128s", addr->helo_response);
-         while(*ptr++);
+         ptr += sprintf(CS ptr, "%.128s", addr->helo_response) + 1;
          }
        else
          *ptr++ = '\0';
@@ -4548,8 +4587,7 @@ for (delivery_count = 0; addr_remote; delivery_count++)
 
       /* The rest of the information goes in an 'A0' item. */
 
-      sprintf(CS big_buffer, "%c%c", addr->transport_return,
-        addr->special_action);
+      sprintf(CS big_buffer, "%c%c", addr->transport_return, addr->special_action);
       ptr = big_buffer + 2;
       memcpy(ptr, &(addr->basic_errno), sizeof(addr->basic_errno));
       ptr += sizeof(addr->basic_errno);
@@ -4559,23 +4597,15 @@ for (delivery_count = 0; addr_remote; delivery_count++)
       ptr += sizeof(addr->flags);
 
       if (!addr->message) *ptr++ = 0; else
-        {
-        sprintf(CS ptr, "%.1024s", addr->message);
-        while(*ptr++);
-        }
+        ptr += sprintf(CS ptr, "%.1024s", addr->message) + 1;
 
       if (!addr->user_message) *ptr++ = 0; else
-        {
-        sprintf(CS ptr, "%.1024s", addr->user_message);
-        while(*ptr++);
-        }
+        ptr += sprintf(CS ptr, "%.1024s", addr->user_message) + 1;
 
       if (!addr->host_used) *ptr++ = 0; else
         {
-        sprintf(CS ptr, "%.256s", addr->host_used->name);
-        while(*ptr++);
-        sprintf(CS ptr, "%.64s", addr->host_used->address);
-        while(*ptr++);
+        ptr += sprintf(CS ptr, "%.256s", addr->host_used->name) + 1;
+        ptr += sprintf(CS ptr, "%.64s", addr->host_used->address) + 1;
         memcpy(ptr, &(addr->host_used->port), sizeof(addr->host_used->port));
         ptr += sizeof(addr->host_used->port);
 
@@ -4594,12 +4624,9 @@ for (delivery_count = 0; addr_remote; delivery_count++)
     if (LOGGING(incoming_interface) && sending_ip_address)
 #endif
       {
-      uschar * ptr = big_buffer;
-      sprintf(CS ptr, "%.128s", sending_ip_address);
-      while(*ptr++);
-      sprintf(CS ptr, "%d", sending_port);
-      while(*ptr++);
-
+      uschar * ptr;
+      ptr = big_buffer + sprintf(CS big_buffer, "%.128s", sending_ip_address) + 1;
+      ptr += sprintf(CS ptr, "%d", sending_port) + 1;
       rmt_dlv_checked_write(fd, 'I', '0', big_buffer, ptr - big_buffer);
       }
 
@@ -5744,7 +5771,7 @@ if (process_recipients != RECIP_IGNORE)
       recipient_item *r = recipients_list + i;
       address_item *new = deliver_make_addr(r->address, FALSE);
       new->prop.errors_address = r->errors_to;
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
       if ((new->prop.utf8_msg = message_smtputf8))
        {
        new->prop.utf8_downcvt =       message_utf8_downconvert == 1;
@@ -5835,7 +5862,7 @@ if (process_recipients != RECIP_IGNORE)
         break;
         }
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
       if (process_recipients != RECIP_ACCEPT)
        {
        uschar * save_local =  deliver_localpart;
@@ -7300,7 +7327,7 @@ wording. */
         }
 
       /* output machine readable part */
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
       if (message_smtputf8)
        fprintf(f, "--%s\n"
            "Content-type: message/global-delivery-status\n\n"
@@ -7401,7 +7428,7 @@ wording. */
             }
           }
 
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
       if (message_smtputf8)
        fputs(topt & topt_no_body ? "Content-type: message/global-headers\n\n"
                                  : "Content-type: message/global\n\n",
@@ -7537,7 +7564,7 @@ if (!addr_defer)
   /* Unset deliver_freeze so that we won't try to move the spool files further down */
   deliver_freeze = FALSE;
 
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
   (void) event_raise(event_action, US"msg:complete", NULL);
 #endif
   }
@@ -8047,7 +8074,7 @@ if (!regex_PRDR) regex_PRDR =
   regex_must_compile(US"\\n250[\\s\\-]PRDR(\\s|\\n|$)", FALSE, TRUE);
 #endif
 
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
 if (!regex_UTF8) regex_UTF8 =
   regex_must_compile(US"\\n250[\\s\\-]SMTPUTF8(\\s|\\n|$)", FALSE, TRUE);
 #endif