#define TRACE_MODULE _fd_init #include "core_debug.h" #include "core_param.h" #include "core_signal.h" #include "core_semaphore.h" #include "fd_logger.h" #include "fd_lib.h" static void fd_gnutls_log_func(int level, const char *str); static void fd_log_func(int printlevel, const char *format, va_list ap); int fd_init(int mode, const char *conffile) { int ret; gnutls_global_set_log_function(fd_gnutls_log_func); gnutls_global_set_log_level(TRACE_MODULE); ret = fd_log_handler_register(fd_log_func); if (ret != 0) { d_error("fd_log_handler_register() failed"); return ret; } ret = fd_core_initialize(); if (ret != 0) { d_error("fd_core_initialize() failed"); return ret; } /* Parse the configuration file */ CHECK_FCT_DO( fd_core_parseconf(conffile), goto error ); /* Initialize FD Message */ CHECK_FCT( fd_message_init() ); /* Initialize FD logger */ CHECK_FCT_DO( fd_logger_init(mode), goto error ); /* Start the servers */ CHECK_FCT_DO( fd_core_start(), goto error ); CHECK_FCT_DO( fd_core_waitstartcomplete(), goto error ); CHECK_FCT( fd_logger_stats_start() ); return 0; error: CHECK_FCT_DO( fd_core_shutdown(), ); CHECK_FCT_DO( fd_core_wait_shutdown_complete(), ); return -1; } void fd_final() { fd_logger_final(); CHECK_FCT_DO( fd_core_shutdown(), d_error("fd_core_shutdown() failed") ); CHECK_FCT_DO( fd_core_wait_shutdown_complete(), d_error("fd_core_wait_shutdown_complete() failed")); } static void fd_gnutls_log_func(int level, const char *str) { d_trace(level, "gnutls[%d]: %s", level, str); } static void fd_log_func(int printlevel, const char *format, va_list ap) { char buffer[HUGE_STRING_LEN]; int ret = 0; ret = vsnprintf(buffer, HUGE_STRING_LEN, format, ap); if (ret < 0 || ret > HUGE_STRING_LEN) { d_error("vsnprintf() failed"); return; } switch(printlevel) { case FD_LOG_ANNOYING: d_trace(5, "freeDiameter[%d]: %s\n", printlevel, buffer); break; case FD_LOG_DEBUG: d_trace(5, "freeDiameter[%d]: %s\n", printlevel, buffer); break; case FD_LOG_NOTICE: d_trace(3, "freeDiameter[%d]: %s\n", printlevel, buffer); break; case FD_LOG_ERROR: d_error("%s", buffer); break; case FD_LOG_FATAL: { char *except = "Initiating freeDiameter shutdown sequence"; if (strncmp(buffer, except, strlen(except)) == 0) d_trace(1, "freeDiameter[%d]: %s\n", printlevel, buffer); else d_fatal("%s", buffer); } break; default: d_warn("%s", buffer); break; } }