support custom config

connection_manager
YuQing 2020-02-22 11:24:12 +08:00
parent 5d3d0cafa6
commit 01d16a3611
3 changed files with 119 additions and 42 deletions

View File

@ -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];

View File

@ -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;
@ -54,10 +59,26 @@ extern "C" {
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)

View File

@ -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) {
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 failed, "
"client ip: %s, sock: %d, recv fail, "
"connection disconnected",
__LINE__, pTask->client_ip, sock);
}
sf_task_cleanup_func(pTask);
return -1;