add inited variable for run_by struct

support_rdma
YuQing 2023-10-18 17:20:14 +08:00
parent 7f6e7b12b4
commit c3f7254838
2 changed files with 54 additions and 46 deletions

View File

@ -40,8 +40,9 @@ SFGlobalVariables g_sf_global_vars = {
{{'/', 't', 'm', 'p', '\0'}, false}, {{'/', 't', 'm', 'p', '\0'}, false},
true, true, false, DEFAULT_MAX_CONNECTONS, true, true, false, DEFAULT_MAX_CONNECTONS,
SF_DEF_MAX_PACKAGE_SIZE, SF_DEF_MIN_BUFF_SIZE, SF_DEF_MAX_PACKAGE_SIZE, SF_DEF_MIN_BUFF_SIZE,
SF_DEF_MAX_BUFF_SIZE, 0, SF_DEF_THREAD_STACK_SIZE, SF_DEF_MAX_BUFF_SIZE, 0, SF_DEF_THREAD_STACK_SIZE, 0,
0, 0, 0, {'\0'}, {'\0'}, {SF_DEF_SYNC_LOG_BUFF_INTERVAL, false}, {false, 0, 0, {'\0'}, {'\0'}},
{SF_DEF_SYNC_LOG_BUFF_INTERVAL, false},
{0, 0}, NULL, {NULL, 0} {0, 0}, NULL, {NULL, 0}
}; };
@ -321,20 +322,20 @@ int sf_load_global_config_ex(const char *server_name,
pRunByGroup = iniGetStrValue(NULL, "run_by_group", ini_ctx->context); pRunByGroup = iniGetStrValue(NULL, "run_by_group", ini_ctx->context);
pRunByUser = iniGetStrValue(NULL, "run_by_user", ini_ctx->context); pRunByUser = iniGetStrValue(NULL, "run_by_user", ini_ctx->context);
if (pRunByGroup == NULL) { if (pRunByGroup == NULL) {
*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, snprintf(g_sf_global_vars.run_by.group,
sizeof(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') {
g_sf_global_vars.run_by_gid = getegid(); g_sf_global_vars.run_by.gid = getegid();
} }
else { else {
struct group *pGroup; struct group *pGroup;
pGroup = getgrnam(g_sf_global_vars.run_by_group); pGroup = getgrnam(g_sf_global_vars.run_by.group);
if (pGroup == NULL) { if (pGroup == NULL) {
result = errno != 0 ? errno : ENOENT; result = errno != 0 ? errno : ENOENT;
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
@ -344,24 +345,24 @@ int sf_load_global_config_ex(const char *server_name,
return result; return result;
} }
g_sf_global_vars.run_by_gid = pGroup->gr_gid; g_sf_global_vars.run_by.gid = pGroup->gr_gid;
} }
if (pRunByUser == NULL) { if (pRunByUser == NULL) {
*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, snprintf(g_sf_global_vars.run_by.user,
sizeof(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') {
g_sf_global_vars.run_by_uid = geteuid(); g_sf_global_vars.run_by.uid = geteuid();
} }
else { else {
struct passwd *pUser; struct passwd *pUser;
pUser = getpwnam(g_sf_global_vars.run_by_user); pUser = getpwnam(g_sf_global_vars.run_by.user);
if (pUser == NULL) { if (pUser == NULL) {
result = errno != 0 ? errno : ENOENT; result = errno != 0 ? errno : ENOENT;
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
@ -371,16 +372,17 @@ int sf_load_global_config_ex(const char *server_name,
return result; return result;
} }
g_sf_global_vars.run_by_uid = pUser->pw_uid; g_sf_global_vars.run_by.uid = pUser->pw_uid;
} }
g_sf_global_vars.run_by.inited = true;
if (SF_G_BASE_PATH_CREATED) { if (SF_G_BASE_PATH_CREATED) {
SF_CHOWN_TO_RUNBY_RETURN_ON_ERROR(SF_G_BASE_PATH_STR); SF_CHOWN_TO_RUNBY_RETURN_ON_ERROR(SF_G_BASE_PATH_STR);
} }
if (need_set_run_by) { if (need_set_run_by) {
if ((result=set_run_by(g_sf_global_vars.run_by_group, if ((result=set_run_by(g_sf_global_vars.run_by.group,
g_sf_global_vars.run_by_user)) != 0) g_sf_global_vars.run_by.user)) != 0)
{ {
return result; return result;
} }
@ -740,8 +742,8 @@ void sf_global_config_to_string_ex(const char *max_pkg_size_item_nm,
g_sf_global_vars.thread_stack_size / 1024, g_sf_global_vars.thread_stack_size / 1024,
pkg_buff, g_sf_global_vars.tcp_quick_ack, pkg_buff, g_sf_global_vars.tcp_quick_ack,
log_get_level_caption(), log_get_level_caption(),
g_sf_global_vars.run_by_group, g_sf_global_vars.run_by.group,
g_sf_global_vars.run_by_user g_sf_global_vars.run_by.user
); );
sf_log_config_to_string(&g_sf_global_vars.error_log, sf_log_config_to_string(&g_sf_global_vars.error_log,

View File

@ -49,10 +49,13 @@ typedef struct sf_global_variables {
int thread_stack_size; int thread_stack_size;
time_t up_time; time_t up_time;
gid_t run_by_gid; struct {
uid_t run_by_uid; bool inited;
char run_by_group[32]; gid_t gid;
char run_by_user[32]; uid_t uid;
char group[32];
char user[32];
} run_by;
SFLogConfig error_log; SFLogConfig error_log;
SFConnectionStat connection_stat; SFConnectionStat connection_stat;
@ -85,6 +88,7 @@ extern SFContext g_sf_context;
#define SF_G_NETWORK_TIMEOUT g_sf_global_vars.network_timeout #define SF_G_NETWORK_TIMEOUT g_sf_global_vars.network_timeout
#define SF_G_MAX_CONNECTIONS g_sf_global_vars.max_connections #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_THREAD_STACK_SIZE g_sf_global_vars.thread_stack_size
#define SF_G_UP_TIME g_sf_global_vars.up_time
#define SF_G_SOCK_HANDLER (g_sf_context.handlers + \ #define SF_G_SOCK_HANDLER (g_sf_context.handlers + \
SF_SOCKET_NETWORK_HANDLER_INDEX) SF_SOCKET_NETWORK_HANDLER_INDEX)
@ -113,19 +117,20 @@ extern SFContext g_sf_context;
#define SF_CHOWN_RETURN_ON_ERROR(path, current_uid, current_gid) \ #define SF_CHOWN_RETURN_ON_ERROR(path, current_uid, current_gid) \
do { \ do { \
if (!(g_sf_global_vars.run_by_gid == current_gid && \ if (g_sf_global_vars.run_by.inited && !(g_sf_global_vars. \
g_sf_global_vars.run_by_uid == current_uid)) \ 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, " \ if (chown(path, g_sf_global_vars.run_by.uid, \
"chown \"%s\" fail, " \ g_sf_global_vars.run_by.gid) != 0) \
"errno: %d, error info: %s", \ { \
__LINE__, path, errno, STRERROR(errno)); \ logError("file: "__FILE__", line: %d, " \
return errno != 0 ? errno : EPERM; \ "chown \"%s\" fail, " \
"errno: %d, error info: %s", \
__LINE__, path, errno, STRERROR(errno)); \
return errno != 0 ? errno : EPERM; \
} \
} \ } \
} \
} while (0) } while (0)
#define SF_CHOWN_TO_RUNBY_RETURN_ON_ERROR(path) \ #define SF_CHOWN_TO_RUNBY_RETURN_ON_ERROR(path) \
@ -134,19 +139,20 @@ extern SFContext g_sf_context;
#define SF_FCHOWN_RETURN_ON_ERROR(fd, path, current_uid, current_gid) \ #define SF_FCHOWN_RETURN_ON_ERROR(fd, path, current_uid, current_gid) \
do { \ do { \
if (!(g_sf_global_vars.run_by_gid == current_gid && \ if (g_sf_global_vars.run_by.inited && !(g_sf_global_vars. \
g_sf_global_vars.run_by_uid == current_uid)) \ 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, " \ if (fchown(fd, g_sf_global_vars.run_by.uid, \
"fchown \"%s\" fail, " \ g_sf_global_vars.run_by.gid) != 0) \
"errno: %d, error info: %s", \ { \
__LINE__, path, errno, STRERROR(errno)); \ logError("file: "__FILE__", line: %d, " \
return errno != 0 ? errno : EPERM; \ "fchown \"%s\" fail, " \
"errno: %d, error info: %s", \
__LINE__, path, errno, STRERROR(errno)); \
return errno != 0 ? errno : EPERM; \
} \
} \ } \
} \
} while (0) } while (0)
#define SF_FCHOWN_TO_RUNBY_RETURN_ON_ERROR(fd, path) \ #define SF_FCHOWN_TO_RUNBY_RETURN_ON_ERROR(fd, path) \