X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Freadconf.c;h=fb9d47a099f33f16126105e9a1286698468f2071;hb=dcb72db9ece0902199a95f6a06fa56ce10587dd4;hp=d0b8e0bcf87b7737e4a148eb0886550ca45cc542;hpb=d8b70640f81ea7af8d04c94c0cb5bcceb8163c39;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/readconf.c b/src/src/readconf.c index d0b8e0bcf..fb9d47a09 100644 --- a/src/src/readconf.c +++ b/src/src/readconf.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2015 */ +/* Copyright (c) University of Cambridge 1995 - 2016 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for reading the configuration file, and for displaying @@ -16,7 +16,7 @@ extern char **environ; static void fn_smtp_receive_timeout(const uschar * name, const uschar * str); static void save_config_line(const uschar* line); static void save_config_position(const uschar *file, int line); -static void print_config(BOOL admin); +static void print_config(BOOL admin, BOOL terse); #define CSTATE_STACK_SIZE 10 @@ -212,6 +212,7 @@ static optionlist optionlist_config[] = { { "check_rfc2047_length", opt_bool, &check_rfc2047_length }, { "check_spool_inodes", opt_int, &check_spool_inodes }, { "check_spool_space", opt_Kint, &check_spool_space }, + { "chunking_advertise_hosts", opt_stringptr, &chunking_advertise_hosts }, { "daemon_smtp_port", opt_stringptr|opt_hidden, &daemon_smtp_port }, { "daemon_smtp_ports", opt_stringptr, &daemon_smtp_port }, { "daemon_startup_retries", opt_int, &daemon_startup_retries }, @@ -271,11 +272,6 @@ static optionlist optionlist_config[] = { #ifdef SUPPORT_TLS { "gnutls_allow_auto_pkcs11", opt_bool, &gnutls_allow_auto_pkcs11 }, { "gnutls_compat_mode", opt_bool, &gnutls_compat_mode }, - /* These three gnutls_require_* options stopped working in Exim 4.80 */ - /* From 4.83 we log a warning; a future relase will remove them */ - { "gnutls_require_kx", opt_stringptr, &gnutls_require_kx }, - { "gnutls_require_mac", opt_stringptr, &gnutls_require_mac }, - { "gnutls_require_protocols", opt_stringptr, &gnutls_require_proto }, #endif { "header_line_maxsize", opt_int, &header_line_maxsize }, { "header_maxsize", opt_int, &header_maxsize }, @@ -349,6 +345,7 @@ static optionlist optionlist_config[] = { #ifdef EXIM_PERL { "perl_at_start", opt_bool, &opt_perl_at_start }, { "perl_startup", opt_stringptr, &opt_perl_startup }, + { "perl_taintmode", opt_bool, &opt_perl_taintmode }, #endif #ifdef LOOKUP_PGSQL { "pgsql_servers", opt_stringptr, &pgsql_servers }, @@ -373,7 +370,7 @@ static optionlist optionlist_config[] = { { "queue_only_load_latch", opt_bool, &queue_only_load_latch }, { "queue_only_override", opt_bool, &queue_only_override }, { "queue_run_in_order", opt_bool, &queue_run_in_order }, - { "queue_run_max", opt_int, &queue_run_max }, + { "queue_run_max", opt_stringptr, &queue_run_max }, { "queue_smtp_domains", opt_stringptr, &queue_smtp_domains }, { "receive_timeout", opt_time, &receive_timeout }, { "received_header_text", opt_stringptr, &received_header_text }, @@ -935,10 +932,10 @@ for (;;) save->filename = config_filename; save->lineno = config_lineno; - config_file = Ufopen(ss, "rb"); - if (config_file == NULL) + if (!(config_file = Ufopen(ss, "rb"))) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to open included " "configuration file %s", ss); + config_filename = string_copy(ss); config_lineno = 0; continue; @@ -1988,7 +1985,7 @@ switch (type) inttype = US"octal "; /* Integer: a simple(ish) case; allow octal and hex formats, and - suffixes K and M. The different types affect output, not input. */ + suffixes K, M and G. The different types affect output, not input. */ case opt_mkint: case opt_int: @@ -2004,7 +2001,6 @@ switch (type) inttype, name); if (errno != ERANGE) - { if (tolower(*endptr) == 'k') { if (lvalue > INT_MAX/1024 || lvalue < INT_MIN/1024) errno = ERANGE; @@ -2018,7 +2014,13 @@ switch (type) else lvalue *= 1024*1024; endptr++; } - } + else if (tolower(*endptr) == 'g') + { + if (lvalue > INT_MAX/(1024*1024*1024) || lvalue < INT_MIN/(1024*1024*1024)) + errno = ERANGE; + else lvalue *= 1024*1024*1024; + endptr++; + } if (errno == ERANGE || lvalue > INT_MAX || lvalue < INT_MIN) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, @@ -2037,8 +2039,8 @@ switch (type) *((int *)((uschar *)data_block + (long int)(ol->value))) = value; break; - /* Integer held in K: again, allow octal and hex formats, and suffixes K and - M. */ + /* Integer held in K: again, allow octal and hex formats, and suffixes K, M + and G. */ /*XXX consider moving to int_eximarith_t (but mind the overflow test 0415) */ case opt_Kint: @@ -2052,22 +2054,26 @@ switch (type) inttype, name); if (errno != ERANGE) - { - if (tolower(*endptr) == 'm') + if (tolower(*endptr) == 'g') { - if (value > INT_MAX/1024 || value < INT_MIN/1024) errno = ERANGE; - else value *= 1024; + if (value > INT_MAX/(1024*1024) || value < INT_MIN/(1024*1024)) + errno = ERANGE; + else + value *= 1024*1024; endptr++; } - else if (tolower(*endptr) == 'k') + else if (tolower(*endptr) == 'm') { + if (value > INT_MAX/1024 || value < INT_MIN/1024) + errno = ERANGE; + else + value *= 1024; endptr++; } + else if (tolower(*endptr) == 'k') + endptr++; else - { value = (value + 512)/1024; - } - } if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "absolute value of integer \"%s\" is too large (overflow)", s); @@ -2649,7 +2655,7 @@ if (type == NULL) if (Ustrcmp(name, "config") == 0) { - print_config(admin_user); + print_config(admin_user, no_labels); return; } @@ -2947,7 +2953,7 @@ Returns: bool for "okay"; false will cause caller to immediately exit. #ifdef SUPPORT_TLS static BOOL -tls_dropprivs_validate_require_cipher(void) +tls_dropprivs_validate_require_cipher(BOOL nowarn) { const uschar *errmsg; pid_t pid; @@ -2961,9 +2967,9 @@ if ( !tls_advertise_hosts || Ustrcmp(tls_advertise_hosts, ":") == 0 ) return TRUE; -else if (!tls_certificate) - log_write(0, LOG_MAIN|LOG_PANIC, - "Warning: No server certificate defined; TLS connections will fail.\n" +else if (!nowarn && !tls_certificate) + log_write(0, LOG_MAIN, + "Warning: No server certificate defined; will use a selfsigned one.\n" " Suggested action: either install a certificate or change tls_advertise_hosts option"); oldsignal = signal(SIGCHLD, SIG_DFL); @@ -3006,6 +3012,234 @@ return status == 0; +/*************************************************/ +/* Create compile-time feature macros */ +static void +readconf_features(void) +{ +/* Probably we could work out a static initialiser for wherever +macros are stored, but this will do for now. Some names are awkward +due to conflicts with other common macros. */ + +#ifdef SUPPORT_CRYPTEQ + read_macro_assignment("_HAVE_CRYPTEQ=y"); +#endif +#if HAVE_ICONV + read_macro_assignment("_HAVE_ICONV=y"); +#endif +#if HAVE_IPV6 + read_macro_assignment("_HAVE_IPV6=y"); +#endif +#ifdef HAVE_SETCLASSRESOURCES + read_macro_assignment("_HAVE_SETCLASSRESOURCES=y"); +#endif +#ifdef SUPPORT_PAM + read_macro_assignment("_HAVE_PAM=y"); +#endif +#ifdef EXIM_PERL + read_macro_assignment("_HAVE_PERL=y"); +#endif +#ifdef EXPAND_DLFUNC + read_macro_assignment("_HAVE_DLFUNC=y"); +#endif +#ifdef USE_TCP_WRAPPERS + read_macro_assignment("_HAVE_TCPWRAPPERS=y"); +#endif +#ifdef SUPPORT_TLS + read_macro_assignment("_HAVE_TLS=y"); +# ifdef USE_GNUTLS + read_macro_assignment("_HAVE_GNUTLS=y"); +# else + read_macro_assignment("_HAVE_OPENSSL=y"); +# endif +#endif +#ifdef SUPPORT_TRANSLATE_IP_ADDRESS + read_macro_assignment("_HAVE_TRANSLATE_IP_ADDRESS=y"); +#endif +#ifdef SUPPORT_MOVE_FROZEN_MESSAGES + read_macro_assignment("_HAVE_MOVE_FROZEN_MESSAGES=y"); +#endif +#ifdef WITH_CONTENT_SCAN + read_macro_assignment("_HAVE_CONTENT_SCANNING=y"); +#endif +#ifndef DISABLE_DKIM + read_macro_assignment("_HAVE_DKIM=y"); +#endif +#ifndef DISABLE_DNSSEC + read_macro_assignment("_HAVE_DNSSEC=y"); +#endif +#ifndef DISABLE_EVENT + read_macro_assignment("_HAVE_Event=y"); +#endif +#ifdef SUPPORT_I18N + read_macro_assignment("_HAVE_I18N=y"); +#endif +#ifndef DISABLE_OCSP + read_macro_assignment("_HAVE_OCSP=y"); +#endif +#ifndef DISABLE_PRDR + read_macro_assignment("_HAVE_PRDR=y"); +#endif +#ifdef SUPPORT_PROXY + read_macro_assignment("_HAVE_PROXY=y"); +#endif +#ifdef SUPPORT_SOCKS + read_macro_assignment("_HAVE_SOCKS=y"); +#endif +#ifdef EXPERIMENTAL_LMDB + read_macro_assignment("_HAVE_LMDB=y"); +#endif +#ifdef EXPERIMENTAL_SPF + read_macro_assignment("_HAVE_SPF=y"); +#endif +#ifdef EXPERIMENTAL_SRS + read_macro_assignment("_HAVE_SRS=y"); +#endif +#ifdef EXPERIMENTAL_BRIGHTMAIL + read_macro_assignment("_HAVE_BRIGHTMAIL=y"); +#endif +#ifdef EXPERIMENTAL_DANE + read_macro_assignment("_HAVE_DANE=y"); +#endif +#ifdef EXPERIMENTAL_DCC + read_macro_assignment("_HAVE_DCC=y"); +#endif +#ifdef EXPERIMENTAL_DMARC + read_macro_assignment("_HAVE_DMARC=y"); +#endif +#ifdef EXPERIMENTAL_DSN_INFO + read_macro_assignment("_HAVE_DSN_INFO=y"); +#endif + +#ifdef LOOKUP_LSEARCH + read_macro_assignment("_HAVE_LKUP_LSEARCH=y"); +#endif +#ifdef LOOKUP_CDB + read_macro_assignment("_HAVE_LKUP_CDB=y"); +#endif +#ifdef LOOKUP_DBM + read_macro_assignment("_HAVE_LKUP_DBM=y"); +#endif +#ifdef LOOKUP_DNSDB + read_macro_assignment("_HAVE_LKUP_DNSDB=y"); +#endif +#ifdef LOOKUP_DSEARCH + read_macro_assignment("_HAVE_LKUP_DSEARCH=y"); +#endif +#ifdef LOOKUP_IBASE + read_macro_assignment("_HAVE_LKUP_IBASE=y"); +#endif +#ifdef LOOKUP_LDAP + read_macro_assignment("_HAVE_LKUP_LDAP=y"); +#endif +#ifdef EXPERIMENTAL_LMDB + read_macro_assignment("_HAVE_LKUP_LMDB=y"); +#endif +#ifdef LOOKUP_MYSQL + read_macro_assignment("_HAVE_LKUP_MYSQL=y"); +#endif +#ifdef LOOKUP_NIS + read_macro_assignment("_HAVE_LKUP_NIS=y"); +#endif +#ifdef LOOKUP_NISPLUS + read_macro_assignment("_HAVE_LKUP_NISPLUS=y"); +#endif +#ifdef LOOKUP_ORACLE + read_macro_assignment("_HAVE_LKUP_ORACLE=y"); +#endif +#ifdef LOOKUP_PASSWD + read_macro_assignment("_HAVE_LKUP_PASSWD=y"); +#endif +#ifdef LOOKUP_PGSQL + read_macro_assignment("_HAVE_LKUP_PGSQL=y"); +#endif +#ifdef LOOKUP_REDIS + read_macro_assignment("_HAVE_LKUP_REDIS=y"); +#endif +#ifdef LOOKUP_SQLITE + read_macro_assignment("_HAVE_LKUP_SQLITE=y"); +#endif +#ifdef LOOKUP_TESTDB + read_macro_assignment("_HAVE_LKUP_TESTDB=y"); +#endif +#ifdef LOOKUP_WHOSON + read_macro_assignment("_HAVE_LKUP_WHOSON=y"); +#endif + +#ifdef AUTH_CRAM_MD5 + read_macro_assignment("_HAVE_AUTH_CRAM_MD5=y"); +#endif +#ifdef AUTH_CYRUS_SASL + read_macro_assignment("_HAVE_AUTH_CYRUS_SASL=y"); +#endif +#ifdef AUTH_DOVECOT + read_macro_assignment("_HAVE_AUTH_DOVECOT=y"); +#endif +#ifdef AUTH_GSASL + read_macro_assignment("_HAVE_AUTH_GSASL=y"); +#endif +#ifdef AUTH_HEIMDAL_GSSAPI + read_macro_assignment("_HAVE_AUTH_HEIMDAL_GSSAPI=y"); +#endif +#ifdef AUTH_PLAINTEXT + read_macro_assignment("_HAVE_AUTH_PLAINTEXT=y"); +#endif +#ifdef AUTH_SPA + read_macro_assignment("_HAVE_AUTH_SPA=y"); +#endif +#ifdef AUTH_TLS + read_macro_assignment("_HAVE_AUTH_TLS=y"); +#endif + +#ifdef ROUTER_ACCEPT + read_macro_assignment("_HAVE_RTR_ACCEPT=y"); +#endif +#ifdef ROUTER_DNSLOOKUP + read_macro_assignment("_HAVE_RTR_DNSLOOKUP=y"); +#endif +#ifdef ROUTER_IPLITERAL + read_macro_assignment("_HAVE_RTR_IPLITERAL=y"); +#endif +#ifdef ROUTER_IPLOOKUP + read_macro_assignment("_HAVE_RTR_IPLOOKUP=y"); +#endif +#ifdef ROUTER_MANUALROUTE + read_macro_assignment("_HAVE_RTR_MANUALROUTE=y"); +#endif +#ifdef ROUTER_QUERYPROGRAM + read_macro_assignment("_HAVE_RTR_QUERYPROGRAM=y"); +#endif +#ifdef ROUTER_REDIRECT + read_macro_assignment("_HAVE_RTR_REDRCT=y"); +#endif + +#ifdef TRANSPORT_APPENDFILE + read_macro_assignment("_HAVE_TPT_APPENDFILE=y"); +# ifdef SUPPORT_MAILDIR + read_macro_assignment("_HAVE_TPT_APPEND_MAILDR=y"); +# endif +# ifdef SUPPORT_MAILSTORE + read_macro_assignment("_HAVE_TPT_APPEND_MAILSTORE=y"); +# endif +# ifdef SUPPORT_MBX + read_macro_assignment("_HAVE_TPT_APPEND_MBX=y"); +# endif +#endif +#ifdef TRANSPORT_AUTOREPLY + read_macro_assignment("_HAVE_TPT_AUTOREPLY=y"); +#endif +#ifdef TRANSPORT_LMTP + read_macro_assignment("_HAVE_TPT_LMTP=y"); +#endif +#ifdef TRANSPORT_PIPE + read_macro_assignment("_HAVE_TPT_PIPE=y"); +#endif +#ifdef TRANSPORT_SMTP + read_macro_assignment("_HAVE_TPT_SMTP=y"); +#endif +} + + /************************************************* * Read main configuration options * *************************************************/ @@ -3035,13 +3269,16 @@ systems. Therefore they are available only when requested by compile-time options. */ void -readconf_main(void) +readconf_main(BOOL nowarn) { int sep = 0; struct stat statbuf; uschar *s, *filename; const uschar *list = config_main_filelist; +/* First create compile-time feature macros */ +readconf_features(); + /* Loop through the possible file names */ while((filename = string_nextinlist(&list, &sep, big_buffer, big_buffer_size)) @@ -3473,7 +3710,7 @@ if ((tls_verify_hosts != NULL || tls_try_verify_hosts != NULL) && /* This also checks that the library linkage is working and we can call routines in it, so call even if tls_require_ciphers is unset */ -if (!tls_dropprivs_validate_require_cipher()) +if (!tls_dropprivs_validate_require_cipher(nowarn)) exit(1); /* Magic number: at time of writing, 1024 has been the long-standing value @@ -3496,17 +3733,12 @@ if (openssl_options != NULL) "openssl_options parse error: %s", openssl_options); # endif } - -if (gnutls_require_kx || gnutls_require_mac || gnutls_require_proto) - log_write(0, LOG_MAIN, "WARNING: main options" - " gnutls_require_kx, gnutls_require_mac and gnutls_require_protocols" - " are obsolete\n"); #endif /*SUPPORT_TLS*/ -if ((!add_environment || *add_environment == '\0') && !keep_environment) +if (!nowarn && !keep_environment && environ && *environ) log_write(0, LOG_MAIN, - "WARNING: purging the environment.\n" - " Suggested action: use keep_environment and add_environment."); + "Warning: purging the environment.\n" + " Suggested action: use keep_environment."); } @@ -4303,10 +4535,10 @@ current = next; /* List the parsed config lines, care about nice formatting and hide the values unless we're the admin user */ void -print_config(BOOL admin) +print_config(BOOL admin, BOOL terse) { config_line_item *i; -const int TS = 2; +const int TS = terse ? 0 : 2; int indent = 0; for (i = config_lines; i; i = i->next) @@ -4346,7 +4578,7 @@ for (i = config_lines; i; i = i->next) /* begin lines are left aligned */ else if (Ustrncmp(current, "begin", 5) == 0 && isspace(current[5])) { - puts(""); + if (!terse) puts(""); puts(CCS current); indent = TS; } @@ -4354,7 +4586,8 @@ for (i = config_lines; i; i = i->next) /* router/acl/transport block names */ else if (current[Ustrlen(current)-1] == ':' && !Ustrchr(current, '=')) { - printf("\n%*s%s\n", TS, "", current); + if (!terse) puts(""); + printf("%*s%s\n", TS, "", current); indent = 2 * TS; }