📄 main.c
字号:
} } argc -= isc_commandline_index; argv += isc_commandline_index; if (argc > 0) { usage(); ns_main_earlyfatal("extra command line arguments"); }}static isc_result_tcreate_managers(void) { isc_result_t result;#ifdef ISC_PLATFORM_USETHREADS unsigned int cpus_detected;#endif#ifdef ISC_PLATFORM_USETHREADS cpus_detected = isc_os_ncpus(); if (ns_g_cpus == 0) ns_g_cpus = cpus_detected; isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_INFO, "found %u CPU%s, using %u worker thread%s", cpus_detected, cpus_detected == 1 ? "" : "s", ns_g_cpus, ns_g_cpus == 1 ? "" : "s");#else ns_g_cpus = 1;#endif result = isc_taskmgr_create(ns_g_mctx, ns_g_cpus, 0, &ns_g_taskmgr); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "ns_taskmgr_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } result = isc_timermgr_create(ns_g_mctx, &ns_g_timermgr); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "ns_timermgr_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } result = isc_socketmgr_create(ns_g_mctx, &ns_g_socketmgr); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_socketmgr_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } result = isc_entropy_create(ns_g_mctx, &ns_g_entropy); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_entropy_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } result = isc_hash_create(ns_g_mctx, ns_g_entropy, DNS_NAME_MAXWIRE); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_hash_create() failed: %s", isc_result_totext(result)); return (ISC_R_UNEXPECTED); } return (ISC_R_SUCCESS);}static voiddestroy_managers(void) { ns_lwresd_shutdown(); isc_entropy_detach(&ns_g_entropy); if (ns_g_fallbackentropy != NULL) isc_entropy_detach(&ns_g_fallbackentropy); /* * isc_taskmgr_destroy() will block until all tasks have exited, */ isc_taskmgr_destroy(&ns_g_taskmgr); isc_timermgr_destroy(&ns_g_timermgr); isc_socketmgr_destroy(&ns_g_socketmgr); /* * isc_hash_destroy() cannot be called as long as a resolver may be * running. Calling this after isc_taskmgr_destroy() ensures the * call is safe. */ isc_hash_destroy();}static voidsetup(void) { isc_result_t result; /* * Get the user and group information before changing the root * directory, so the administrator does not need to keep a copy * of the user and group databases in the chroot'ed environment. */ ns_os_inituserinfo(ns_g_username); /* * Initialize time conversion information */ ns_os_tzset(); ns_os_opendevnull();#ifdef PATH_RANDOMDEV /* * Initialize system's random device as fallback entropy source * if running chroot'ed. */ if (ns_g_chrootdir != NULL) { result = isc_entropy_create(ns_g_mctx, &ns_g_fallbackentropy); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("isc_entropy_create() failed: %s", isc_result_totext(result)); result = isc_entropy_createfilesource(ns_g_fallbackentropy, PATH_RANDOMDEV); if (result != ISC_R_SUCCESS) { ns_main_earlywarning("could not open pre-chroot " "entropy source %s: %s", PATH_RANDOMDEV, isc_result_totext(result)); isc_entropy_detach(&ns_g_fallbackentropy); } }#endif ns_os_chroot(ns_g_chrootdir); /* * For operating systems which have a capability mechanism, now * is the time to switch to minimal privs and change our user id. * On traditional UNIX systems, this call will be a no-op, and we * will change the user ID after reading the config file the first * time. (We need to read the config file to know which possibly * privileged ports to bind() to.) */ ns_os_minprivs(); result = ns_log_init(ISC_TF(ns_g_username != NULL)); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("ns_log_init() failed: %s", isc_result_totext(result)); /* * Now is the time to daemonize (if we're not running in the * foreground). We waited until now because we wanted to get * a valid logging context setup. We cannot daemonize any later, * because calling create_managers() will create threads, which * would be lost after fork(). */ if (!ns_g_foreground) ns_os_daemonize(); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ISC_LOG_NOTICE, "starting BIND %s%s", ns_g_version, saved_command_line); /* * Get the initial resource limits. */ (void)isc_resource_getlimit(isc_resource_stacksize, &ns_g_initstacksize); (void)isc_resource_getlimit(isc_resource_datasize, &ns_g_initdatasize); (void)isc_resource_getlimit(isc_resource_coresize, &ns_g_initcoresize); (void)isc_resource_getlimit(isc_resource_openfiles, &ns_g_initopenfiles); /* * If the named configuration filename is relative, prepend the current * directory's name before possibly changing to another directory. */ if (! isc_file_isabsolute(ns_g_conffile)) { result = isc_file_absolutepath(ns_g_conffile, absolute_conffile, sizeof(absolute_conffile)); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("could not construct absolute path of " "configuration file: %s", isc_result_totext(result)); ns_g_conffile = absolute_conffile; } result = create_managers(); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("create_managers() failed: %s", isc_result_totext(result)); ns_builtin_init(); /* * Add calls to register sdb drivers here. */ /* xxdb_init(); */ mysqldb_init(); ns_server_create(ns_g_mctx, &ns_g_server);}static voidcleanup(void) { destroy_managers(); ns_server_destroy(&ns_g_server); ns_builtin_deinit(); /* * Add calls to unregister sdb drivers here. */ /* xxdb_clear(); */ mysqldb_clear(); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ISC_LOG_NOTICE, "exiting"); ns_log_shutdown();}static char *memstats = NULL;voidns_main_setmemstats(const char *filename) { /* * Caller has to ensure locking. */ if (memstats != NULL) { free(memstats); memstats = NULL; } if (filename == NULL) return; memstats = malloc(strlen(filename) + 1); if (memstats) strcpy(memstats, filename);}#ifdef HAVE_LIBSCF/* * Get FMRI for the current named process */static char *scf_get_ins_name(void) { scf_handle_t *h = NULL; int namelen; char *ins_name; if ((h = scf_handle_create(SCF_VERSION)) == NULL) { UNEXPECTED_ERROR(__FILE__, __LINE__, "scf_handle_create() failed: %s", scf_strerror(scf_error())); return (NULL); } if (scf_handle_bind(h) == -1) { UNEXPECTED_ERROR(__FILE__, __LINE__, "scf_handle_bind() failed: %s", scf_strerror(scf_error())); scf_handle_destroy(h); return (NULL); } if ((namelen = scf_myname(h, NULL, 0)) == -1) { isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ISC_LOG_INFO, "scf_myname() failed: %s", scf_strerror(scf_error())); scf_handle_destroy(h); return (NULL); } if ((ins_name = malloc(namelen + 1)) == NULL) { UNEXPECTED_ERROR(__FILE__, __LINE__, "scf_get_ins_named() memory " "allocation failed: %s", isc_result_totext(ISC_R_NOMEMORY)); scf_handle_destroy(h); return (NULL); } if (scf_myname(h, ins_name, namelen + 1) == -1) { UNEXPECTED_ERROR(__FILE__, __LINE__, "scf_myname() failed: %s", scf_strerror(scf_error())); scf_handle_destroy(h); free(ins_name); return (NULL); } scf_handle_destroy(h); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ISC_LOG_INFO, "instance name:%s", ins_name); return (ins_name);}static voidscf_cleanup(void) { char *s; char *ins_name; if ((ins_name = scf_get_ins_name()) != NULL) { if ((s = smf_get_state(ins_name)) != NULL) { if ((strcmp(SCF_STATE_STRING_ONLINE, s) == 0) || (strcmp(SCF_STATE_STRING_DEGRADED, s) == 0)) { if (smf_disable_instance(ins_name, 0) != 0) { UNEXPECTED_ERROR(__FILE__, __LINE__, "smf_disable_instance() failed: %s", scf_strerror(scf_error())); } } free(s); } else { UNEXPECTED_ERROR(__FILE__, __LINE__, "smf_get_state() failed: %s", scf_strerror(scf_error())); } free(ins_name); }}#endifintmain(int argc, char *argv[]) { isc_result_t result; /* * Record version in core image. * strings named.core | grep "named version:" */ strlcat(version,#ifdef __DATE__ "named version: BIND " VERSION " (" __DATE__ ")",#else "named version: BIND " VERSION,#endif sizeof(version)); result = isc_file_progname(*argv, program_name, sizeof(program_name)); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("program name too long"); if (strcmp(program_name, "lwresd") == 0) ns_g_lwresdonly = ISC_TRUE; isc_assertion_setcallback(assertion_failed); isc_error_setfatal(library_fatal_error); isc_error_setunexpected(library_unexpected_error); ns_os_init(program_name); result = isc_app_start(); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("isc_app_start() failed: %s", isc_result_totext(result)); dns_result_register(); dst_result_register(); isccc_result_register(); parse_command_line(argc, argv); /* * Warn about common configuration error. */ if (ns_g_chrootdir != NULL) { int len = strlen(ns_g_chrootdir); if (strncmp(ns_g_chrootdir, ns_g_conffile, len) == 0 && (ns_g_conffile[len] == '/' || ns_g_conffile[len] == '\\')) ns_main_earlywarning("config filename (-c %s) contains " "chroot path (-t %s)", ns_g_conffile, ns_g_chrootdir); } result = isc_mem_create(0, 0, &ns_g_mctx); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("isc_mem_create() failed: %s", isc_result_totext(result)); setup(); /* * Start things running and then wait for a shutdown request * or reload. */ do { result = isc_app_run(); if (result == ISC_R_RELOAD) { ns_server_reloadwanted(ns_g_server); } else if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_app_run(): %s", isc_result_totext(result)); /* * Force exit. */ result = ISC_R_SUCCESS; } } while (result != ISC_R_SUCCESS);#ifdef HAVE_LIBSCF scf_cleanup();#endif cleanup(); if (want_stats) { isc_mem_stats(ns_g_mctx, stdout); isc_mutex_stats(stdout); } if (memstats != NULL) { FILE *fp = NULL; result = isc_stdio_open(memstats, "w", &fp); if (result == ISC_R_SUCCESS) { isc_mem_stats(ns_g_mctx, fp); isc_mutex_stats(fp); isc_stdio_close(fp); } } isc_mem_destroy(&ns_g_mctx); ns_main_setmemstats(NULL); isc_app_finish(); ns_os_closedevnull(); ns_os_shutdown(); return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -