support custom config
parent
5d3d0cafa6
commit
01d16a3611
109
src/sf_global.c
109
src/sf_global.c
|
|
@ -28,12 +28,45 @@ SFGlobalVariables g_sf_global_vars = {
|
||||||
{'\0'}, {'\0'}, {0, 0}
|
{'\0'}, {'\0'}, {0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
int sf_load_config(const char *server_name, const char *filename,
|
static int sf_get_config_int_value(IniContext *pIniContext,
|
||||||
IniContext *pIniContext, const int default_inner_port,
|
const char *item_prefix_name, const char *item_affix_name,
|
||||||
const int default_outer_port)
|
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 *pBasePath;
|
||||||
char *pBindAddr;
|
|
||||||
char *pRunByGroup;
|
char *pRunByGroup;
|
||||||
char *pRunByUser;
|
char *pRunByUser;
|
||||||
char *pMaxPkgSize;
|
char *pMaxPkgSize;
|
||||||
|
|
@ -54,7 +87,8 @@ int sf_load_config(const char *server_name, const char *filename,
|
||||||
return ENOENT;
|
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);
|
chopPath(g_sf_global_vars.base_path);
|
||||||
if (!fileExists(g_sf_global_vars.base_path)) {
|
if (!fileExists(g_sf_global_vars.base_path)) {
|
||||||
logError("file: "__FILE__", line: %d, "
|
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.network_timeout = DEFAULT_NETWORK_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_sf_global_vars.inner_port = iniGetIntValue(NULL, "inner_port", pIniContext,
|
g_sf_global_vars.inner_port = sf_get_config_int_value(pIniContext,
|
||||||
default_inner_port);
|
inner_cfg->item_prefix_name, "port", inner_cfg->default_port);
|
||||||
if (g_sf_global_vars.inner_port <= 0) {
|
g_sf_global_vars.outer_port = sf_get_config_int_value(pIniContext,
|
||||||
g_sf_global_vars.inner_port = default_inner_port;
|
outer_cfg->item_prefix_name, "port", outer_cfg->default_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;
|
|
||||||
}
|
|
||||||
|
|
||||||
pBindAddr = iniGetStrValue(NULL, "inner_bind_addr", pIniContext);
|
sf_get_config_str_value(pIniContext, inner_cfg->item_prefix_name,
|
||||||
if (pBindAddr == NULL) {
|
"bind_addr", g_sf_global_vars.inner_bind_addr,
|
||||||
*g_sf_global_vars.inner_bind_addr = '\0';
|
sizeof(g_sf_global_vars.inner_bind_addr));
|
||||||
}
|
|
||||||
else {
|
|
||||||
snprintf(g_sf_global_vars.inner_bind_addr, sizeof(g_sf_global_vars.inner_bind_addr), "%s", pBindAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
pBindAddr = iniGetStrValue(NULL, "outer_bind_addr", pIniContext);
|
sf_get_config_str_value(pIniContext, outer_cfg->item_prefix_name,
|
||||||
if (pBindAddr == NULL) {
|
"bind_addr", g_sf_global_vars.outer_bind_addr,
|
||||||
*g_sf_global_vars.outer_bind_addr = '\0';
|
sizeof(g_sf_global_vars.outer_bind_addr));
|
||||||
}
|
|
||||||
else {
|
|
||||||
snprintf(g_sf_global_vars.outer_bind_addr, sizeof(g_sf_global_vars.outer_bind_addr), "%s", pBindAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_sf_global_vars.max_connections = iniGetIntValue(NULL, "max_connections",
|
g_sf_global_vars.max_connections = iniGetIntValue(NULL, "max_connections",
|
||||||
pIniContext, DEFAULT_MAX_CONNECTONS);
|
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';
|
*g_sf_global_vars.run_by_group = '\0';
|
||||||
}
|
}
|
||||||
else {
|
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);
|
"%s", pRunByGroup);
|
||||||
}
|
}
|
||||||
if (*g_sf_global_vars.run_by_group == '\0') {
|
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';
|
*g_sf_global_vars.run_by_user = '\0';
|
||||||
}
|
}
|
||||||
else {
|
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);
|
"%s", pRunByUser);
|
||||||
}
|
}
|
||||||
if (*g_sf_global_vars.run_by_user == '\0') {
|
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;
|
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;
|
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.thread_stack_size = (int)thread_stack_size;
|
||||||
|
|
||||||
g_sf_global_vars.rotate_error_log = iniGetBoolValue(NULL, "rotate_error_log",
|
g_sf_global_vars.rotate_error_log = iniGetBoolValue(NULL,
|
||||||
pIniContext, false);
|
"rotate_error_log", pIniContext, false);
|
||||||
g_sf_global_vars.log_file_keep_days = iniGetIntValue(NULL, "log_file_keep_days",
|
g_sf_global_vars.log_file_keep_days = iniGetIntValue(NULL,
|
||||||
pIniContext, 0);
|
"log_file_keep_days", pIniContext, 0);
|
||||||
|
|
||||||
load_log_level(pIniContext);
|
load_log_level(pIniContext);
|
||||||
if ((result=log_set_prefix(g_sf_global_vars.base_path, server_name)) != 0) {
|
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;
|
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)
|
void sf_log_config_ex(const char *other_config)
|
||||||
{
|
{
|
||||||
char sz_thread_stack_size[32];
|
char sz_thread_stack_size[32];
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,11 @@ typedef struct sf_connection_stat {
|
||||||
volatile int max_count;
|
volatile int max_count;
|
||||||
} SFConnectionStat;
|
} SFConnectionStat;
|
||||||
|
|
||||||
|
typedef struct sf_custom_config {
|
||||||
|
const char *item_prefix_name;
|
||||||
|
int default_port;
|
||||||
|
} SFCustomConfig;
|
||||||
|
|
||||||
typedef struct sf_global_variables {
|
typedef struct sf_global_variables {
|
||||||
int connect_timeout;
|
int connect_timeout;
|
||||||
int network_timeout;
|
int network_timeout;
|
||||||
|
|
@ -52,12 +57,28 @@ typedef struct sf_global_variables {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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,
|
int sf_load_config(const char *server_name, const char *filename,
|
||||||
IniContext *pIniContext, const int default_inner_port,
|
IniContext *pIniContext, const int default_inner_port,
|
||||||
const int default_outer_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);
|
void sf_log_config_ex(const char *other_config);
|
||||||
|
|
||||||
#define sf_log_config() sf_log_config_ex(NULL)
|
#define sf_log_config() sf_log_config_ex(NULL)
|
||||||
|
|
|
||||||
29
src/sf_nio.c
29
src/sf_nio.c
|
|
@ -325,7 +325,7 @@ int sf_client_sock_read(int sock, short event, void *arg)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logWarning("file: "__FILE__", line: %d, "
|
logWarning("file: "__FILE__", line: %d, "
|
||||||
"client ip: %s, recv failed, "
|
"client ip: %s, recv fail, "
|
||||||
"errno: %d, error info: %s",
|
"errno: %d, error info: %s",
|
||||||
__LINE__, pTask->client_ip,
|
__LINE__, pTask->client_ip,
|
||||||
errno, strerror(errno));
|
errno, strerror(errno));
|
||||||
|
|
@ -335,10 +335,29 @@ int sf_client_sock_read(int sock, short event, void *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (bytes == 0) {
|
else if (bytes == 0) {
|
||||||
logDebug("file: "__FILE__", line: %d, "
|
if (pTask->offset > 0) {
|
||||||
"client ip: %s, sock: %d, recv failed, "
|
if (pTask->length > 0) {
|
||||||
"connection disconnected",
|
logWarning("file: "__FILE__", line: %d, "
|
||||||
__LINE__, pTask->client_ip, sock);
|
"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);
|
sf_task_cleanup_func(pTask);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue