#endif
extern void init_lookup_list(void);
+extern void init_misc_mod_list(void);
#ifdef SA_SIGINFO
segv_handler(int sig, siginfo_t * info, void * uctx)
{
-log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (fault address: %p)", info->si_addr);
-# if defined(SEGV_MAPERR) && defined(SEGV_ACCERR) && defined(SEGV_BNDERR) && defined(SEGV_PKUERR)
-switch (info->si_code)
+if (!panic_coredump)
{
- case SEGV_MAPERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_MAPERR"); break;
- case SEGV_ACCERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_ACCERR"); break;
- case SEGV_BNDERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_BNDERR"); break;
- case SEGV_PKUERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_PKUERR"); break;
+ log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (fault address: %p)", info->si_addr);
+ # if defined(SEGV_MAPERR) && defined(SEGV_ACCERR) && defined(SEGV_BNDERR) && defined(SEGV_PKUERR)
+ switch (info->si_code)
+ {
+ case SEGV_MAPERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_MAPERR"); break;
+ case SEGV_ACCERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_ACCERR"); break;
+ case SEGV_BNDERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_BNDERR"); break;
+ case SEGV_PKUERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_PKUERR"); break;
+ }
+ # endif
}
-# endif
-if (US info->si_addr < US 4096)
+if (panic_coredump)
+ log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (deliberate trap)");
+else if (US info->si_addr < US 4096)
log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (null pointer indirection)");
else
log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (maybe attempt to write to immutable memory)");
if (process_info_len > 0)
- log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (%.*s)", process_info_len, process_info);
+ log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (%s: %.*s)",
+ process_purpose, process_info_len, process_info);
stackdump();
signal(SIGSEGV, SIG_DFL);
kill(getpid(), sig);
}
+static gstring *
+lookup_show_supported(gstring * g)
+{
+gstring * b = NULL, * d = NULL;
+
+#ifdef LOOKUP_LSEARCH
+# if LOOKUP_LSEARCH!=2
+ b = string_cat(b, US" lsearch wildlsearch nwildlsearch iplsearch");
+# else
+ d = string_cat(d, US" lsearch wildlsearch nwildlsearch iplsearch");
+# endif
+#endif
+#ifdef LOOKUP_CDB
+# if LOOKUP_CDB!=2
+ b = string_cat(b, US" cdb");
+# else
+ d = string_cat(d, US" cdb");
+# endif
+#endif
+#ifdef LOOKUP_DBM
+# if LOOKUP_DBM!=2
+ b = string_cat(b, US" dbm dbmjz dbmnz");
+# else
+ d = string_cat(d, US" dbm dbmjz dbmnz");
+# endif
+#endif
+#ifdef LOOKUP_DNSDB
+# if LOOKUP_DNSDB!=2
+ b = string_cat(b, US" dnsdb");
+# else
+ d = string_cat(d, US" dnsdb");
+# endif
+#endif
+#ifdef LOOKUP_DSEARCH
+# if LOOKUP_DSEARCH!=2
+ b = string_cat(b, US" dsearch");
+# else
+ d = string_cat(d, US" dsearch");
+# endif
+#endif
+#ifdef LOOKUP_IBASE
+# if LOOKUP_IBASE!=2
+ b = string_cat(b, US" ibase");
+# else
+ d = string_cat(d, US" ibase");
+# endif
+#endif
+#ifdef LOOKUP_JSON
+# if LOOKUP_JSON!=2
+ b = string_cat(b, US" json");
+# else
+ d = string_cat(d, US" json");
+# endif
+#endif
+#ifdef LOOKUP_LDAP
+# if LOOKUP_LDAP!=2
+ b = string_cat(b, US" ldap ldapdn ldapm");
+# else
+ d = string_cat(d, US" ldap ldapdn ldapm");
+# endif
+#endif
+#ifdef LOOKUP_LMDB
+# if LOOKUP_LMDB!=2
+ b = string_cat(b, US" lmdb");
+# else
+ d = string_cat(d, US" lmdb");
+# endif
+#endif
+#ifdef LOOKUP_MYSQL
+# if LOOKUP_MYSQL!=2
+ b = string_cat(b, US" mysql");
+# else
+ d = string_cat(d, US" mysql");
+# endif
+#endif
+#ifdef LOOKUP_NIS
+# if LOOKUP_NIS!=2
+ b = string_cat(b, US" nis nis0");
+# else
+ d = string_cat(d, US" nis nis0");
+# endif
+#endif
+#ifdef LOOKUP_NISPLUS
+# if LOOKUP_NISPLUS!=2
+ b = string_cat(b, US" nisplus");
+# else
+ d = string_cat(d, US" nisplus");
+# endif
+#endif
+#ifdef LOOKUP_ORACLE
+# if LOOKUP_ORACLE!=2
+ b = string_cat(b, US" oracle");
+# else
+ d = string_cat(d, US" oracle");
+# endif
+#endif
+#ifdef LOOKUP_PASSWD
+# if LOOKUP_PASSWD!=2
+ b = string_cat(b, US" passwd");
+# else
+ d = string_cat(d, US" passwd");
+# endif
+#endif
+#ifdef LOOKUP_PGSQL
+# if LOOKUP_PGSQL!=2
+ b = string_cat(b, US" pgsql");
+# else
+ d = string_cat(d, US" pgsql");
+# endif
+#endif
+#ifdef LOOKUP_REDIS
+# if LOOKUP_REDIS!=2
+ b = string_cat(b, US" redis");
+# else
+ d = string_cat(d, US" redis");
+# endif
+#endif
+#ifdef SUPPORT_SPF
+# if SUPPORT_SPF!=2
+ b = string_cat(b, US" spf");
+# else
+ d = string_cat(d, US" spf");
+# endif
+#endif
+#ifdef LOOKUP_SQLITE
+# if LOOKUP_SQLITE!=2
+ b = string_cat(b, US" sqlite");
+# else
+ d = string_cat(d, US" sqlite");
+# endif
+#endif
+#ifdef LOOKUP_TESTDB
+# if LOOKUP_TESTDB!=2
+ b = string_cat(b, US" testdb");
+# else
+ d = string_cat(d, US" testdb");
+# endif
+#endif
+#ifdef LOOKUP_WHOSON
+# if LOOKUP_WHOSON!=2
+ b = string_cat(b, US" whoson");
+# else
+ d = string_cat(d, US" whoson");
+# endif
+#endif
+
+if (b) g = string_fmt_append(g, "Lookups (built-in):%Y\n", b);
+if (d) g = string_fmt_append(g, "Lookups (dynamic): %Y\n", d);
+return g;
+}
+
+
+static void
+lookup_version_report_cb(uschar * name, uschar * ptr, void * ctx)
+{
+const lookup_info * li = (lookup_info *)ptr;
+gstring ** gp = ctx;
+
+if (li->version_report)
+ *gp = li->version_report(*gp);
+}
+
+
/* This function is called for -bV/--version and for -d to output the optional
features of the current Exim binary.
#endif
g = string_cat(g, US"\n");
-g = string_cat(g, US"Lookups (built-in):");
-#if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
- g = string_cat(g, US" lsearch wildlsearch nwildlsearch iplsearch");
-#endif
-#if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
- g = string_cat(g, US" cdb");
-#endif
-#if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
- g = string_cat(g, US" dbm dbmjz dbmnz");
-#endif
-#if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
- g = string_cat(g, US" dnsdb");
-#endif
-#if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
- g = string_cat(g, US" dsearch");
-#endif
-#if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
- g = string_cat(g, US" ibase");
-#endif
-#if defined(LOOKUP_JSON) && LOOKUP_JSON!=2
- g = string_cat(g, US" json");
-#endif
-#if defined(LOOKUP_LDAP) && LOOKUP_LDAP!=2
- g = string_cat(g, US" ldap ldapdn ldapm");
-#endif
-#ifdef LOOKUP_LMDB
- g = string_cat(g, US" lmdb");
-#endif
-#if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
- g = string_cat(g, US" mysql");
-#endif
-#if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
- g = string_cat(g, US" nis nis0");
-#endif
-#if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
- g = string_cat(g, US" nisplus");
-#endif
-#if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
- g = string_cat(g, US" oracle");
-#endif
-#if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
- g = string_cat(g, US" passwd");
-#endif
-#if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
- g = string_cat(g, US" pgsql");
-#endif
-#if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
- g = string_cat(g, US" redis");
-#endif
-#if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
- g = string_cat(g, US" sqlite");
-#endif
-#if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
- g = string_cat(g, US" testdb");
-#endif
-#if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
- g = string_cat(g, US" whoson");
-#endif
-g = string_cat(g, US"\n");
-
+g = lookup_show_supported(g);
g = auth_show_supported(g);
g = route_show_supported(g);
g = transport_show_supported(g);
gnu_get_libc_version());
#endif
-g = show_db_version(g);
+ g = show_db_version(g);
#ifndef DISABLE_TLS
g = tls_version_report(g);
#ifdef SUPPORT_I18N
g = utf8_version_report(g);
#endif
-#ifdef SUPPORT_DMARC
- g = dmarc_version_report(g);
-#endif
-#ifdef SUPPORT_SPF
- g = spf_lib_version_report(g);
-#endif
-show_string(is_stdout, g);
-g = NULL;
+/*XXX do we need a "show misc-mods version-report" ?
+Currently they are output in misc_mod_add() */
-for (auth_info * authi = auths_available; *authi->driver_name != '\0'; ++authi)
- if (authi->version_report)
- g = (*authi->version_report)(g);
+ show_string(is_stdout, g);
+ g = NULL;
+
+ for (auth_info * ai = auths_available; ai; ai = (auth_info *)ai->drinfo.next)
+ if (ai->version_report)
+ g = (*ai->version_report)(g);
/* PCRE_PRERELEASE is either defined and empty or a bare sequence of
characters; unless it's an ancient version of PCRE in which case it
#endif
#define QUOTE(X) #X
#define EXPAND_AND_QUOTE(X) QUOTE(X)
- {
- uschar buf[24];
- pcre2_config(PCRE2_CONFIG_VERSION, buf);
- g = string_fmt_append(g, "Library version: PCRE2: Compile: %d.%d%s\n"
- " Runtime: %s\n",
- PCRE2_MAJOR, PCRE2_MINOR,
- EXPAND_AND_QUOTE(PCRE2_PRERELEASE) "",
- buf);
- }
+ {
+ uschar buf[24];
+ pcre2_config(PCRE2_CONFIG_VERSION, buf);
+ g = string_fmt_append(g, "Library version: PCRE2: Compile: %d.%d%s\n"
+ " Runtime: %s\n",
+ PCRE2_MAJOR, PCRE2_MINOR,
+ EXPAND_AND_QUOTE(PCRE2_PRERELEASE) "",
+ buf);
+ }
#undef QUOTE
#undef EXPAND_AND_QUOTE
-show_string(is_stdout, g);
-g = NULL;
+ show_string(is_stdout, g);
+ g = NULL;
-init_lookup_list();
-for (int i = 0; i < lookup_list_count; i++)
- if (lookup_list[i]->version_report)
- g = lookup_list[i]->version_report(g);
-show_string(is_stdout, g);
-g = NULL;
+ init_lookup_list();
+ tree_walk(lookups_tree, lookup_version_report_cb, &g);
+ show_string(is_stdout, g);
+ g = NULL;
+ init_misc_mod_list();
#ifdef WHITELIST_D_MACROS
g = string_fmt_append(g, "WHITELIST_D_MACROS: \"%s\"\n", WHITELIST_D_MACROS);
(void) macros_expand(0, &len, &dummy_macexp);
+#ifdef LOOKUP_MODULE_DIR
+//mod_load_check(big_buffer);
+#endif
+
if (isupper(big_buffer[0]))
{
if (macro_read_assignment(big_buffer))
This needs to happen before we read the main configuration. */
init_lookup_list();
+init_misc_mod_list();
/*XXX this excrescence could move to the testsuite standard config setup file */
#ifdef SUPPORT_I18N
"**** 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)
{
(usually "connection refused: <reason>") and writing another one is
unnecessary clutter. */
-connection_id = getpid();
+set_connection_id();
if (smtp_input)
{
smtp_in = stdin;