summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/bin/named/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/bin/named/main.c')
-rw-r--r--contrib/bind9/bin/named/main.c132
1 files changed, 121 insertions, 11 deletions
diff --git a/contrib/bind9/bin/named/main.c b/contrib/bind9/bin/named/main.c
index a1d94ff..84d86b1 100644
--- a/contrib/bind9/bin/named/main.c
+++ b/contrib/bind9/bin/named/main.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: main.c,v 1.166.34.7 2010-09-15 12:16:49 marka Exp $ */
+/* $Id: main.c,v 1.180 2010-12-22 03:59:02 marka Exp $ */
/*! \file */
@@ -26,6 +26,7 @@
#include <string.h>
#include <isc/app.h>
+#include <isc/backtrace.h>
#include <isc/commandline.h>
#include <isc/dir.h>
#include <isc/entropy.h>
@@ -69,6 +70,12 @@
#include <named/ns_smf_globals.h>
#endif
+#ifdef OPENSSL
+#include <openssl/opensslv.h>
+#endif
+#ifdef HAVE_LIBXML2
+#include <libxml/xmlversion.h>
+#endif
/*
* Include header files for database drivers here.
*/
@@ -81,12 +88,20 @@
#include <dlz/dlz_drivers.h>
#endif
+/*
+ * The maximum number of stack frames to dump on assertion failure.
+ */
+#ifndef BACKTRACE_MAXFRAME
+#define BACKTRACE_MAXFRAME 128
+#endif
+
static isc_boolean_t want_stats = ISC_FALSE;
static char program_name[ISC_DIR_NAMEMAX] = "named";
static char absolute_conffile[ISC_DIR_PATHMAX];
static char saved_command_line[512];
static char version[512];
static unsigned int maxsocks = 0;
+static int maxudp = 0;
void
ns_main_earlywarning(const char *format, ...) {
@@ -129,10 +144,20 @@ ns_main_earlyfatal(const char *format, ...) {
exit(1);
}
+ISC_PLATFORM_NORETURN_PRE static void
+assertion_failed(const char *file, int line, isc_assertiontype_t type,
+ const char *cond) ISC_PLATFORM_NORETURN_POST;
+
static void
assertion_failed(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
+ void *tracebuf[BACKTRACE_MAXFRAME];
+ int i, nframes;
+ isc_result_t result;
+ const char *logsuffix = "";
+ const char *fname;
+
/*
* Handle assertion failures.
*/
@@ -144,10 +169,40 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
*/
isc_assertion_setcallback(NULL);
+ result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME,
+ &nframes);
+ if (result == ISC_R_SUCCESS && nframes > 0)
+ logsuffix = ", back trace";
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
- "%s:%d: %s(%s) failed", file, line,
- isc_assertion_typetotext(type), cond);
+ "%s:%d: %s(%s) failed%s", file, line,
+ isc_assertion_typetotext(type), cond, logsuffix);
+ if (result == ISC_R_SUCCESS) {
+ for (i = 0; i < nframes; i++) {
+ unsigned long offset;
+
+ fname = NULL;
+ result = isc_backtrace_getsymbol(tracebuf[i],
+ &fname,
+ &offset);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in %s()+0x%lx", i,
+ tracebuf[i], fname,
+ offset);
+ } else {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in ??", i,
+ tracebuf[i]);
+ }
+ }
+ }
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
"exiting (due to assertion failure)");
@@ -162,9 +217,10 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
exit(1);
}
-static void
+ISC_PLATFORM_NORETURN_PRE static void
library_fatal_error(const char *file, int line, const char *format,
- va_list args) ISC_FORMAT_PRINTF(3, 0);
+ va_list args)
+ISC_FORMAT_PRINTF(3, 0) ISC_PLATFORM_NORETURN_POST;
static void
library_fatal_error(const char *file, int line, const char *format,
@@ -248,8 +304,9 @@ usage(void) {
}
fprintf(stderr,
"usage: named [-4|-6] [-c conffile] [-d debuglevel] "
- "[-f|-g] [-n number_of_cpus]\n"
- " [-p port] [-s] [-t chrootdir] [-u username]\n"
+ "[-E engine] [-f|-g]\n"
+ " [-n number_of_cpus] [-p port] [-s] "
+ "[-t chrootdir] [-u username]\n"
" [-m {usage|trace|record|size|mctx}]\n");
}
@@ -358,7 +415,7 @@ parse_command_line(int argc, char *argv[]) {
isc_commandline_errprint = ISC_FALSE;
while ((ch = isc_commandline_parse(argc, argv,
- "46c:C:d:fgi:lm:n:N:p:P:"
+ "46c:C:d:E:fFgi:lm:n:N:p:P:"
"sS:t:T:u:vVx:")) != -1) {
switch (ch) {
case '4':
@@ -394,6 +451,9 @@ parse_command_line(int argc, char *argv[]) {
ns_g_debuglevel = parse_int(isc_commandline_argument,
"debug level");
break;
+ case 'E':
+ ns_g_engine = isc_commandline_argument;
+ break;
case 'f':
ns_g_foreground = ISC_TRUE;
break;
@@ -451,12 +511,16 @@ parse_command_line(int argc, char *argv[]) {
* clienttest: make clients single shot with their
* own memory context.
*/
- if (strcmp(isc_commandline_argument, "clienttest") == 0)
+ if (!strcmp(isc_commandline_argument, "clienttest"))
ns_g_clienttest = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "nosoa"))
ns_g_nosoa = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "noaa"))
ns_g_noaa = ISC_TRUE;
+ else if (!strcmp(isc_commandline_argument, "maxudp512"))
+ maxudp = 512;
+ else if (!strcmp(isc_commandline_argument, "maxudp1460"))
+ maxudp = 1460;
else
fprintf(stderr, "unknown -T flag '%s\n",
isc_commandline_argument);
@@ -470,13 +534,25 @@ parse_command_line(int argc, char *argv[]) {
case 'V':
printf("BIND %s built with %s\n", ns_g_version,
ns_g_configargs);
+#ifdef OPENSSL
+ printf("using OpenSSL version: %s\n",
+ OPENSSL_VERSION_TEXT);
+#endif
+#ifdef HAVE_LIBXML2
+ printf("using libxml2 version: %s\n",
+ LIBXML_DOTTED_VERSION);
+#endif
exit(0);
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
usage();
if (isc_commandline_option == '?')
exit(0);
ns_main_earlyfatal("unknown option '-%c'",
isc_commandline_option);
+ /* FALLTHROUGH */
default:
ns_main_earlyfatal("parsing options returned %d", ch);
}
@@ -529,6 +605,7 @@ create_managers(void) {
isc_result_totext(result));
return (ISC_R_UNEXPECTED);
}
+ isc__socketmgr_maxudp(ns_g_socketmgr, maxudp);
result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &socks);
if (result == ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
@@ -579,6 +656,34 @@ destroy_managers(void) {
}
static void
+dump_symboltable() {
+ int i;
+ isc_result_t result;
+ const char *fname;
+ const void *addr;
+
+ if (isc__backtrace_nsymbols == 0)
+ return;
+
+ if (!isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(99)))
+ return;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
+ ISC_LOG_DEBUG(99), "Symbol table:");
+
+ for (i = 0, result = ISC_R_SUCCESS; result == ISC_R_SUCCESS; i++) {
+ addr = NULL;
+ fname = NULL;
+ result = isc_backtrace_getsymbolfromindex(i, &addr, &fname);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN, ISC_LOG_DEBUG(99),
+ "[%d] %p %s", i, addr, fname);
+ }
+ }
+}
+
+static void
setup(void) {
isc_result_t result;
isc_resourcevalue_t old_openfiles;
@@ -685,6 +790,8 @@ setup(void) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
ISC_LOG_NOTICE, "built with %s", ns_g_configargs);
+ dump_symboltable();
+
/*
* Get the initial resource limits.
*/
@@ -723,8 +830,8 @@ setup(void) {
absolute_conffile,
sizeof(absolute_conffile));
if (result != ISC_R_SUCCESS)
- ns_main_earlyfatal("could not construct absolute path of "
- "configuration file: %s",
+ ns_main_earlyfatal("could not construct absolute path "
+ "of configuration file: %s",
isc_result_totext(result));
ns_g_conffile = absolute_conffile;
}
@@ -896,6 +1003,9 @@ main(int argc, char *argv[]) {
if (strcmp(program_name, "lwresd") == 0)
ns_g_lwresdonly = ISC_TRUE;
+ if (result != ISC_R_SUCCESS)
+ ns_main_earlyfatal("failed to build internal symbol table");
+
isc_assertion_setcallback(assertion_failed);
isc_error_setfatal(library_fatal_error);
isc_error_setunexpected(library_unexpected_error);
OpenPOWER on IntegriCloud