diff --git a/src/sf_global.c b/src/sf_global.c index 2cef752..d581f17 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -46,7 +46,7 @@ SFGlobalVariables g_sf_global_vars = { SFContext g_sf_context = { {'\0'}, NULL, 0, -1, -1, 0, 0, 1, DEFAULT_WORK_THREADS, {'\0'}, {'\0'}, 0, true, true, NULL, NULL, NULL, NULL, - sf_task_finish_clean_up, NULL + NULL, sf_task_finish_clean_up, NULL }; static inline void set_config_str_value(const char *value, @@ -60,6 +60,7 @@ static inline void set_config_str_value(const char *value, } static int load_network_parameters(IniFullContext *ini_ctx, + const char *max_pkg_size_item_nm, const int task_buffer_extra_size) { int result; @@ -93,7 +94,7 @@ static int load_network_parameters(IniFullContext *ini_ctx, } g_sf_global_vars.max_pkg_size = iniGetByteCorrectValueEx(ini_ctx, - "max_pkg_size", SF_DEF_MAX_PACKAGE_SIZE, 1, 8192, + max_pkg_size_item_nm, SF_DEF_MAX_PACKAGE_SIZE, 1, 8192, SF_MAX_NETWORK_BUFF_SIZE, true); pMinBuffSize = iniGetStrValueEx(ini_ctx->section_name, "min_buff_size", ini_ctx->context, true); @@ -271,7 +272,8 @@ int sf_load_global_base_path(IniFullContext *ini_ctx) int sf_load_global_config_ex(const char *server_name, IniFullContext *ini_ctx, const bool load_network_params, - const int task_buffer_extra_size) + const char *max_pkg_size_item_nm, const int task_buffer_extra_size, + const bool need_set_run_by) { int result; const char *old_section_name; @@ -287,7 +289,7 @@ int sf_load_global_config_ex(const char *server_name, "tcp_quick_ack", ini_ctx->context, true); tcp_set_quick_ack(g_sf_global_vars.tcp_quick_ack); if (load_network_params) { - if ((result=load_network_parameters(ini_ctx, + if ((result=load_network_parameters(ini_ctx, max_pkg_size_item_nm, task_buffer_extra_size)) != 0) { return result; @@ -350,10 +352,12 @@ int sf_load_global_config_ex(const char *server_name, 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) - { - return result; + if (need_set_run_by) { + if ((result=set_run_by(g_sf_global_vars.run_by_group, + g_sf_global_vars.run_by_user)) != 0) + { + return result; + } } g_sf_global_vars.thread_stack_size = iniGetByteCorrectValueEx(ini_ctx, @@ -379,12 +383,13 @@ int sf_load_global_config_ex(const char *server_name, return 0; } -int sf_load_config_ex(const char *server_name, SFContextIniConfig - *config, const int task_buffer_extra_size) +int sf_load_config_ex(const char *server_name, SFContextIniConfig *config, + const int task_buffer_extra_size, const bool need_set_run_by) { int result; if ((result=sf_load_global_config_ex(server_name, &config->ini_ctx, - true, task_buffer_extra_size)) != 0) + true, config->max_pkg_size_item_name, + task_buffer_extra_size, need_set_run_by)) != 0) { return result; } @@ -539,12 +544,14 @@ void sf_slow_log_config_to_string(SFSlowLogConfig *slow_log_cfg, slow_log_buff, output, size); } -void sf_global_config_to_string(char *output, const int size) +void sf_global_config_to_string_ex(const char *max_pkg_size_item_nm, + char *output, const int size) { int len; int max_pkg_size; int min_buff_size; int max_buff_size; + char pkg_buff[256]; max_pkg_size = g_sf_global_vars.max_pkg_size - g_sf_global_vars.task_buffer_extra_size; @@ -552,23 +559,31 @@ void sf_global_config_to_string(char *output, const int size) g_sf_global_vars.task_buffer_extra_size; max_buff_size = g_sf_global_vars.max_buff_size - g_sf_global_vars.task_buffer_extra_size; + + if (min_buff_size == max_buff_size && max_pkg_size == max_buff_size) { + snprintf(pkg_buff, sizeof(pkg_buff), "%s=%d KB", + max_pkg_size_item_nm, max_pkg_size / 1024); + } else { + snprintf(pkg_buff, sizeof(pkg_buff), "%s=%d KB, " + "min_buff_size=%d KB, max_buff_size=%d KB", + max_pkg_size_item_nm, max_pkg_size / 1024, + min_buff_size / 1024, max_buff_size / 1024); + } + len = snprintf(output, size, "base_path=%s, max_connections=%d, connect_timeout=%d, " "network_timeout=%d, thread_stack_size=%d KB, " - "max_pkg_size=%d KB, min_buff_size=%d KB, " - "max_buff_size=%d KB, tcp_quick_ack=%d, log_level=%s, " + "%s, tcp_quick_ack=%d, log_level=%s, " "run_by_group=%s, run_by_user=%s, ", SF_G_BASE_PATH_STR, g_sf_global_vars.max_connections, g_sf_global_vars.connect_timeout, g_sf_global_vars.network_timeout, g_sf_global_vars.thread_stack_size / 1024, - max_pkg_size / 1024, min_buff_size / 1024, - max_buff_size / 1024, - g_sf_global_vars.tcp_quick_ack, + pkg_buff, g_sf_global_vars.tcp_quick_ack, log_get_level_caption(), g_sf_global_vars.run_by_group, g_sf_global_vars.run_by_user - ); + ); sf_log_config_to_string(&g_sf_global_vars.error_log, "error-log", output + len, size - len); diff --git a/src/sf_global.h b/src/sf_global.h index 4ad8265..4a2abcd 100644 --- a/src/sf_global.h +++ b/src/sf_global.h @@ -63,6 +63,7 @@ typedef struct sf_context_ini_config { int default_inner_port; int default_outer_port; int default_work_threads; + const char *max_pkg_size_item_name; } SFContextIniConfig; #ifdef __cplusplus @@ -80,6 +81,12 @@ extern SFContext g_sf_context; #define SF_G_MAX_CONNECTIONS g_sf_global_vars.max_connections #define SF_G_THREAD_STACK_SIZE g_sf_global_vars.thread_stack_size +#define SF_G_OUTER_PORT g_sf_context.outer_port +#define SF_G_INNER_PORT g_sf_context.inner_port +#define SF_G_OUTER_BIND_ADDR g_sf_context.outer_bind_addr +#define SF_G_INNER_BIND_ADDR g_sf_context.inner_bind_addr + +#define SF_G_ACCEPT_THREADS g_sf_context.accept_threads #define SF_G_WORK_THREADS g_sf_context.work_threads #define SF_G_ALIVE_THREAD_COUNT g_sf_context.thread_count #define SF_G_THREAD_INDEX(tdata) (int)(tdata - g_sf_context.thread_data) @@ -113,44 +120,78 @@ extern SFContext g_sf_context; #define SF_CHOWN_TO_RUNBY_RETURN_ON_ERROR(path) \ SF_CHOWN_RETURN_ON_ERROR(path, geteuid(), getegid()) -#define SF_SET_CONTEXT_INI_CONFIG(config, filename, pIniContext, \ - section_name, def_inner_port, def_outer_port, def_work_threads) \ + +#define SF_FCHOWN_RETURN_ON_ERROR(fd, path, current_uid, current_gid) \ + do { \ + if (!(g_sf_global_vars.run_by_gid == current_gid && \ + g_sf_global_vars.run_by_uid == current_uid)) \ + { \ + if (fchown(fd, g_sf_global_vars.run_by_uid, \ + g_sf_global_vars.run_by_gid) != 0) \ + { \ + logError("file: "__FILE__", line: %d, " \ + "fchown \"%s\" fail, " \ + "errno: %d, error info: %s", \ + __LINE__, path, errno, STRERROR(errno)); \ + return errno != 0 ? errno : EPERM; \ + } \ + } \ + } while (0) + +#define SF_FCHOWN_TO_RUNBY_RETURN_ON_ERROR(fd, path) \ + SF_FCHOWN_RETURN_ON_ERROR(fd, path, geteuid(), getegid()) + +#define SF_SET_CONTEXT_INI_CONFIG_EX(config, filename, pIniContext, \ + section_name, def_inner_port, def_outer_port, def_work_threads, \ + max_pkg_size_item_nm) \ do { \ FAST_INI_SET_FULL_CTX_EX(config.ini_ctx, filename, \ section_name, pIniContext); \ config.default_inner_port = def_inner_port; \ config.default_outer_port = def_outer_port; \ config.default_work_threads = def_work_threads; \ + config.max_pkg_size_item_name = max_pkg_size_item_nm; \ } while (0) +#define SF_SET_CONTEXT_INI_CONFIG(config, filename, pIniContext, \ + section_name, def_inner_port, def_outer_port, def_work_threads) \ + SF_SET_CONTEXT_INI_CONFIG_EX(config, filename, pIniContext, \ + section_name, def_inner_port, def_outer_port, def_work_threads, \ + "max_pkg_size") + int sf_load_global_config_ex(const char *server_name, IniFullContext *ini_ctx, const bool load_network_params, - const int task_buffer_extra_size); + const char *max_pkg_size_item_nm, const int task_buffer_extra_size, + const bool need_set_run_by); static inline int sf_load_global_config(const char *server_name, IniFullContext *ini_ctx) { const bool load_network_params = true; + const char *max_pkg_size_item_nm = "max_pkg_size"; const int task_buffer_extra_size = 0; + const bool need_set_run_by = true; - return sf_load_global_config_ex(server_name, ini_ctx, - load_network_params, task_buffer_extra_size); + return sf_load_global_config_ex(server_name, ini_ctx, load_network_params, + max_pkg_size_item_nm, task_buffer_extra_size, need_set_run_by); } -int sf_load_config_ex(const char *server_name, - SFContextIniConfig *config, const int task_buffer_extra_size); +int sf_load_config_ex(const char *server_name, SFContextIniConfig *config, + const int task_buffer_extra_size, const bool need_set_run_by); static inline int sf_load_config(const char *server_name, const char *filename, IniContext *pIniContext, const char *section_name, const int default_inner_port, const int default_outer_port, const int task_buffer_extra_size) { + const bool need_set_run_by = true; SFContextIniConfig config; SF_SET_CONTEXT_INI_CONFIG(config, filename, pIniContext, section_name, default_inner_port, default_outer_port, DEFAULT_WORK_THREADS); - return sf_load_config_ex(server_name, &config, task_buffer_extra_size); + return sf_load_config_ex(server_name, &config, + task_buffer_extra_size, need_set_run_by); } int sf_load_context_from_config_ex(SFContext *sf_context, @@ -193,7 +234,14 @@ void sf_log_config_to_string_ex(SFLogConfig *log_cfg, const char *caption, void sf_slow_log_config_to_string(SFSlowLogConfig *slow_log_cfg, const char *caption, char *output, const int size); -void sf_global_config_to_string(char *output, const int size); +void sf_global_config_to_string_ex(const char *max_pkg_size_item_nm, + char *output, const int size); + +static inline void sf_global_config_to_string(char *output, const int size) +{ + const char *max_pkg_size_item_nm = "max_pkg_size"; + sf_global_config_to_string_ex(max_pkg_size_item_nm, output, size); +} void sf_context_config_to_string(const SFContext *sf_context, char *output, const int size); diff --git a/src/sf_util.c b/src/sf_util.c index db82a8b..7956589 100644 --- a/src/sf_util.c +++ b/src/sf_util.c @@ -199,8 +199,13 @@ const char *sf_parse_daemon_mode_and_action_ex(int argc, char *argv[], } else { proc_name = argv[0]; } - printf("\n%s V%d.%d.%d\n\n", proc_name, version->major, - version->minor, version->patch); + if (version->patch > 0) { + printf("\n%s V%d.%d.%d\n\n", proc_name, version->major, + version->minor, version->patch); + } else { + printf("\n%s V%d.%02d\n\n", proc_name, + version->major, version->minor); + } return NULL; } if (strcmp(argv[i], "-h") == 0 ||