X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/137ae145e066dda8f9d81cf6d2c9f76c15929605..7adc9ca07a9a870f92a14d16740abfecde0bdfa4:/src/src/exim.c?ds=sidebyside diff --git a/src/src/exim.c b/src/src/exim.c index bb49ee670..ab2d673dd 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -3,6 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -895,195 +896,201 @@ Returns: nothing static void show_whats_supported(FILE * fp) { +rmark reset_point = store_mark(); +gstring * g; DEBUG(D_any) {} else show_db_version(fp); -fprintf(fp, "Support for:"); +g = string_cat(NULL, US"Support for:"); #ifdef SUPPORT_CRYPTEQ - fprintf(fp, " crypteq"); + g = string_cat(g, US" crypteq"); #endif #if HAVE_ICONV - fprintf(fp, " iconv()"); + g = string_cat(g, US" iconv()"); #endif #if HAVE_IPV6 - fprintf(fp, " IPv6"); + g = string_cat(g, US" IPv6"); #endif #ifdef HAVE_SETCLASSRESOURCES - fprintf(fp, " use_setclassresources"); + g = string_cat(g, US" use_setclassresources"); #endif #ifdef SUPPORT_PAM - fprintf(fp, " PAM"); + g = string_cat(g, US" PAM"); #endif #ifdef EXIM_PERL - fprintf(fp, " Perl"); + g = string_cat(g, US" Perl"); #endif #ifdef EXPAND_DLFUNC - fprintf(fp, " Expand_dlfunc"); + g = string_cat(g, US" Expand_dlfunc"); #endif #ifdef USE_TCP_WRAPPERS - fprintf(fp, " TCPwrappers"); + g = string_cat(g, US" TCPwrappers"); #endif #ifdef USE_GNUTLS - fprintf(fp, " GnuTLS"); + g = string_cat(g, US" GnuTLS"); #endif #ifdef USE_OPENSSL - fprintf(fp, " OpenSSL"); + g = string_cat(g, US" OpenSSL"); #endif #ifdef SUPPORT_TRANSLATE_IP_ADDRESS - fprintf(fp, " translate_ip_address"); + g = string_cat(g, US" translate_ip_address"); #endif #ifdef SUPPORT_MOVE_FROZEN_MESSAGES - fprintf(fp, " move_frozen_messages"); + g = string_cat(g, US" move_frozen_messages"); #endif #ifdef WITH_CONTENT_SCAN - fprintf(fp, " Content_Scanning"); + g = string_cat(g, US" Content_Scanning"); #endif #ifdef SUPPORT_DANE - fprintf(fp, " DANE"); + g = string_cat(g, US" DANE"); #endif #ifndef DISABLE_DKIM - fprintf(fp, " DKIM"); + g = string_cat(g, US" DKIM"); +#endif +#ifdef SUPPORT_DMARC + g = string_cat(g, US" DMARC"); #endif #ifndef DISABLE_DNSSEC - fprintf(fp, " DNSSEC"); + g = string_cat(g, US" DNSSEC"); #endif #ifndef DISABLE_EVENT - fprintf(fp, " Event"); + g = string_cat(g, US" Event"); #endif #ifdef SUPPORT_I18N - fprintf(fp, " I18N"); + g = string_cat(g, US" I18N"); #endif #ifndef DISABLE_OCSP - fprintf(fp, " OCSP"); + g = string_cat(g, US" OCSP"); #endif #ifndef DISABLE_PIPE_CONNECT - fprintf(fp, " PIPE_CONNECT"); + g = string_cat(g, US" PIPE_CONNECT"); #endif #ifndef DISABLE_PRDR - fprintf(fp, " PRDR"); + g = string_cat(g, US" PRDR"); #endif #ifdef SUPPORT_PROXY - fprintf(fp, " PROXY"); + g = string_cat(g, US" PROXY"); +#endif +#ifndef DISABLE_QUEUE_RAMP + g = string_cat(g, US" Experimental_Queue_Ramp"); #endif #ifdef SUPPORT_SOCKS - fprintf(fp, " SOCKS"); + g = string_cat(g, US" SOCKS"); #endif #ifdef SUPPORT_SPF - fprintf(fp, " SPF"); + g = string_cat(g, US" SPF"); #endif -#ifdef SUPPORT_DMARC - fprintf(fp, " DMARC"); +#if defined(SUPPORT_SRS) + g = string_cat(g, US" SRS"); #endif #ifdef TCP_FASTOPEN tcp_init(); - if (f.tcp_fastopen_ok) fprintf(fp, " TCP_Fast_Open"); + if (f.tcp_fastopen_ok) g = string_cat(g, US" TCP_Fast_Open"); #endif #ifdef EXPERIMENTAL_ARC - fprintf(fp, " Experimental_ARC"); + g = string_cat(g, US" Experimental_ARC"); #endif #ifdef EXPERIMENTAL_BRIGHTMAIL - fprintf(fp, " Experimental_Brightmail"); + g = string_cat(g, US" Experimental_Brightmail"); #endif #ifdef EXPERIMENTAL_DCC - fprintf(fp, " Experimental_DCC"); + g = string_cat(g, US" Experimental_DCC"); #endif #ifdef EXPERIMENTAL_DSN_INFO - fprintf(fp, " Experimental_DSN_info"); + g = string_cat(g, US" Experimental_DSN_info"); #endif #ifdef EXPERIMENTAL_LMDB - fprintf(fp, " Experimental_LMDB"); -#endif -#ifdef EXPERIMENTAL_QUEUE_RAMP - fprintf(fp, " Experimental_Queue_Ramp"); + g = string_cat(g, US" Experimental_LMDB"); #endif #ifdef EXPERIMENTAL_QUEUEFILE - fprintf(fp, " Experimental_QUEUEFILE"); + g = string_cat(g, US" Experimental_QUEUEFILE"); #endif -#if defined(EXPERIMENTAL_SRS) || defined(EXPERIMENTAL_SRS_NATIVE) - fprintf(fp, " Experimental_SRS"); +#if defined(EXPERIMENTAL_SRS_ALT) + g = string_cat(g, US" Experimental_SRS"); #endif #ifdef EXPERIMENTAL_TLS_RESUME - fprintf(fp, " Experimental_TLS_resume"); + g = string_cat(g, US" Experimental_TLS_resume"); #endif -fprintf(fp, "\n"); +g = string_cat(g, US"\n"); -fprintf(fp, "Lookups (built-in):"); +g = string_cat(g, US"Lookups (built-in):"); #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2 - fprintf(fp, " lsearch wildlsearch nwildlsearch iplsearch"); + g = string_cat(g, US" lsearch wildlsearch nwildlsearch iplsearch"); #endif #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2 - fprintf(fp, " cdb"); + g = string_cat(g, US" cdb"); #endif #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2 - fprintf(fp, " dbm dbmjz dbmnz"); + g = string_cat(g, US" dbm dbmjz dbmnz"); #endif #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2 - fprintf(fp, " dnsdb"); + g = string_cat(g, US" dnsdb"); #endif #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2 - fprintf(fp, " dsearch"); + g = string_cat(g, US" dsearch"); #endif #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2 - fprintf(fp, " ibase"); + g = string_cat(g, US" ibase"); #endif #if defined(LOOKUP_JSON) && LOOKUP_JSON!=2 - fprintf(fp, " json"); + g = string_cat(g, US" json"); #endif #if defined(LOOKUP_LDAP) && LOOKUP_LDAP!=2 - fprintf(fp, " ldap ldapdn ldapm"); + g = string_cat(g, US" ldap ldapdn ldapm"); #endif #ifdef EXPERIMENTAL_LMDB - fprintf(fp, " lmdb"); + g = string_cat(g, US" lmdb"); #endif #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2 - fprintf(fp, " mysql"); + g = string_cat(g, US" mysql"); #endif #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2 - fprintf(fp, " nis nis0"); + g = string_cat(g, US" nis nis0"); #endif #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2 - fprintf(fp, " nisplus"); + g = string_cat(g, US" nisplus"); #endif #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2 - fprintf(fp, " oracle"); + g = string_cat(g, US" oracle"); #endif #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2 - fprintf(fp, " passwd"); + g = string_cat(g, US" passwd"); #endif #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2 - fprintf(fp, " pgsql"); + g = string_cat(g, US" pgsql"); #endif #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2 - fprintf(fp, " redis"); + g = string_cat(g, US" redis"); #endif #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2 - fprintf(fp, " sqlite"); + g = string_cat(g, US" sqlite"); #endif #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2 - fprintf(fp, " testdb"); + g = string_cat(g, US" testdb"); #endif #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2 - fprintf(fp, " whoson"); + g = string_cat(g, US" whoson"); #endif -fprintf(fp, "\n"); +g = string_cat(g, US"\n"); -auth_show_supported(fp); -route_show_supported(fp); -transport_show_supported(fp); +g = auth_show_supported(g); +g = route_show_supported(g); +g = transport_show_supported(g); #ifdef WITH_CONTENT_SCAN -malware_show_supported(fp); +g = malware_show_supported(g); #endif if (fixed_never_users[0] > 0) { int i; - fprintf(fp, "Fixed never_users: "); + g = string_cat(g, US"Fixed never_users: "); for (i = 1; i <= (int)fixed_never_users[0] - 1; i++) - fprintf(fp, "%d:", (unsigned int)fixed_never_users[i]); - fprintf(fp, "%d\n", (unsigned int)fixed_never_users[i]); + string_fmt_append(g, "%u:", (unsigned)fixed_never_users[i]); + g = string_fmt_append(g, "%u\n", (unsigned)fixed_never_users[i]); } -fprintf(fp, "Configure owner: %d:%d\n", config_uid, config_gid); +g = string_fmt_append(g, "Configure owner: %d:%d\n", config_uid, config_gid); +fputs(CS string_from_gstring(g), fp); fprintf(fp, "Size of off_t: " SIZE_T_FMT "\n", sizeof(off_t)); @@ -1163,6 +1170,7 @@ show_db_version(fp); #endif } while (0); +store_reset(reset_point); } @@ -5110,6 +5118,8 @@ if (host_checking) deliver_localpart_orig = NULL; deliver_domain_orig = NULL; callout_address = sending_ip_address = NULL; + deliver_localpart_data = deliver_domain_data = + recipient_data = sender_data = NULL; sender_rate = sender_rate_limit = sender_rate_period = NULL; } smtp_log_no_mail(); @@ -5565,17 +5575,15 @@ while (more) if (filter_test != FTEST_NONE) { - deliver_domain = (ftest_domain != NULL)? - ftest_domain : qualify_domain_recipient; + deliver_domain = ftest_domain ? ftest_domain : qualify_domain_recipient; deliver_domain_orig = deliver_domain; - deliver_localpart = (ftest_localpart != NULL)? - ftest_localpart : originator_login; + deliver_localpart = ftest_localpart ? ftest_localpart : originator_login; deliver_localpart_orig = deliver_localpart; deliver_localpart_prefix = ftest_prefix; deliver_localpart_suffix = ftest_suffix; deliver_home = originator_home; - if (return_path == NULL) + if (!return_path) { printf("Return-path copied from sender\n"); return_path = string_copy(sender_address); @@ -5586,14 +5594,14 @@ while (more) receive_add_recipient( string_sprintf("%s%s%s@%s", - (ftest_prefix == NULL)? US"" : ftest_prefix, + ftest_prefix ? ftest_prefix : US"", deliver_localpart, - (ftest_suffix == NULL)? US"" : ftest_suffix, + ftest_suffix ? ftest_suffix : US"", deliver_domain), -1); printf("Recipient = %s\n", recipients_list[0].address); - if (ftest_prefix != NULL) printf("Prefix = %s\n", ftest_prefix); - if (ftest_suffix != NULL) printf("Suffix = %s\n", ftest_suffix); + if (ftest_prefix) printf("Prefix = %s\n", ftest_prefix); + if (ftest_suffix) printf("Suffix = %s\n", ftest_suffix); if (chdir("/")) /* Get away from wherever the user is running this from */ { @@ -5606,13 +5614,13 @@ while (more) available to the user filter. We need to copy the filter variables explicitly. */ - if ((filter_test & FTEST_SYSTEM) != 0) + if (filter_test & FTEST_SYSTEM) if (!filter_runtest(filter_sfd, filter_test_sfile, TRUE, more)) exim_exit(EXIT_FAILURE); memcpy(filter_sn, filter_n, sizeof(filter_sn)); - if ((filter_test & FTEST_USER) != 0) + if (filter_test & FTEST_USER) if (!filter_runtest(filter_ufd, filter_test_ufile, FALSE, more)) exim_exit(EXIT_FAILURE); @@ -5624,9 +5632,9 @@ while (more) will be TRUE. If it is not, check on the number of messages received in this connection. */ - if (!session_local_queue_only && - smtp_accept_queue_per_connection > 0 && - receive_messagecount > smtp_accept_queue_per_connection) + if ( !session_local_queue_only + && smtp_accept_queue_per_connection > 0 + && receive_messagecount > smtp_accept_queue_per_connection) { session_local_queue_only = TRUE; queue_only_reason = 2; @@ -5642,16 +5650,12 @@ while (more) ones. However, there are odd cases where this is not wanted, so this can be changed by setting queue_only_load_latch false. */ - local_queue_only = session_local_queue_only; - if (!local_queue_only && queue_only_load >= 0) - { - local_queue_only = (load_average = OS_GETLOADAVG()) > queue_only_load; - if (local_queue_only) + if (!(local_queue_only = session_local_queue_only) && queue_only_load >= 0) + if ((local_queue_only = (load_average = OS_GETLOADAVG()) > queue_only_load)) { queue_only_reason = 3; if (queue_only_load_latch) session_local_queue_only = TRUE; } - } /* If running as an MUA wrapper, all queueing options and freezing options are ignored. */ @@ -5768,6 +5772,8 @@ moreloop: #endif callout_address = NULL; sending_ip_address = NULL; + deliver_localpart_data = deliver_domain_data = + recipient_data = sender_data = NULL; acl_var_m = NULL; for(int i = 0; i < REGEX_VARS; i++) regex_vars[i] = NULL;