/* * Copyright (C) 2019 by Sukchan Lee * * This file is part of Open5GS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ogs-diameter-common.h" int __ogs_diam_domain; static void diam_gnutls_log_func(int level, const char *str); static void diam_log_func(int printlevel, const char *fname, int line, const char *format, va_list ap); int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config) { int ret; gnutls_global_set_log_level(0); gnutls_global_set_log_function(diam_gnutls_log_func); fd_g_debug_lvl = FD_LOG_ERROR; ret = fd_log_handler_register(diam_log_func); if (ret != 0) { ogs_error("fd_log_handler_register() failed"); return ret; } ret = fd_core_initialize(); if (ret != 0) { ogs_error("fd_core_initialize() failed"); return ret; } /* Parse the configuration file */ if (conffile) { CHECK_FCT_DO( fd_core_parseconf(conffile), goto error ); } else { CHECK_FCT_DO( ogs_diam_config_init(fd_config), goto error ); } /* Initialize FD Message */ CHECK_FCT( ogs_diam_message_init() ); /* Initialize FD logger */ CHECK_FCT_DO( ogs_diam_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( ogs_diam_logger_stats_start() ); return 0; error: CHECK_FCT_DO( fd_core_shutdown(), ); CHECK_FCT_DO( fd_core_wait_shutdown_complete(), ); return -1; } void ogs_diam_final() { ogs_diam_logger_final(); CHECK_FCT_DO( fd_core_shutdown(), ogs_error("fd_core_shutdown() failed") ); CHECK_FCT_DO( fd_core_wait_shutdown_complete(), ogs_error("fd_core_wait_shutdown_complete() failed")); } static void diam_gnutls_log_func(int level, const char *str) { ogs_trace("gnutls[%d]: %s", level, str); } static void diam_log_func(int printlevel, const char *fname, int line, const char *format, va_list ap) { char buffer[OGS_HUGE_LEN]; int ret = 0; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" ret = vsnprintf(buffer, OGS_HUGE_LEN, format, ap); #pragma GCC diagnostic pop if (ret < 0 || ret > OGS_HUGE_LEN) { ogs_error("vsnprintf() failed"); return; } switch(printlevel) { case FD_LOG_ANNOYING: ogs_trace("[%d]: %s:%u %s", printlevel, fname, line, buffer); break; case FD_LOG_DEBUG: ogs_trace("[%d]: %s:%u %s", printlevel, fname, line, buffer); break; case FD_LOG_NOTICE: ogs_trace("[%d]: %s:%u %s", printlevel, fname, line, buffer); break; case FD_LOG_ERROR: ogs_error("%s:%d %s", fname, line, buffer); if (!strcmp(buffer, " - The certificate is expired.")) { ogs_error("You can renew CERT as follows:"); ogs_error("./support/freeDiameter/make_certs.sh " "./install/etc/open5gs/freeDiameter"); } break; case FD_LOG_FATAL: { const char *except = "Initiating freeDiameter shutdown sequence"; if (strncmp(buffer, except, strlen(except)) == 0) ogs_info("[%d]: %s:%u %s", printlevel, fname, line, buffer); else ogs_fatal("%s:%d %s", fname, line, buffer); } break; default: ogs_warn("%s:%d %s", fname, line, buffer); break; } }