Copyright updates:
[exim.git] / src / src / exim.c
index 9cba8d51effb46a4552d58128e42b69d8e52f1d6..118fe5c7cede206c07ace57a57fe715e70b03ebb 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2023 */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 /* SPDX-License-Identifier: GPL-2.0-or-later */
@@ -1026,47 +1026,53 @@ gstring * g = NULL;
 DEBUG(D_any) {} else g = show_db_version(g);
 
 g = string_cat(g, US"Support for:");
+#ifdef WITH_CONTENT_SCAN
+  g = string_cat(g, US" Content_Scanning");
+#endif
 #ifdef SUPPORT_CRYPTEQ
   g = string_cat(g, US" crypteq");
 #endif
+#ifdef EXPAND_DLFUNC
+  g = string_cat(g, US" Expand_dlfunc");
+#endif
 #if HAVE_ICONV
   g = string_cat(g, US" iconv()");
 #endif
 #if HAVE_IPV6
   g = string_cat(g, US" IPv6");
 #endif
-#ifdef HAVE_SETCLASSRESOURCES
-  g = string_cat(g, US" use_setclassresources");
-#endif
 #ifdef SUPPORT_PAM
   g = string_cat(g, US" PAM");
 #endif
 #ifdef EXIM_PERL
   g = string_cat(g, US" Perl");
 #endif
-#ifdef EXPAND_DLFUNC
-  g = string_cat(g, US" Expand_dlfunc");
-#endif
-#ifdef USE_TCP_WRAPPERS
-  g = string_cat(g, US" TCPwrappers");
-#endif
 #ifdef USE_GNUTLS
   g = string_cat(g, US" GnuTLS");
 #endif
+#ifdef SUPPORT_MOVE_FROZEN_MESSAGES
+  g = string_cat(g, US" move_frozen_messages");
+#endif
 #ifdef USE_OPENSSL
   g = string_cat(g, US" OpenSSL");
 #endif
+#if defined(CYRUS_PWCHECK_SOCKET)
+  g = string_cat(g, US" pwcheck");
+#endif
+#if defined(RADIUS_CONFIG_FILE)
+  g = string_cat(g, US" radius");
+#endif
 #ifndef DISABLE_TLS_RESUME
   g = string_cat(g, US" TLS_resume");
 #endif
 #ifdef SUPPORT_TRANSLATE_IP_ADDRESS
   g = string_cat(g, US" translate_ip_address");
 #endif
-#ifdef SUPPORT_MOVE_FROZEN_MESSAGES
-  g = string_cat(g, US" move_frozen_messages");
+#ifdef USE_TCP_WRAPPERS
+  g = string_cat(g, US" TCPwrappers");
 #endif
-#ifdef WITH_CONTENT_SCAN
-  g = string_cat(g, US" Content_Scanning");
+#ifdef HAVE_SETCLASSRESOURCES
+  g = string_cat(g, US" use_setclassresources");
 #endif
 #ifdef SUPPORT_DANE
   g = string_cat(g, US" DANE");
@@ -1132,6 +1138,9 @@ g = string_cat(g, US"Support for:");
 #ifdef EXPERIMENTAL_QUEUEFILE
   g = string_cat(g, US" Experimental_QUEUEFILE");
 #endif
+#ifdef EXPERIMENTAL_XCLIENT
+  g = string_cat(g, US" Experimental_XCLIENT");
+#endif
 g = string_cat(g, US"\n");
 
 g = string_cat(g, US"Lookups (built-in):");
@@ -1711,6 +1720,7 @@ qrunners = store_get_perm(sizeof(qrunner), GET_UNTAINTED);
 memset(qrunners, 0, sizeof(qrunner));          /* default queue, zero interval */
 qrunners->next_tick = time(NULL);              /* run right away */
 qrunners->run_max = 1;
+return qrunners;
 }
 
 
@@ -1744,7 +1754,7 @@ int  filter_sfd = -1;
 int  filter_ufd = -1;
 int  group_count;
 int  i, rv;
-int  list_queue_option = 0;
+int  list_queue_option = QL_BASIC;
 int  msg_action = 0;
 int  msg_action_arg = -1;
 int  namelen = argv[0] ? Ustrlen(argv[0]) : 0;
@@ -2018,7 +2028,14 @@ this here, because the -M options check their arguments for syntactic validity
 using mac_ismsgid, which uses this. */
 
 regex_ismsgid =
-  regex_must_compile(US"^(?:[^\\W_]{6}-){2}[^\\W_]{2}$", MCS_NOFLAGS, TRUE);
+  regex_must_compile(US"^(?:"
+         "[^\\W_]{" str(MESSAGE_ID_TIME_LEN) "}"
+         "-[^\\W_]{" str(MESSAGE_ID_PID_LEN) "}"
+         "-[^\\W_]{" str(MESSAGE_ID_SUBTIME_LEN) "}"
+       "|"
+         "(?:[^\\W_]{6}-){2}[^\\W_]{2}"                /* old ID format */
+       ")$",
+    MCS_NOFLAGS, TRUE);
 
 /* Precompile the regular expression that is used for matching an SMTP error
 code, possibly extended, at the start of an error message. Note that the
@@ -2387,11 +2404,9 @@ on the second character (the one after '-'), to save some effort. */
            }
 
          if (*argrest == 'r')
-           {
-           list_queue_option = 8;
-           argrest++;
-           }
-         else list_queue_option = 0;
+           list_queue_option = QL_UNSORTED, argrest++;
+         else
+           list_queue_option = QL_BASIC;
 
          list_queue = TRUE;
 
@@ -2401,11 +2416,15 @@ on the second character (the one after '-'), to save some effort. */
 
          /* -bpu: List the contents of the mail queue, top-level undelivered */
 
-         else if (Ustrcmp(argrest, "u") == 0) list_queue_option += 1;
+         else if (Ustrcmp(argrest, "u") == 0) list_queue_option |= QL_UNDELIVERED_ONLY;
 
          /* -bpa: List the contents of the mail queue, including all delivered */
 
-         else if (Ustrcmp(argrest, "a") == 0) list_queue_option += 2;
+         else if (Ustrcmp(argrest, "a") == 0) list_queue_option |= QL_PLUS_GENERATED;
+
+         /* -bpi: List only message IDs */
+
+         else if (Ustrcmp(argrest, "i") == 0) list_queue_option |= QL_MSGID_ONLY;
 
          /* Unknown after -bp[r] */
 
@@ -4459,7 +4478,8 @@ if (!f.admin_user)
      || queue_name_dest && prod_requires_admin
      || debugset && !f.running_in_test_harness
      )
-    exim_fail("exim:%s permission denied\n", debugset ? " debugging" : "");
+    exim_fail("exim:%s permission denied; not admin\n",
+             debugset ? " debugging" : "");
   }
 
 /* If the real user is not root or the exim uid, the argument for passing
@@ -4475,7 +4495,7 @@ if (  real_uid != root_uid && real_uid != exim_uid
       )  )
    && !f.running_in_test_harness
    )
-  exim_fail("exim: Permission denied\n");
+  exim_fail("exim: Permission denied; not exim user or root\n");
 
 /* If the caller is not trusted, certain arguments are ignored when running for
 real, but are permitted when checking things (-be, -bv, -bt, -bh, -bf, -bF).
@@ -5405,6 +5425,7 @@ if (host_checking)
     "**** This is not for real!\n\n",
       sender_host_address);
 
+  connection_id = getpid();
   memset(sender_host_cache, 0, sizeof(sender_host_cache));
   if (verify_check_host(&hosts_connection_nolog) == OK)
     {
@@ -5593,6 +5614,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();
 if (smtp_input)
   {
   smtp_in = stdin;
@@ -5764,7 +5786,7 @@ for (BOOL more = TRUE; more; )
       int start, end, domain;
       uschar * errmess;
       /* There can be multiple addresses, so EXIM_DISPLAYMAIL_MAX (tuned for 1) is too short.
-       * We'll still want to cap it to something, just in case. */
+      We'll still want to cap it to something, just in case. */
       uschar * s = string_copy_taint(
        exim_str_fail_toolong(list[i], BIG_BUFFER_SIZE, "address argument"),
        GET_TAINTED);
@@ -6099,6 +6121,7 @@ MORELOOP:
   deliver_localpart_data = deliver_domain_data =
   recipient_data = sender_data = NULL;
   acl_var_m = NULL;
+  lookup_value = NULL;                            /* Can be set by ACL */
 
   store_reset(reset_point);
   }