Add $connection_id variable
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 31 Jul 2024 07:41:34 +0000 (08:41 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 31 Jul 2024 07:41:34 +0000 (08:41 +0100)
15 files changed:
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/daemon.c
src/src/exim.c
src/src/expand.c
src/src/functions.h
src/src/globals.c
src/src/globals.h
src/src/host.c
src/src/receive.c
src/src/smtp_in.c
test/confs/0002
test/runtest
test/scripts/0000-Basic/0002
test/stderr/0002

index 8ab15d86bffe6a131e2d41547bd775d718c701c3..aaa4a270f180c79566aa084780809083c498225e 100644 (file)
@@ -12611,6 +12611,11 @@ contain the trailing slash. If &$config_file$& does not contain a slash,
 .vindex "&$config_file$&"
 The name of the main configuration file Exim is using.
 
+.vitem &$connection_id$&
+.vindex "&$connection_id$&"
+.cindex connection "identifier logging"
+An identifier for the accepted connection, for use in custom logging.
+
 .vitem &$dkim_verify_status$&
 Results of DKIM verification.
 For details see section &<<SECDKIMVFY>>&.
@@ -39368,7 +39373,7 @@ only way to log such cases is to interpose a script such as &_util/logargs.sh_&
 between the caller and Exim.
 .next
 .cindex log "connection identifier"
-.cindec connection "indentifier logging"
+.cindex connection "identifier logging"
 &%connection_id%&: An identifier for the accepted connection is added to
 connection start and end lines and to message accept lines.
 The identifier is tagged by Ci=.
index 012d71d68b1eacdef7278bf3cb3b042c817d1e3e..d48f2252ee662382845a91e286c52a4365d28239 100644 (file)
@@ -10,6 +10,8 @@ Version 4.98
 ------------
  1. A sieve_inbox option for redirect routers
 
+ 2. A "connection_id" variable
+
 Version 4.98
 ------------
  1. The dkim_status ACL condition may now be used in data ACLs
index 823c91937f9e7d71ca360064b2e22370a0da63c1..4088cb53210935ae2ac4ed73a746c234d546e346 100644 (file)
@@ -383,7 +383,7 @@ if (pid == 0)
 #endif
 
   smtp_accept_count++;    /* So that it includes this process */
-  connection_id = getpid();
+  set_connection_id();
 
   /* Log the connection if requested.
   In order to minimize the cost (because this is going to happen for every
@@ -405,7 +405,7 @@ if (pid == 0)
       save_log_selector &= ~L_smtp_connection;
     else if (LOGGING(connection_id))
       log_write(L_smtp_connection, LOG_MAIN, "SMTP connection from %Y "
-       "Ci=%lu (TCP/IP connection count = %d)",
+       "Ci=%s (TCP/IP connection count = %d)",
        whofrom, connection_id, smtp_accept_count);
     else
       log_write(L_smtp_connection, LOG_MAIN, "SMTP connection from %Y "
index cca02de5ee7c702203f64f87013c9be60ec4f86b..0d0396e3ef15fb5a8114f16cfaa98ce89549f297 100644 (file)
@@ -5475,7 +5475,7 @@ if (host_checking)
     "**** This is not for real!\n\n",
       sender_host_address);
 
-  connection_id = getpid();
+  set_connection_id();
   memset(sender_host_cache, 0, sizeof(sender_host_cache));
   if (verify_check_host(&hosts_connection_nolog) == OK)
     {
@@ -5664,7 +5664,7 @@ because a log line has already been written for all its failure exists
 (usually "connection refused: <reason>") and writing another one is
 unnecessary clutter. */
 
-connection_id = getpid();
+set_connection_id();
 if (smtp_input)
   {
   smtp_in = stdin;
index b50639e4bd19869a329909c3a93286b97b304dc3..4135574d6b7f90de130602a653494cd745fcdbc1 100644 (file)
@@ -532,6 +532,7 @@ static var_entry var_table[] = {
   { "compile_number",      vtype_stringptr,   &version_cnumber },
   { "config_dir",          vtype_stringptr,   &config_main_directory },
   { "config_file",         vtype_stringptr,   &config_main_filename },
+  { "connection_id",       vtype_stringptr,   &connection_id },
   { "csa_status",          vtype_stringptr,   &csa_status },
 #ifdef EXPERIMENTAL_DCC
   { "dcc_header",          vtype_stringptr,   &dcc_header },
index 079e94f5e15e830f19b878c146754d28afc914a4..5d20bb2fcf91032ec286bd3a991ff93ca0c06aa2 100644 (file)
@@ -1352,6 +1352,20 @@ return NULL;
 
 /******************************************************************************/
 # if !defined(COMPILE_UTILITY)
+
+/* We use the PID of the head process for a connection-id.  Note that
+this is only for tracking a received connection and what it directly
+causes; there is no inttent to describe transport-initiated TCP connections.
+The value is intented to be a cookie usable for logging, and we might change
+the generator for it at any time. */
+
+static inline void
+set_connection_id(void)
+{
+connection_id = string_sprintf("%lu", (u_long)getpid());
+}
+
+
 /* Process manipulation */
 
 static inline pid_t
index a4b142bc04420a59e2b412d52183445ea9d1753e..02349497f0f27bf93a725ad770b48de0bec5da22 100644 (file)
@@ -739,7 +739,7 @@ uid_t   config_uid             = CONFIGURE_OWNER;
 uid_t   config_uid             = 0;
 #endif
 
-uint64_t connection_id        = 0L;
+const uschar *connection_id    = NULL;
 int     connection_max_messages= -1;
 unsigned continue_flags               = 0;
 #ifndef DISABLE_ESMTP_LIMITS
index 05c39109ee26db5d303e3ee9728e276a0fe7d456..65eb4e4a582f14f7700179456167b9608c87ebb7 100644 (file)
@@ -435,7 +435,7 @@ extern gstring *client_cmd_log;            /* debug log of client cmds & responses *
 extern int     clmacro_count;          /* Number of command line macros */
 extern uschar *clmacros[];             /* Copy of them, for re-exec */
 extern BOOL    commandline_checks_require_admin; /* belt and braces for insecure setups */
-extern uint64_t connection_id;        /* connection number */
+extern const uschar *connection_id;    /* connection cookie for log */
 extern int     connection_max_messages;/* Max down one SMTP connection */
 extern FILE   *config_file;            /* Configuration file */
 extern const uschar *config_filename;  /* Configuration file name */
index 5979718148813926a9c097215d2e98bc1fd77324..182e5068b849a63c2bb29c0599d372d6889cbda3 100644 (file)
@@ -629,7 +629,7 @@ else
     g = string_fmt_append(g, " U=%s", sender_ident);
   }
 if (LOGGING(connection_id))
-  g = string_fmt_append(g, " Ci=%lu", connection_id);
+  g = string_fmt_append(g, " Ci=%s", connection_id);
 gstring_release_unused(g);
 return string_from_gstring(g);
 }
index cc64f44f4327a2f244e949a900cde5c4524f1ce6..1ee02c5b700fdbd7d8f2ea8e2c4baec42398d6c8 100644 (file)
@@ -1395,7 +1395,7 @@ if (f.tcp_in_fastopen && !f.tcp_in_fastopen_logged)
 if (sender_ident)
   g = string_append(g, 2, US" U=", sender_ident);
 if (LOGGING(connection_id))
-  g = string_fmt_append(g, " Ci=%lu", connection_id);
+  g = string_fmt_append(g, " Ci=%s", connection_id);
 if (received_protocol)
   g = string_append(g, 2, US" P=", received_protocol);
 if (LOGGING(pipelining) && f.smtp_in_pipelining_advertised)
index eadad682bd8d554b9d8fa72fa87a9b48085c7906..150d65a2d37c148f5e5d620885d80fbb100ccef7 100644 (file)
@@ -1355,7 +1355,7 @@ const uschar * hostname = sender_fullhost
 gstring * g = string_catn(NULL, US"SMTP connection", 15);
 
 if (LOGGING(connection_id))
-  g = string_fmt_append(g, " Ci=%lu", connection_id);
+  g = string_fmt_append(g, " Ci=%s", connection_id);
 g = string_catn(g, US" from ", 6);
 
 if (host_checking)
index 7e565805bf12505f86fcc9df1275c043e088c1ea..7e346d54d6e95a990e1de2c36cf2f68bad6fa82e 100644 (file)
@@ -39,7 +39,7 @@ LENCHECK
 begin acl
 
 connect0:
-  accept
+  accept logwrite = connection_id: $connection_id
 
 connect1:
   deny  hosts = <\n partial-lsearch;DIR/aux-fixed/0002.lsearch \n 1.2.3.4
index 3b936de3d2c55eab90727bae2aadb9bc2959f318..d3cea20a82794d2a8efaf532e2cc807c45c955b8 100755 (executable)
@@ -1205,6 +1205,9 @@ RESET_AFTER_EXTRA_LINE_READ:
     # Lines with a leading pid.  Only handle >= 4-digit PIDs to avoid converting SMTP respose codes
     s/^\s*(\d{4,})\s(?!(?:previous message|in\s|bytes remain in|SMTP accept process running))/new_value($1, "p%s", \$next_pid) . ' '/e;
 
+    # Connection IDs
+    s/connection_id: \K(\d+)$/new_value($1, "conn%s", \$next_conn)/e;
+
     # Debugging lines for Exim terminations and process-generation
     next if /(?:postfork: | fork(?:ing|ed) for )/;
 
@@ -4608,6 +4611,7 @@ foreach $test (@test_list)
   $next_msgid = "aX";
   $next_pid = 1234;
   $next_port = 1111;
+  $next_conn = 1111;
   $message_skip = 0;
   $msglog_skip = 0;
   $munge_skip = 0;
index a90e7ee9c2a901b11dec392da59fb2c2b13a9653..0ed3e0dffa674c7da4d96a6f65f4822190949044 100644 (file)
@@ -1090,7 +1090,7 @@ exim -d -bh V4NET.0.0.1
 ****
 exim -d -bh V4NET.0.0.2
 ****
-# Test $reply_address
+# Test $reply_address, $connection_id
 exim -bh V4NET.0.0.0
 helo test
 mail from:<>
index 0632de1464a7d616083145472c2e0407efc02aff..a2c0cc657f90057c911f2c7f142a5343ffc5a044 100644 (file)
@@ -655,6 +655,9 @@ search_tidyup called
 >>> host in helo_accept_junk_hosts? no (option unset)
 >>> using ACL "connect0"
 >>> processing "accept" (TESTSUITE/test-config 42)
+>>> check logwrite = connection_id: $connection_id
+>>>                = connection_id: conn1111
+LOG: connection_id: conn1111
 >>> accept: condition test succeeded in ACL "connect0"
 >>> end of ACL "connect0": ACCEPT
 >>> test in helo_lookup_domains?
@@ -745,6 +748,9 @@ LOG: 10HmbB-000000005vi-0000 H=(test) [V4NET.0.0.0] F=<> rejected after DATA: re
 >>> host in helo_accept_junk_hosts? no (option unset)
 >>> using ACL "connect0"
 >>> processing "accept" (TESTSUITE/test-config 42)
+>>> check logwrite = connection_id: $connection_id
+>>>                = connection_id: conn1112
+LOG: connection_id: conn1112
 >>> accept: condition test succeeded in ACL "connect0"
 >>> end of ACL "connect0": ACCEPT
 >>> test in helo_lookup_domains?
@@ -776,6 +782,9 @@ LOG: 10HmbC-000000005vi-0000 H=(test) [V4NET.0.0.0] F=<> rejected after DATA: re
 >>> host in helo_accept_junk_hosts? no (option unset)
 >>> using ACL "connect0"
 >>> processing "accept" (TESTSUITE/test-config 42)
+>>> check logwrite = connection_id: $connection_id
+>>>                = connection_id: conn1113
+LOG: connection_id: conn1113
 >>> accept: condition test succeeded in ACL "connect0"
 >>> end of ACL "connect0": ACCEPT
 >>> test in helo_lookup_domains?