diff --git a/src/sf_global.c b/src/sf_global.c index 332ac1e..bb6c1cf 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -210,7 +210,7 @@ int sf_load_config_ex(const char *server_name, const char *filename, sizeof(g_sf_global_vars.run_by_group), "%s", pRunByGroup); } - if (*g_sf_global_vars.run_by_group == '\0') { + if (*(g_sf_global_vars.run_by_group) == '\0') { g_sf_global_vars.run_by_gid = getegid(); } else { @@ -237,7 +237,7 @@ int sf_load_config_ex(const char *server_name, const char *filename, sizeof(g_sf_global_vars.run_by_user), "%s", pRunByUser); } - if (*g_sf_global_vars.run_by_user == '\0') { + if (*(g_sf_global_vars.run_by_user) == '\0') { g_sf_global_vars.run_by_uid = geteuid(); } else { diff --git a/src/sf_global.h b/src/sf_global.h index f317e71..5d43ad4 100644 --- a/src/sf_global.h +++ b/src/sf_global.h @@ -57,12 +57,13 @@ 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_WORK_THREADS g_sf_global_vars.work_threads #define SF_G_THREAD_STACK_SIZE g_sf_global_vars.thread_stack_size #define SF_SET_CUSTOM_CONFIG(cfg, prefix_name, port) \ @@ -71,6 +72,23 @@ extern SFGlobalVariables g_sf_global_vars; (cfg).default_port = port; \ } while (0) +#define SF_CHOWN_RETURN_ON_ERROR(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 (chown(path, g_sf_global_vars.run_by_uid, \ + g_sf_global_vars.run_by_gid) != 0) \ + { \ + logError("file: "__FILE__", line: %d, " \ + "chown \"%s\" fail, " \ + "errno: %d, error info: %s", \ + __LINE__, path, errno, STRERROR(errno)); \ + return errno != 0 ? errno : EPERM; \ + } \ + } \ + } 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); diff --git a/src/sf_service.c b/src/sf_service.c index 4c7cbf8..72b8093 100644 --- a/src/sf_service.c +++ b/src/sf_service.c @@ -68,7 +68,9 @@ int sf_service_init(sf_alloc_thread_extra_data_callback return result; } - if ((result=init_pthread_attr(&thread_attr, g_sf_global_vars.thread_stack_size)) != 0) { + if ((result=init_pthread_attr(&thread_attr, g_sf_global_vars. + thread_stack_size)) != 0) + { logError("file: "__FILE__", line: %d, " "init_pthread_attr fail, program exit!", __LINE__); return result; @@ -83,8 +85,9 @@ int sf_service_init(sf_alloc_thread_extra_data_callback alloc_conn_once = ALLOC_CONNECTIONS_ONCE / m; init_connections = g_sf_global_vars.max_connections < alloc_conn_once ? g_sf_global_vars.max_connections : alloc_conn_once; - if ((result=free_queue_init_ex(g_sf_global_vars.max_connections, init_connections, - alloc_conn_once, g_sf_global_vars.min_buff_size, g_sf_global_vars.max_buff_size, + if ((result=free_queue_init_ex(g_sf_global_vars.max_connections, + init_connections, alloc_conn_once, g_sf_global_vars. + min_buff_size, g_sf_global_vars.max_buff_size, task_arg_size)) != 0) { return result; @@ -102,7 +105,9 @@ int sf_service_init(sf_alloc_thread_extra_data_callback g_worker_thread_count = 0; pDataEnd = g_sf_global_vars.thread_data + g_sf_global_vars.work_threads; - for (pThreadData=g_sf_global_vars.thread_data; pThreadDatathread_loop_callback = thread_loop_callback; if (alloc_thread_extra_data_callback != NULL) { pThreadData->arg = alloc_thread_extra_data_callback( @@ -182,7 +187,9 @@ int sf_service_destroy() free_queue_destroy(); pDataEnd = g_sf_global_vars.thread_data + g_sf_global_vars.work_threads; - for (pThreadData=g_sf_global_vars.thread_data; pThreadDatatimer); } free(g_sf_global_vars.thread_data); @@ -224,27 +231,32 @@ int sf_socket_server() const char *bind_addr; if (g_sf_global_vars.outer_port == g_sf_global_vars.inner_port) { - if (*g_sf_global_vars.outer_bind_addr == '\0' || *g_sf_global_vars.inner_bind_addr == '\0') { + if (*g_sf_global_vars.outer_bind_addr == '\0' || + *g_sf_global_vars.inner_bind_addr == '\0') { bind_addr = ""; - return _socket_server(bind_addr, g_sf_global_vars.outer_port, &g_server_outer_sock); - } else if (strcmp(g_sf_global_vars.outer_bind_addr, g_sf_global_vars.inner_bind_addr) == 0) { + return _socket_server(bind_addr, g_sf_global_vars.outer_port, + &g_server_outer_sock); + } else if (strcmp(g_sf_global_vars.outer_bind_addr, + g_sf_global_vars.inner_bind_addr) == 0) { bind_addr = g_sf_global_vars.outer_bind_addr; if (is_private_ip(bind_addr)) { - return _socket_server(bind_addr, g_sf_global_vars.inner_port, &g_server_inner_sock); + return _socket_server(bind_addr, g_sf_global_vars. + inner_port, &g_server_inner_sock); } else { - return _socket_server(bind_addr, g_sf_global_vars.outer_port, &g_server_outer_sock); + return _socket_server(bind_addr, g_sf_global_vars. + outer_port, &g_server_outer_sock); } } } - if ((result=_socket_server(g_sf_global_vars.outer_bind_addr, g_sf_global_vars.outer_port, - &g_server_outer_sock)) != 0) + if ((result=_socket_server(g_sf_global_vars.outer_bind_addr, + g_sf_global_vars.outer_port, &g_server_outer_sock)) != 0) { return result; } - if ((result=_socket_server(g_sf_global_vars.inner_bind_addr, g_sf_global_vars.inner_port, - &g_server_inner_sock)) != 0) + if ((result=_socket_server(g_sf_global_vars.inner_bind_addr, + g_sf_global_vars.inner_port, &g_server_inner_sock)) != 0) { return result; } @@ -252,7 +264,7 @@ int sf_socket_server() return 0; } -static void *accept_thread_entrance(void* arg) +static void *accept_thread_entrance(void *arg) { int server_sock; int incomesock; @@ -331,7 +343,9 @@ void _accept_loop(int server_sock, const int accept_threads) return; } - if ((result=init_pthread_attr(&thread_attr, g_sf_global_vars.thread_stack_size)) != 0) { + if ((result=init_pthread_attr(&thread_attr, g_sf_global_vars. + thread_stack_size)) != 0) + { logWarning("file: "__FILE__", line: %d, " "init_pthread_attr fail!", __LINE__); } @@ -393,15 +407,15 @@ static void sigQuitHandler(int sig) if (!bTerminateFlag) { bTerminateFlag = true; g_sf_global_vars.continue_flag = false; - logCrit("file: "__FILE__", line: %d, " \ - "catch signal %d, program exiting...", \ + logCrit("file: "__FILE__", line: %d, " + "catch signal %d, program exiting...", __LINE__, sig); } } static void sigHupHandler(int sig) { - logInfo("file: "__FILE__", line: %d, " \ + logInfo("file: "__FILE__", line: %d, " "catch signal %d", __LINE__, sig); }