From 01d16a3611fc8b38b0fd4381f7960b669b6efac5 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Sat, 22 Feb 2020 11:24:12 +0800 Subject: [PATCH] support custom config --- src/sf_global.c | 109 ++++++++++++++++++++++++++++++++---------------- src/sf_global.h | 23 +++++++++- src/sf_nio.c | 29 ++++++++++--- 3 files changed, 119 insertions(+), 42 deletions(-) diff --git a/src/sf_global.c b/src/sf_global.c index e50b318..332ac1e 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -28,12 +28,45 @@ SFGlobalVariables g_sf_global_vars = { {'\0'}, {'\0'}, {0, 0} }; -int sf_load_config(const char *server_name, const char *filename, - IniContext *pIniContext, const int default_inner_port, - const int default_outer_port) +static int sf_get_config_int_value(IniContext *pIniContext, + const char *item_prefix_name, const char *item_affix_name, + const int default_value) +{ + int value; + char item_name[FAST_INI_ITEM_NAME_SIZE]; + + snprintf(item_name, sizeof(item_name), "%s_%s", + item_prefix_name, item_affix_name); + value = iniGetIntValue(NULL, item_name, pIniContext, default_value); + if (value <= 0) { + value = default_value; + } + return value; +} + +static void sf_get_config_str_value(IniContext *pIniContext, + const char *item_prefix_name, const char *item_affix_name, + char *dest, const int dest_size) +{ + char item_name[FAST_INI_ITEM_NAME_SIZE]; + char *value; + + snprintf(item_name, sizeof(item_name), "%s_%s", + item_prefix_name, item_affix_name); + value = iniGetStrValue(NULL, item_name, pIniContext); + if (value == NULL) { + *dest = '\0'; + } + else { + snprintf(dest, dest_size, "%s", value); + } +} + +int sf_load_config_ex(const char *server_name, const char *filename, + IniContext *pIniContext, const SFCustomConfig *inner_cfg, + const SFCustomConfig *outer_cfg) { char *pBasePath; - char *pBindAddr; char *pRunByGroup; char *pRunByUser; char *pMaxPkgSize; @@ -54,7 +87,8 @@ int sf_load_config(const char *server_name, const char *filename, return ENOENT; } - snprintf(g_sf_global_vars.base_path, sizeof(g_sf_global_vars.base_path), "%s", pBasePath); + snprintf(g_sf_global_vars.base_path, sizeof(g_sf_global_vars.base_path), + "%s", pBasePath); chopPath(g_sf_global_vars.base_path); if (!fileExists(g_sf_global_vars.base_path)) { logError("file: "__FILE__", line: %d, " @@ -81,32 +115,18 @@ int sf_load_config(const char *server_name, const char *filename, g_sf_global_vars.network_timeout = DEFAULT_NETWORK_TIMEOUT; } - g_sf_global_vars.inner_port = iniGetIntValue(NULL, "inner_port", pIniContext, - default_inner_port); - if (g_sf_global_vars.inner_port <= 0) { - g_sf_global_vars.inner_port = default_inner_port; - } - g_sf_global_vars.outer_port = iniGetIntValue(NULL, "outer_port", pIniContext, - default_outer_port); - if (g_sf_global_vars.outer_port <= 0) { - g_sf_global_vars.outer_port = default_outer_port; - } + g_sf_global_vars.inner_port = sf_get_config_int_value(pIniContext, + inner_cfg->item_prefix_name, "port", inner_cfg->default_port); + g_sf_global_vars.outer_port = sf_get_config_int_value(pIniContext, + outer_cfg->item_prefix_name, "port", outer_cfg->default_port); - pBindAddr = iniGetStrValue(NULL, "inner_bind_addr", pIniContext); - if (pBindAddr == NULL) { - *g_sf_global_vars.inner_bind_addr = '\0'; - } - else { - snprintf(g_sf_global_vars.inner_bind_addr, sizeof(g_sf_global_vars.inner_bind_addr), "%s", pBindAddr); - } + sf_get_config_str_value(pIniContext, inner_cfg->item_prefix_name, + "bind_addr", g_sf_global_vars.inner_bind_addr, + sizeof(g_sf_global_vars.inner_bind_addr)); - pBindAddr = iniGetStrValue(NULL, "outer_bind_addr", pIniContext); - if (pBindAddr == NULL) { - *g_sf_global_vars.outer_bind_addr = '\0'; - } - else { - snprintf(g_sf_global_vars.outer_bind_addr, sizeof(g_sf_global_vars.outer_bind_addr), "%s", pBindAddr); - } + sf_get_config_str_value(pIniContext, outer_cfg->item_prefix_name, + "bind_addr", g_sf_global_vars.outer_bind_addr, + sizeof(g_sf_global_vars.outer_bind_addr)); g_sf_global_vars.max_connections = iniGetIntValue(NULL, "max_connections", pIniContext, DEFAULT_MAX_CONNECTONS); @@ -186,7 +206,8 @@ int sf_load_config(const char *server_name, const char *filename, *g_sf_global_vars.run_by_group = '\0'; } else { - snprintf(g_sf_global_vars.run_by_group, sizeof(g_sf_global_vars.run_by_group), + snprintf(g_sf_global_vars.run_by_group, + sizeof(g_sf_global_vars.run_by_group), "%s", pRunByGroup); } if (*g_sf_global_vars.run_by_group == '\0') { @@ -212,7 +233,8 @@ int sf_load_config(const char *server_name, const char *filename, *g_sf_global_vars.run_by_user = '\0'; } else { - snprintf(g_sf_global_vars.run_by_user, sizeof(g_sf_global_vars.run_by_user), + snprintf(g_sf_global_vars.run_by_user, + sizeof(g_sf_global_vars.run_by_user), "%s", pRunByUser); } if (*g_sf_global_vars.run_by_user == '\0') { @@ -234,7 +256,9 @@ int sf_load_config(const char *server_name, const char *filename, g_sf_global_vars.run_by_uid = pUser->pw_uid; } - if ((result=set_run_by(g_sf_global_vars.run_by_group, g_sf_global_vars.run_by_user)) != 0) { + if ((result=set_run_by(g_sf_global_vars.run_by_group, + g_sf_global_vars.run_by_user)) != 0) + { return result; } @@ -257,10 +281,10 @@ int sf_load_config(const char *server_name, const char *filename, } g_sf_global_vars.thread_stack_size = (int)thread_stack_size; - g_sf_global_vars.rotate_error_log = iniGetBoolValue(NULL, "rotate_error_log", - pIniContext, false); - g_sf_global_vars.log_file_keep_days = iniGetIntValue(NULL, "log_file_keep_days", - pIniContext, 0); + g_sf_global_vars.rotate_error_log = iniGetBoolValue(NULL, + "rotate_error_log", pIniContext, false); + g_sf_global_vars.log_file_keep_days = iniGetIntValue(NULL, + "log_file_keep_days", pIniContext, 0); load_log_level(pIniContext); if ((result=log_set_prefix(g_sf_global_vars.base_path, server_name)) != 0) { @@ -270,6 +294,19 @@ int sf_load_config(const char *server_name, const char *filename, return 0; } +int sf_load_config(const char *server_name, const char *filename, + IniContext *pIniContext, const int default_inner_port, + const int default_outer_port) +{ + SFCustomConfig inner_cfg; + SFCustomConfig outer_cfg; + + SF_SET_CUSTOM_CONFIG(inner_cfg, "inner", default_inner_port); + SF_SET_CUSTOM_CONFIG(outer_cfg, "outer", default_outer_port); + return sf_load_config_ex(server_name, filename, pIniContext, + &inner_cfg, &outer_cfg); +} + void sf_log_config_ex(const char *other_config) { char sz_thread_stack_size[32]; diff --git a/src/sf_global.h b/src/sf_global.h index 08c4a1b..f317e71 100644 --- a/src/sf_global.h +++ b/src/sf_global.h @@ -13,6 +13,11 @@ typedef struct sf_connection_stat { volatile int max_count; } SFConnectionStat; +typedef struct sf_custom_config { + const char *item_prefix_name; + int default_port; +} SFCustomConfig; + typedef struct sf_global_variables { int connect_timeout; int network_timeout; @@ -52,12 +57,28 @@ typedef struct sf_global_variables { extern "C" { #endif -extern SFGlobalVariables g_sf_global_vars; +extern SFGlobalVariables g_sf_global_vars; + +#define SF_G_BASE_PATH g_sf_global_vars.base_path +#define SF_G_CONTINUE_FLAG g_sf_global_vars.continue_flag +#define SF_G_CONNECT_TIMEOUT g_sf_global_vars.connect_timeout +#define SF_G_NETWORK_TIMEOUT g_sf_global_vars.network_timeout +#define SF_G_THREAD_STACK_SIZE g_sf_global_vars.thread_stack_size + +#define SF_SET_CUSTOM_CONFIG(cfg, prefix_name, port) \ + do { \ + (cfg).item_prefix_name = prefix_name; \ + (cfg).default_port = port; \ + } while (0) int sf_load_config(const char *server_name, const char *filename, IniContext *pIniContext, const int default_inner_port, const int default_outer_port); +int sf_load_config_ex(const char *server_name, const char *filename, + IniContext *pIniContext, const SFCustomConfig *inner_cfg, + const SFCustomConfig *outer_cfg); + void sf_log_config_ex(const char *other_config); #define sf_log_config() sf_log_config_ex(NULL) diff --git a/src/sf_nio.c b/src/sf_nio.c index 286953e..5fb3f79 100644 --- a/src/sf_nio.c +++ b/src/sf_nio.c @@ -325,7 +325,7 @@ int sf_client_sock_read(int sock, short event, void *arg) } else { logWarning("file: "__FILE__", line: %d, " - "client ip: %s, recv failed, " + "client ip: %s, recv fail, " "errno: %d, error info: %s", __LINE__, pTask->client_ip, errno, strerror(errno)); @@ -335,10 +335,29 @@ int sf_client_sock_read(int sock, short event, void *arg) } } else if (bytes == 0) { - logDebug("file: "__FILE__", line: %d, " - "client ip: %s, sock: %d, recv failed, " - "connection disconnected", - __LINE__, pTask->client_ip, sock); + if (pTask->offset > 0) { + if (pTask->length > 0) { + logWarning("file: "__FILE__", line: %d, " + "client ip: %s, connection " + "disconnected, expect pkg length: %d, " + "recv pkg length: %d", __LINE__, + pTask->client_ip, pTask->length, + pTask->offset); + } + else { + logWarning("file: "__FILE__", line: %d, " + "client ip: %s, connection " + "disconnected, recv pkg length: %d", + __LINE__, pTask->client_ip, + pTask->offset); + } + } + else { + logDebug("file: "__FILE__", line: %d, " + "client ip: %s, sock: %d, recv fail, " + "connection disconnected", + __LINE__, pTask->client_ip, sock); + } sf_task_cleanup_func(pTask); return -1;