diff options
Diffstat (limited to 'src/zabbix_agent/zabbix_agentd.c')
-rw-r--r-- | src/zabbix_agent/zabbix_agentd.c | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c index 1ccb132b05c..59a5446b826 100644 --- a/src/zabbix_agent/zabbix_agentd.c +++ b/src/zabbix_agent/zabbix_agentd.c @@ -86,6 +86,7 @@ int CONFIG_HEARTBEAT_FREQUENCY = 60; #include "stats.h" #ifdef _WINDOWS # include "perfstat.h" +# include "zbxwin32.h" #else # include "zbxnix.h" #endif @@ -242,6 +243,13 @@ static unsigned char get_program_type(void) return program_type; } +#if defined(_WINDOWS) || defined(__MINGW32__) +static const char *get_progname(void) +{ + return progname; +} +#endif + static zbx_thread_activechk_args *config_active_args = NULL; int CONFIG_ALERTER_FORKS = 0; @@ -279,11 +287,15 @@ int CONFIG_AVAILMAN_FORKS = 0; int CONFIG_SERVICEMAN_FORKS = 0; int CONFIG_TRIGGERHOUSEKEEPER_FORKS = 0; +static char *config_file = NULL; +static int config_allow_root = 0; + +static zbx_config_log_t log_file_cfg = {NULL, NULL, LOG_TYPE_UNDEFINED, 1}; + char *opt = NULL; #ifdef _WINDOWS void zbx_co_uninitialize(); -int zbx_win_exception_filter(struct _EXCEPTION_POINTERS *ep); #endif int get_process_info_by_thread(int local_server_num, unsigned char *local_process_type, int *local_process_num); @@ -346,8 +358,8 @@ static int parse_commandline(int argc, char **argv, ZBX_TASK_EX *t) switch (ch) { case 'c': - if (NULL == CONFIG_FILE) - CONFIG_FILE = strdup(zbx_optarg); + if (NULL == config_file) + config_file = strdup(zbx_optarg); break; #ifndef _WINDOWS case 'R': @@ -525,13 +537,13 @@ static int parse_commandline(int argc, char **argv, ZBX_TASK_EX *t) goto out; } - if (NULL == CONFIG_FILE) - CONFIG_FILE = zbx_strdup(NULL, DEFAULT_CONFIG_FILE); + if (NULL == config_file) + config_file = zbx_strdup(NULL, DEFAULT_CONFIG_FILE); out: if (FAIL == ret) { zbx_free(TEST_METRIC); - zbx_free(CONFIG_FILE); + zbx_free(config_file); } return ret; @@ -595,8 +607,8 @@ static void set_defaults(void) if (NULL == CONFIG_PID_FILE) CONFIG_PID_FILE = (char *)"/tmp/zabbix_agentd.pid"; #endif - if (NULL == CONFIG_LOG_TYPE_STR) - CONFIG_LOG_TYPE_STR = zbx_strdup(CONFIG_LOG_TYPE_STR, ZBX_OPTION_LOGTYPE_FILE); + if (NULL == log_file_cfg.log_type_str) + log_file_cfg.log_type_str = zbx_strdup(log_file_cfg.log_type_str, ZBX_OPTION_LOGTYPE_FILE); } /****************************************************************************** @@ -672,7 +684,7 @@ static void zbx_validate_config(ZBX_TASK_EX *task) err = 1; } - if (SUCCEED != zbx_validate_log_parameters(task)) + if (SUCCEED != zbx_validate_log_parameters(task, &log_file_cfg)) err = 1; #if !(defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)) @@ -735,6 +747,7 @@ static int add_serveractive_host_cb(const zbx_vector_ptr_t *addrs, zbx_vector_st hostnames->values[i] : ""); config_active_args[forks].zbx_config_tls = zbx_config_tls; config_active_args[forks].zbx_get_program_type_cb_arg = get_program_type; + config_active_args[forks].config_file = config_file; } return SUCCEED; @@ -844,11 +857,11 @@ static void zbx_load_config(int requirement, ZBX_TASK_EX *task) {"PidFile", &CONFIG_PID_FILE, TYPE_STRING, PARM_OPT, 0, 0}, #endif - {"LogType", &CONFIG_LOG_TYPE_STR, TYPE_STRING, + {"LogType", &log_file_cfg.log_type_str, TYPE_STRING, PARM_OPT, 0, 0}, - {"LogFile", &CONFIG_LOG_FILE, TYPE_STRING, + {"LogFile", &log_file_cfg.log_file_name, TYPE_STRING, PARM_OPT, 0, 0}, - {"LogFileSize", &CONFIG_LOG_FILE_SIZE, TYPE_INT, + {"LogFileSize", &log_file_cfg.log_file_size, TYPE_INT, PARM_OPT, 0, 1024}, {"Timeout", &CONFIG_TIMEOUT, TYPE_INT, PARM_OPT, 1, 30}, @@ -884,7 +897,7 @@ static void zbx_load_config(int requirement, ZBX_TASK_EX *task) PARM_OPT, 0, 0}, {"LoadModule", &CONFIG_LOAD_MODULE, TYPE_MULTISTRING, PARM_OPT, 0, 0}, - {"AllowRoot", &CONFIG_ALLOW_ROOT, TYPE_INT, + {"AllowRoot", &config_allow_root, TYPE_INT, PARM_OPT, 0, 1}, {"User", &CONFIG_USER, TYPE_STRING, PARM_OPT, 0, 0}, @@ -951,13 +964,13 @@ static void zbx_load_config(int requirement, ZBX_TASK_EX *task) zbx_strarr_init(&CONFIG_PERF_COUNTERS); zbx_strarr_init(&CONFIG_PERF_COUNTERS_EN); #endif - parse_cfg_file(CONFIG_FILE, cfg, requirement, ZBX_CFG_STRICT, ZBX_CFG_EXIT_FAILURE); + parse_cfg_file(config_file, cfg, requirement, ZBX_CFG_STRICT, ZBX_CFG_EXIT_FAILURE); zbx_finalize_key_access_rules_configuration(); set_defaults(); - CONFIG_LOG_TYPE = zbx_get_log_type(CONFIG_LOG_TYPE_STR); + log_file_cfg.log_type = zbx_get_log_type(log_file_cfg.log_type_str); zbx_vector_str_create(&hostnames); parse_hostnames(CONFIG_HOSTNAMES, &hostnames); @@ -1029,7 +1042,7 @@ static int zbx_exec_service_task(const char *name, const ZBX_TASK_EX *t) switch (t->task) { case ZBX_TASK_INSTALL_SERVICE: - ret = ZabbixCreateService(name, t->flags & ZBX_TASK_FLAG_MULTIPLE_AGENTS); + ret = ZabbixCreateService(name, t->flags & ZBX_TASK_FLAG_MULTIPLE_AGENTS, config_file); break; case ZBX_TASK_UNINSTALL_SERVICE: ret = ZabbixRemoveService(); @@ -1093,7 +1106,7 @@ int MAIN_ZABBIX_ENTRY(int flags) exit(EXIT_FAILURE); } #endif - if (SUCCEED != zabbix_open_log(CONFIG_LOG_TYPE, CONFIG_LOG_LEVEL, CONFIG_LOG_FILE, &error)) + if (SUCCEED != zabbix_open_log(&log_file_cfg, CONFIG_LOG_LEVEL, &error)) { zbx_error("cannot open log: %s", error); zbx_free(error); @@ -1119,7 +1132,7 @@ int MAIN_ZABBIX_ENTRY(int flags) zabbix_log(LOG_LEVEL_INFORMATION, "TLS support: " TLS_FEATURE_STATUS); zabbix_log(LOG_LEVEL_INFORMATION, "**************************"); - zabbix_log(LOG_LEVEL_INFORMATION, "using configuration file: %s", CONFIG_FILE); + zabbix_log(LOG_LEVEL_INFORMATION, "using configuration file: %s", config_file); #if !defined(_WINDOWS) && (defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)) if (SUCCEED != zbx_coredump_disable()) @@ -1209,7 +1222,8 @@ int MAIN_ZABBIX_ENTRY(int flags) { zbx_thread_args_t *thread_args; zbx_thread_info_t *thread_info; - zbx_thread_listener_args listener_args = {&listen_sock, zbx_config_tls, get_program_type}; + zbx_thread_listener_args listener_args = {&listen_sock, zbx_config_tls, get_program_type, + config_file}; thread_args = (zbx_thread_args_t *)zbx_malloc(NULL, sizeof(zbx_thread_args_t)); thread_info = &thread_args->info; @@ -1243,7 +1257,7 @@ int MAIN_ZABBIX_ENTRY(int flags) } #ifdef _WINDOWS - set_parent_signal_handler(zbx_on_exit); /* must be called after all threads are created */ + zbx_set_parent_signal_handler(zbx_on_exit); /* must be called after all threads are created */ /* wait for an exiting thread */ res = WaitForMultipleObjectsEx(threads_num, threads, FALSE, INFINITE, FALSE); @@ -1334,7 +1348,11 @@ int main(int argc, char **argv) char *error = NULL; #ifdef _WINDOWS int ret; - +#endif +#if defined(_WINDOWS) || defined(__MINGW32__) + zbx_init_library_win32(&get_progname); +#endif +#ifdef _WINDOWS /* Provide, so our process handles errors instead of the system itself. */ /* Attention!!! */ /* The system does not display the critical-error-handler message box. */ @@ -1486,9 +1504,10 @@ int main(int argc, char **argv) } #if defined(ZABBIX_SERVICE) - service_start(t.flags); + zbx_service_start(t.flags); #elif defined(ZABBIX_DAEMON) - zbx_daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, t.flags, get_pid_file_path, zbx_on_exit); + zbx_daemon_start(config_allow_root, CONFIG_USER, t.flags, get_pid_file_path, zbx_on_exit, + log_file_cfg.log_type, log_file_cfg.log_file_name); #endif exit(EXIT_SUCCESS); } |