diff options
Diffstat (limited to 'src/framework/ipc/mgr_com/mgr_com.c')
-rw-r--r-- | src/framework/ipc/mgr_com/mgr_com.c | 2220 |
1 files changed, 1153 insertions, 1067 deletions
diff --git a/src/framework/ipc/mgr_com/mgr_com.c b/src/framework/ipc/mgr_com/mgr_com.c index a2998fa..d09f1d5 100644 --- a/src/framework/ipc/mgr_com/mgr_com.c +++ b/src/framework/ipc/mgr_com/mgr_com.c @@ -20,8 +20,7 @@ #include "types.h" #include "nstack_securec.h" -#include "nsfw_init.h" -#include "common_mem_api.h" +#include "nsfw_init_api.h" #include "nsfw_mgr_com_api.h" #include "mgr_com.h" @@ -32,13 +31,12 @@ #include <stddef.h> #include <sys/epoll.h> #include <fcntl.h> -#include <sys/stat.h> #include "nsfw_maintain_api.h" #include "nsfw_ps_api.h" #include "nsfw_fd_timer_api.h" -#include "common_func.h" +#include "nsfw_maintain_api.h" #ifdef __cplusplus /* *INDENT-OFF* */ @@ -46,49 +44,50 @@ extern "C"{ /* *INDENT-ON* */ #endif /* __cplusplus */ +nsfw_mgr_msg_fun g_mgr_fun[MGR_MSG_MAX][NSFW_MGRCOM_MAX_PROC_FUN]; /* *INDENT-OFF* */ +/* nstackMaster can't start daemon-stack successfully, + because daemon-stack can't successfully recv MGR_MSG_INIT_NTY_RSP */ +nsfw_mgr_init_cfg g_mgr_com_cfg = +{ + .msg_size = MGR_COM_MSG_COUNT_DEF, + .max_recv_timeout = MGR_COM_RECV_TIMEOUT_DEF, + .max_recv_drop_msg = MGR_COM_MAX_DROP_MSG_DEF, +}; -/* *INDENT-OFF* */ -nsfw_mgr_msg_fun g_mgr_fun[MGR_MSG_MAX][NSFW_MGRCOM_MAX_PROC_FUN]; -nsfw_mgr_init_cfg g_mgr_com_cfg; -nsfw_mgr_sock_map g_mgr_socket_map = {{0}, NULL}; +nsfw_mgr_sock_map g_mgr_sockt_map = {{0}, NULL}; nsfw_mgrcom_stat g_mgr_stat; -nsfw_mgrcom_proc g_ep_proc = { 0 }; -/* *INDENT-ON* */ - +nsfw_mgrcom_proc g_ep_proc = {0}; u32 g_mgr_sockfdmax = NSFW_MGRCOM_MAX_SOCKET; + char g_proc_info[NSFW_PROC_MAX][NSTACK_MAX_PROC_NAME_LEN] = { - "", "nStackMain", "nStackMaster", "nStackLib", "nStackTools", "nStackCtrl", - "", "", "", "", "", "", "", "", "", "" + "" + ,"nStackMain" + ,"nStackMaster" + ,"nStackLib" + ,"nStackCtrl" + ,"nStackTools" + ,"","","","","" + ,"","","","","" }; - /* *INDENT-ON* */ -int g_thread_policy = 0; -int g_thread_pri = 0; +char *g_home_direct = NULL; -void -nsfw_com_attr_set (int policy, int pri) +char *nsfw_get_proc_name(u8 proc_type) { - g_thread_policy = policy; - g_thread_pri = pri; -} - -char * -nsfw_get_proc_name (u8 proc_type) -{ - if (proc_type >= NSFW_PROC_MAX || NSFW_PROC_NULL == proc_type) + if (proc_type >= NSFW_PROC_MAX || NSFW_PROC_NULL == proc_type) { - return NULL; + return NULL; } - return g_proc_info[proc_type]; + return g_proc_info[proc_type]; } /***************************************************************************** * Prototype : nsfw_mgr_reg_msg_fun -* Description : reg the callback function when receive new message +* Description : reg the callback funciton when receive new message * Input : u16 msg_type * nsfw_mgr_msg_fun fun * Output : None @@ -96,29 +95,29 @@ nsfw_get_proc_name (u8 proc_type) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_reg_msg_fun (u16 msg_type, nsfw_mgr_msg_fun fun) +u8 nsfw_mgr_reg_msg_fun(u16 msg_type, nsfw_mgr_msg_fun fun) { - u32 i; - if (MGR_MSG_MAX <= msg_type) + u32 i; + if (MGR_MSG_MAX <= msg_type) { - NSFW_LOGERR ("reg mgr_msg]msg_type=%u,fun=%p", msg_type, fun); - return FALSE; + NSFW_LOGERR("reg mgr_msg]msg_type=%u,fun=%p", msg_type, fun); + return FALSE; } - for (i = 0; i < NSFW_MGRCOM_MAX_PROC_FUN; i++) + for (i = 0; i < NSFW_MGRCOM_MAX_PROC_FUN; i++) { - if (NULL == g_mgr_fun[msg_type][i]) + if (NULL == g_mgr_fun[msg_type][i]) { - g_mgr_fun[msg_type][i] = fun; - NSFW_LOGINF ("reg mgr_msg fun suc]msg_type=%u,fun=%p", msg_type, - fun); - return TRUE; + /*TODO should use cas */ + g_mgr_fun[msg_type][i] = fun; + NSFW_LOGINF("reg mgr_msg fun suc]msg_type=%u,fun=%p", msg_type, + fun); + return TRUE; } } - NSFW_LOGERR ("reg mgr_msg type full]msg_type=%u,fun=%p", msg_type, fun); - return FALSE; + NSFW_LOGERR("reg mgr_msg type full]msg_type=%u,fun=%p", msg_type, fun); + return FALSE; } /***************************************************************************** @@ -130,10 +129,9 @@ nsfw_mgr_reg_msg_fun (u16 msg_type, nsfw_mgr_msg_fun fun) * Calls : * Called By : *****************************************************************************/ -nsfw_mgr_msg * -nsfw_mgr_null_rspmsg_alloc () +nsfw_mgr_msg *nsfw_mgr_null_rspmsg_alloc() { - return nsfw_mgr_msg_alloc (MGR_MSG_NULL, NSFW_PROC_NULL); + return nsfw_mgr_msg_alloc(MGR_MSG_NULL, NSFW_PROC_NULL); } /***************************************************************************** @@ -146,86 +144,75 @@ nsfw_mgr_null_rspmsg_alloc () * Calls : * Called By : *****************************************************************************/ -nsfw_mgr_msg * -nsfw_mgr_msg_alloc (u16 msg_type, u8 dst_proc_type) +nsfw_mgr_msg *nsfw_mgr_msg_alloc(u16 msg_type, u8 dst_proc_type) { - nsfw_mgr_msg *p_msg = NULL; - u8 from_mem_flag = FALSE; - u32 alloc_len = sizeof (nsfw_mgr_msg); + nsfw_mgr_msg *p_msg = NULL; + u8 from_mem_flag = FALSE; + u32 alloc_len = sizeof(nsfw_mgr_msg); - if (MGR_MSG_LAG_QRY_RSP_BEGIN <= msg_type) + if (MGR_MSG_LAG_QRY_RSP_BEGIN <= msg_type + || MGR_MSG_SPLNET_REQ == msg_type) { - from_mem_flag = TRUE; - alloc_len = NSFW_MGR_LARGE_MSG_LEN; + from_mem_flag = TRUE; + alloc_len = NSFW_MGR_LARGE_MSG_LEN; } - if ((NULL == g_mgr_com_cfg.msg_pool) - && (MGR_MSG_INIT_NTY_REQ == msg_type - || MGR_MSG_INIT_NTY_RSP == msg_type)) + if ((NULL == g_mgr_com_cfg.msg_pool) + && (MGR_MSG_INIT_NTY_REQ == msg_type + || MGR_MSG_INIT_NTY_RSP == msg_type)) { - from_mem_flag = TRUE; + from_mem_flag = TRUE; } - if (FALSE == from_mem_flag) + if (FALSE == from_mem_flag) { - if (0 == - nsfw_mem_ring_dequeue (g_mgr_com_cfg.msg_pool, (void *) &p_msg)) + if (0 == + nsfw_mem_ring_dequeue(g_mgr_com_cfg.msg_pool, (void *) &p_msg)) { - NSFW_LOGERR ("alloc msg full]type=%u,dst=%u", msg_type, - dst_proc_type); - return NULL; + NSFW_LOGERR("alloc msg full]type=%u,dst=%u", msg_type, + dst_proc_type); + return NULL; } - alloc_len = sizeof (nsfw_mgr_msg); + alloc_len = sizeof(nsfw_mgr_msg); } - else + else { - p_msg = (nsfw_mgr_msg *) malloc (alloc_len); + p_msg = (nsfw_mgr_msg *) malloc(alloc_len); /*malloc() can be used */ } - if (NULL == p_msg) + if (NULL == p_msg) { - NSFW_LOGERR ("alloc msg nul]type=%u,dst=%u", msg_type, dst_proc_type); - return NULL; + NSFW_LOGERR("alloc msg nul]type=%u,dst=%u", msg_type, dst_proc_type); + return NULL; } - if (EOK != MEMSET_S (p_msg, alloc_len, 0, alloc_len)) + if (EOK != memset_s(p_msg, alloc_len, 0, alloc_len)) { - p_msg->from_mem = from_mem_flag; - nsfw_mgr_msg_free (p_msg); - NSFW_LOGERR ("alloc msg MEMSET_S failed]type=%u,dst=%u", msg_type, - dst_proc_type); - return NULL; + p_msg->from_mem = from_mem_flag; + + nsfw_mgr_msg_free(p_msg); + NSFW_LOGERR("alloc msg memset_s failed]type=%u,dst=%u", msg_type, + dst_proc_type); + return NULL; } - p_msg->from_mem = from_mem_flag; + p_msg->from_mem = from_mem_flag; - if (msg_type < MGR_MSG_RSP_BASE && msg_type > 0) + if (msg_type < MGR_MSG_RSP_BASE && msg_type > 0) { - p_msg->seq = common_mem_atomic32_add_return (&g_mgr_com_cfg.cur_idx, 1); + p_msg->seq = dmm_atomic_add_return(&g_mgr_com_cfg.cur_idx, 1); } - p_msg->from_mem = from_mem_flag; - p_msg->msg_type = msg_type; - p_msg->src_pid = get_sys_pid (); - p_msg->src_proc_type = g_mgr_com_cfg.proc_type; - p_msg->msg_len = alloc_len; - p_msg->dst_proc_type = dst_proc_type; - p_msg->alloc_flag = TRUE; - p_msg->more_msg_flag = 0; + p_msg->from_mem = from_mem_flag; + p_msg->msg_type = msg_type; + p_msg->src_pid = get_sys_pid(); + p_msg->src_proc_type = g_mgr_com_cfg.proc_type; + p_msg->msg_len = alloc_len; + p_msg->dst_proc_type = dst_proc_type; + p_msg->alloc_flag = TRUE; + p_msg->more_msg_flag = 0; - g_mgr_stat.msg_alloc++; - return p_msg; -} - -static inline void -lint_lock_1 () -{ - return; -} - -static inline void -lint_unlock_1 () -{ - return; + g_mgr_stat.msg_alloc++; + return p_msg; } /***************************************************************************** @@ -237,27 +224,26 @@ lint_unlock_1 () * Calls : * Called By : *****************************************************************************/ -nsfw_mgr_msg * -nsfw_mgr_rsp_msg_alloc (nsfw_mgr_msg * req_msg) +nsfw_mgr_msg *nsfw_mgr_rsp_msg_alloc(nsfw_mgr_msg * req_msg) { - nsfw_mgr_msg *p_msg = NULL; - if (NULL == req_msg) + nsfw_mgr_msg *p_msg = NULL; + if (NULL == req_msg) { - NSFW_LOGERR ("req msg nul!"); - return NULL; + NSFW_LOGERR("req msg nul!"); + return NULL; } - p_msg = - nsfw_mgr_msg_alloc (req_msg->msg_type + MGR_MSG_RSP_BASE, - req_msg->src_proc_type); - if (NULL == p_msg) + p_msg = + nsfw_mgr_msg_alloc(req_msg->msg_type + MGR_MSG_RSP_BASE, + req_msg->src_proc_type); + if (NULL == p_msg) { - return NULL; + return NULL; } - p_msg->dst_pid = req_msg->src_pid; - p_msg->seq = req_msg->seq; - return p_msg; + p_msg->dst_pid = req_msg->src_pid; + p_msg->seq = req_msg->seq; + return p_msg; } /***************************************************************************** @@ -269,44 +255,87 @@ nsfw_mgr_rsp_msg_alloc (nsfw_mgr_msg * req_msg) * Calls : * Called By : *****************************************************************************/ -void -nsfw_mgr_msg_free (nsfw_mgr_msg * msg) +void nsfw_mgr_msg_free(nsfw_mgr_msg * msg) { - if (NULL == msg) + + if (NULL == msg) { - return; + return; } - if (FALSE == msg->alloc_flag) + if (FALSE == msg->alloc_flag) + { + NSFW_LOGERR("msg refree]msg=%p, type=%u", msg, msg->msg_type); + return; + } + + msg->alloc_flag = FALSE; + + if (TRUE == msg->from_mem) + { + /*remove msg->msg_type judgement */ + free(msg); /*free() can be used */ + g_mgr_stat.msg_free++; + return; + } + else { - NSFW_LOGERR ("msg refree]msg=%p, type=%u", msg, msg->msg_type); - return; + if (0 == nsfw_mem_ring_enqueue(g_mgr_com_cfg.msg_pool, msg)) + { + NSFW_LOGERR("msg free failed pool full]msg=%p, type=%u", msg, + msg->msg_type); + return; + } + g_mgr_stat.msg_free++; } - msg->alloc_flag = FALSE; + return; +} - if (TRUE == msg->from_mem) +/***************************************************************************** +* Prototype : get_home_path +* Description : get the env "HOME" path info +* Input : +* Output : None +* Return Value : int +* Calls : +* Called By : +*****************************************************************************/ +const char *get_home_path() +{ + //a extern global var, if not null ,just return it. + if (g_home_direct) { - if ((MGR_MSG_INIT_NTY_REQ == msg->msg_type - || MGR_MSG_INIT_NTY_RSP == msg->msg_type) - || (MGR_MSG_LAG_QRY_RSP_BEGIN <= msg->msg_type)) + return g_home_direct; + } + + //just need do one time. + const char *home_dir = getenv("HOME"); /*getenv() can be used */ + if (getuid() != 0 && home_dir != NULL) + { + g_home_direct = realpath(home_dir, NULL); + if (!g_home_direct) { - free (msg); - g_mgr_stat.msg_free++; - return; + NSFW_LOGWAR("realpath fail]home_dir=%s,errno=%d", home_dir, + errno); + return NULL; } - NSFW_LOGERR ("msg err free]type=%u", msg->msg_type); } - if (0 == nsfw_mem_ring_enqueue (g_mgr_com_cfg.msg_pool, msg)) + //check if the path is valid + if (check_log_dir_valid(g_home_direct) < 0) { - NSFW_LOGERR ("msg free failed pool full]msg=%p, type=%u", msg, - msg->msg_type); - return; + NSFW_LOGWAR("path check valid fail, free it]home_direct=%s", + g_home_direct); + if (g_home_direct) + { + free(g_home_direct); + g_home_direct = NULL; + } + return NULL; } - g_mgr_stat.msg_free++; - return; + return g_home_direct; } /***************************************************************************** @@ -318,82 +347,99 @@ nsfw_mgr_msg_free (nsfw_mgr_msg * msg) * Calls : * Called By : *****************************************************************************/ -i32 -nsfw_mgr_get_listen_socket () +i32 nsfw_mgr_get_listen_socket() { - i32 fd, len, retVal; - struct sockaddr_un un; - char name[NSFW_MGRCOM_PATH_LEN] = { 0 }; + i32 fd, len; + struct sockaddr_un un; - if ((fd = nsfw_base_socket (AF_UNIX, SOCK_STREAM, 0)) < 0) + if ((fd = nsfw_base_socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - NSFW_LOGERR ("create sock failed!"); - return -1; + NSFW_LOGERR("create sock failed!"); + return -1; } - retVal = STRCPY_S ((char *) name, sizeof (name), - (char *) g_mgr_com_cfg.domain_path); - if (EOK != retVal) + if (-1 == unlink((char *) g_mgr_com_cfg.domain_path)) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("module mgr get listen STRCPY_S failed! ret=%d", retVal); - return -1; + NSFW_LOGWAR("unlink failed]error=%d", errno); } - if (EOK != STRCAT_S (name, NSFW_MGRCOM_PATH_LEN, NSFW_MAIN_FILE)) + if (EOK != memset_s(&un, sizeof(un), 0, sizeof(un))) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("module mgr get listen STRCAT_S failed!"); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("create sock memset_s failed!] error=%d", errno); + return -1; } - if (-1 == unlink ((char *) name)) + un.sun_family = AF_UNIX; + int retVal = strcpy_s((char *) un.sun_path, sizeof(un.sun_path), + (char *) g_mgr_com_cfg.domain_path); + if (EOK != retVal) { - NSFW_LOGWAR ("unlink failed]error=%d", errno); + (void) nsfw_base_close(fd); + NSFW_LOGERR("create sock strcpy_s failed!] error=%d", errno); + return -1; } - if (EOK != MEMSET_S (&un, sizeof (un), 0, sizeof (un))) + + /* close on exec */ + int rc = nsfw_set_close_on_exec(fd); + if (rc == -1) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("create sock MEMSET_S failed!] error=%d", errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("set exec err]fd=%d, errno=%d", fd, errno); + return -1; } - un.sun_family = AF_UNIX; - retVal = STRCPY_S ((char *) un.sun_path, sizeof (un.sun_path), - (char *) name); - if (EOK != retVal) + len = offsetof(struct sockaddr_un, sun_path) +strlen((char *) g_mgr_com_cfg.domain_path); /*strlen() can be used */ + + if (nsfw_base_bind(fd, (struct sockaddr *) &un, len) < 0) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("create sock STRCPY_S failed!] error=%d", errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("bind failed!]mgr_fd=%d,error=%d", fd, errno); + return -1; } - int rc = nsfw_set_close_on_exec (fd); - if (rc == -1) + if (nsfw_base_listen(fd, 10) < 0) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("set exec err]fd=%d, errno=%d", fd, errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("listen failed!]mgr_fd=%d,error=%d", fd, errno); + return -1; } - len = offsetof (struct sockaddr_un, sun_path) +strlen ((char *) name); + NSFW_LOGINF("mgr com start with]mgr_fd=%d", fd); + return fd; +} - if (nsfw_base_bind (fd, (struct sockaddr *) &un, len) < 0) +/***************************************************************************** +* Prototype : nsfw_mgr_connect_with_retry +* Description : connect dst_socket, retry some times every 100ms +* Input : nsfw_mgr_msg* req_msg +* nsfw_mgr_msg* rsp_msg +* Output : None +* Return Value : u8 +* Calls : +* Called By : +*****************************************************************************/ +i32 nsfw_mgr_connect_with_retry(i32 fd, struct sockaddr * un, i32 len, + i32 interval_ms, i32 retry_times) +{ + if (nsfw_base_connect(fd, un, len) == 0) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("bind failed!]mgr_fd=%d,error=%d", fd, errno); - return -1; + return 0; } - - if (nsfw_base_listen (fd, 10) < 0) + while (retry_times > 0) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("listen failed!]mgr_fd=%d,error=%d", fd, errno); - return -1; + sys_sleep_ns(0, interval_ms * 1000 * 1000); + --retry_times; + if (nsfw_base_connect(fd, un, len) == 0) + { + return 0; + } + else if (errno != ECONNRESET && errno != ECONNREFUSED) /* Retry is for Master upgrade only */ + { + return -1; + } } - - NSFW_LOGINF ("mgr com start with]mgr_fd=%d", fd); - return fd; + return -1; } /***************************************************************************** @@ -406,115 +452,138 @@ nsfw_mgr_get_listen_socket () * Calls : * Called By : *****************************************************************************/ -i32 -nsfw_mgr_get_connect_socket (u8 proc_type, u32 host_pid) +i32 nsfw_mgr_get_connect_socket(u8 proc_type, u32 host_pid) { - i32 fd, len; - char *name; - struct sockaddr_un un; - const char *directory = NSFW_DOMAIN_DIR; - const char *home_dir = getenv ("HOME"); + i32 fd = -1; + i32 len = 0; + char *name; + struct sockaddr_un un; + i32 retry_times = 0; + i32 interval_ms = 50; + const char *directory = NSFW_DOMAIN_DIR; + const char *home_dir = get_home_path(); + if (home_dir) + { + directory = home_dir; + } - if (getuid () != 0 && home_dir != NULL) - directory = home_dir; + switch (proc_type) + { + case NSFW_PROC_MAIN: + name = NSFW_MAIN_FILE; + break; + case NSFW_PROC_MASTER: + name = NSFW_MASTER_FILE; + retry_times = 10; + break; + case NSFW_PROC_ALARM: /* alarm */ + directory = "/tmp"; + name = NSFW_ALARM_FILE; + break; + default: + NSFW_LOGERR("get dst socket err]type=%u,pid=%u", proc_type, + host_pid); + return -1; + } - switch (proc_type) + if ((fd = nsfw_base_socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - case NSFW_PROC_MAIN: - name = NSFW_MAIN_FILE; - break; - case NSFW_PROC_ALARM: - directory = "/tmp"; - name = NSFW_ALARM_FILE; - break; - default: - NSFW_LOGERR ("get dst socket err]type=%u,pid=%u", proc_type, host_pid); - return -1; + NSFW_LOGERR("create socket err]type=%u,pid=%u,errno=%d", proc_type, + host_pid, errno); + return -1; } - if ((fd = nsfw_base_socket (AF_UNIX, SOCK_STREAM, 0)) < 0) + if (EOK != memset_s(&un, sizeof(un), 0, sizeof(un))) { - NSFW_LOGERR ("create socket err]type=%u,pid=%u,errno=%d", proc_type, - host_pid, errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("get dst socket err]mgr_fd=%d,type=%u,pid=%u", fd, + proc_type, host_pid); + return -1; } - if (EOK != MEMSET_S (&un, sizeof (un), 0, sizeof (un))) + struct timeval tv; + tv.tv_sec = MGR_COM_RECV_TIMEOUT; + tv.tv_usec = 0; + if (nsfw_base_setsockopt + (fd, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof tv)) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("get dst socket err]mgr_fd=%d,type=%u,pid=%u", fd, - proc_type, host_pid); - return -1; + NSFW_LOGERR + ("setsockopt socket err]mgr_fd=%d,type=%u,pid=%u,errno=%d", fd, + proc_type, host_pid, errno); + (void) nsfw_base_close(fd); + return -1; } - struct timeval tv; - tv.tv_sec = MGR_COM_RECV_TIMEOUT; - tv.tv_usec = 0; - if (nsfw_base_setsockopt - (fd, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof tv)) + tv.tv_sec = MGR_COM_SEND_TIMEOUT_DEF; + tv.tv_usec = 0; + if (nsfw_base_setsockopt + (fd, SOL_SOCKET, SO_SNDTIMEO, (char *) &tv, sizeof tv)) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("setsockopt socket err]mgr_fd=%d,type=%u,pid=%u", fd, - proc_type, host_pid); - return -1; + NSFW_LOGERR + ("setsockopt socket err]mgr_fd=%d,type=%u,pid=%u,errno=%d", fd, + proc_type, host_pid, errno); + (void) nsfw_base_close(fd); + return -1; } - int rc = nsfw_set_close_on_exec (fd); - if (rc == -1) + /* close on exec Add Begin */ + int rc = nsfw_set_close_on_exec(fd); + if (rc == -1) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("set exec err]fd=%d, errno=%d", fd, errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("set exec err]fd=%d, errno=%d", fd, errno); + return -1; } - int size, size_len; - size = MAX_RECV_BUF_DEF; - size_len = sizeof (size); - if (0 > - nsfw_base_setsockopt (fd, SOL_SOCKET, SO_RCVBUF, (void *) &size, - (socklen_t) size_len)) + int size, size_len; + size = MAX_RECV_BUF_DEF; + size_len = sizeof(size); + if (0 > + nsfw_base_setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *) &size, + (socklen_t) size_len)) { - NSFW_LOGERR ("set socket opt err!]error=%d", errno); + NSFW_LOGERR("set socket opt err]error=%d", errno); } - if (0 > - nsfw_base_setsockopt (fd, SOL_SOCKET, SO_SNDBUF, (void *) &size, - (socklen_t) size_len)) + if (0 > + nsfw_base_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void *) &size, + (socklen_t) size_len)) { - NSFW_LOGERR ("set socket opt err!]error=%d", errno); + NSFW_LOGERR("set socket opt err]error=%d", errno); } - un.sun_family = AF_UNIX;; - int retVal = STRCPY_S ((char *) un.sun_path, sizeof (un.sun_path), - (char *) directory); - if (EOK != retVal) + un.sun_family = AF_UNIX;; + int retVal = strcpy_s((char *) un.sun_path, sizeof(un.sun_path), + (char *) directory); + if (EOK != retVal) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("create sock STRCPY_S failed!] error=%d", errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("create sock strcpy_s fail]error=%d", errno); + return -1; } - retVal = STRCAT_S (un.sun_path, sizeof (un.sun_path), name); - if (EOK != retVal) + retVal = strcat_s(un.sun_path, sizeof(un.sun_path), name); + if (EOK != retVal) { - (void) nsfw_base_close (fd); - NSFW_LOGERR ("create sock STRCAT_S failed!] error=%d", errno); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR("create sock strcat_s fail]error=%d", errno); + return -1; } - len = offsetof (struct sockaddr_un, sun_path) +strlen (un.sun_path); - if (nsfw_base_connect (fd, (struct sockaddr *) &un, len) < 0) + len = offsetof(struct sockaddr_un, sun_path) +strlen(un.sun_path); /*strlen() can be used */ + if (nsfw_mgr_connect_with_retry + (fd, (struct sockaddr *) &un, len, interval_ms, retry_times) < 0) { - (void) nsfw_base_close (fd); - NSFW_LOGERR - ("create socket err]mgr_fd=%d,type=%u,pid=%u,errno=%d,path=%s", fd, - proc_type, host_pid, errno, un.sun_path); - return -1; + (void) nsfw_base_close(fd); + NSFW_LOGERR + ("connect socket failed]mgr_fd=%d,type=%u,pid=%u,errno=%d,path=%s", + fd, proc_type, host_pid, errno, un.sun_path); + return -1; } - NSFW_LOGINF ("get dst socket]mgr_fd=%d,type=%u,pid=%u", fd, proc_type, - host_pid); - return (fd); + NSFW_LOGINF("get dst socket]mgr_fd=%d,type=%u,pid=%u", fd, proc_type, + host_pid); + return fd; } /***************************************************************************** @@ -528,33 +597,42 @@ nsfw_mgr_get_connect_socket (u8 proc_type, u32 host_pid) * Calls : * Called By : *****************************************************************************/ -NSTACK_STATIC inline u8 -nsfw_mgr_new_socket (i32 fd, u8 proc_type, u32 host_pid) +NSTACK_STATIC inline u8 nsfw_mgr_new_socket(i32 fd, u8 proc_type, + u32 host_pid) { - nsfw_mgr_sock_info *sock_info = NULL; - if (((i32) NSFW_MGR_FD_MAX <= fd) || (fd < 0) || (!g_mgr_socket_map.sock)) + nsfw_mgr_sock_info *sock_info = NULL; + if (((i32) NSFW_MGR_FD_MAX <= fd) || (fd < 0) || (!g_mgr_sockt_map.sock)) { - NSFW_LOGERR ("fd err]mgr_fd=%d, sock=%p", fd, g_mgr_socket_map.sock); - return FALSE; + NSFW_LOGERR("fd err]mgr_fd=%d, sock=%p", fd, g_mgr_sockt_map.sock); + return FALSE; } - sock_info = &g_mgr_socket_map.sock[fd]; - if (host_pid != sock_info->host_pid) + sock_info = &g_mgr_sockt_map.sock[fd]; + if (host_pid != sock_info->host_pid) { - NSFW_LOGDBG - ("update sock info]mgr_fd=%d,old_pid=%u,new_pid=%u,type=%u", fd, - sock_info->host_pid, host_pid, proc_type); + /* Fix mgr fd leak */ + if (g_mgr_com_cfg.proc_type == NSFW_PROC_MAIN + && (proc_type == NSFW_PROC_MAIN || proc_type == NSFW_PROC_MASTER)) + { + NSFW_LOGINF("update sock]fd=%d,opid=%u,npid=%u,type=%u", fd, + sock_info->host_pid, host_pid, proc_type); + } + else + { + NSFW_LOGDBG("update sock]fd=%d,opid=%u,npid=%u,type=%u", fd, + sock_info->host_pid, host_pid, proc_type); + } } - sock_info->host_pid = host_pid; - sock_info->proc_type = proc_type; + sock_info->host_pid = host_pid; + sock_info->proc_type = proc_type; - if (proc_type < NSFW_PROC_MAX) + if (proc_type < NSFW_PROC_MAX) { - g_mgr_socket_map.proc_cache[proc_type] = fd; + g_mgr_sockt_map.proc_cache[proc_type] = fd; } - return TRUE; + return TRUE; } /***************************************************************************** @@ -566,29 +644,28 @@ nsfw_mgr_new_socket (i32 fd, u8 proc_type, u32 host_pid) * Calls : * Called By : *****************************************************************************/ -NSTACK_STATIC inline u8 -nsfw_mgr_del_socket (u32 fd) +NSTACK_STATIC inline u8 nsfw_mgr_del_socket(u32 fd) { - nsfw_mgr_sock_info *sock_info = NULL; - if ((NSFW_MGR_FD_MAX <= fd) || (!g_mgr_socket_map.sock)) + nsfw_mgr_sock_info *sock_info = NULL; + if ((NSFW_MGR_FD_MAX <= fd) || (!g_mgr_sockt_map.sock)) { - NSFW_LOGERR ("fd err]mgr_fd=%u, sock=%p", fd, g_mgr_socket_map.sock); - return FALSE; + NSFW_LOGERR("fd err]mgr_fd=%u,sock=%p", fd, g_mgr_sockt_map.sock); + return FALSE; } - sock_info = &g_mgr_socket_map.sock[fd]; + sock_info = &g_mgr_sockt_map.sock[fd]; - if (sock_info->proc_type < NSFW_PROC_MAX - && fd == g_mgr_socket_map.proc_cache[sock_info->proc_type]) + if (sock_info->proc_type < NSFW_PROC_MAX + && fd == g_mgr_sockt_map.proc_cache[sock_info->proc_type]) { - g_mgr_socket_map.proc_cache[sock_info->proc_type] = 0; + g_mgr_sockt_map.proc_cache[sock_info->proc_type] = 0; } - NSFW_LOGDBG ("del sock]mgr_fd=%u,type=%u,pid=%u", fd, - sock_info->proc_type, sock_info->host_pid); - sock_info->host_pid = 0; - sock_info->proc_type = 0; - return TRUE; + NSFW_LOGDBG("del sock]mgr_fd=%u,type=%u,pid=%u", fd, + sock_info->proc_type, sock_info->host_pid); + sock_info->host_pid = 0; + sock_info->proc_type = 0; + return TRUE; } /***************************************************************************** @@ -601,53 +678,52 @@ nsfw_mgr_del_socket (u32 fd) * Calls : * Called By : *****************************************************************************/ -NSTACK_STATIC inline i32 -nsfw_mgr_get_dst_socket (u8 proc_type, u32 dst_pid) +NSTACK_STATIC inline i32 nsfw_mgr_get_dst_socket(u8 proc_type, u32 dst_pid) { - i32 fd = -1; + i32 fd = -1; - nsfw_mgr_sock_info *sock_info = NULL; + nsfw_mgr_sock_info *sock_info = NULL; - if (proc_type < NSFW_PROC_MAX) + if (proc_type < NSFW_PROC_MAX) { - fd = g_mgr_socket_map.proc_cache[proc_type]; + fd = g_mgr_sockt_map.proc_cache[proc_type]; } - if (!g_mgr_socket_map.sock) + if (!g_mgr_sockt_map.sock) { - return -1; + return -1; } - if (fd > 0 && fd < (i32) NSFW_MGR_FD_MAX) + if (fd > 0 && fd < (i32) NSFW_MGR_FD_MAX) { - sock_info = &g_mgr_socket_map.sock[fd]; - if (sock_info->host_pid != 0) + sock_info = &g_mgr_sockt_map.sock[fd]; + if (sock_info->host_pid != 0) { - if (0 == dst_pid || dst_pid == sock_info->host_pid) + if (0 == dst_pid || dst_pid == sock_info->host_pid) { - return fd; + return fd; } } - else if (proc_type == sock_info->proc_type) + else if (proc_type == sock_info->proc_type) { - return fd; + return fd; } } - i32 i; - for (i = 0; i < (i32) NSFW_MGR_FD_MAX; i++) + i32 i; + for (i = 0; i < (i32) NSFW_MGR_FD_MAX; i++) { - sock_info = &g_mgr_socket_map.sock[i]; - if (sock_info->host_pid != 0 && proc_type == sock_info->proc_type) + sock_info = &g_mgr_sockt_map.sock[i]; + if (sock_info->host_pid != 0 && proc_type == sock_info->proc_type) { - if (0 == dst_pid || dst_pid == sock_info->host_pid) + if (0 == dst_pid || dst_pid == sock_info->host_pid) { - return i; + return i; } } } - return -1; + return -1; } /***************************************************************************** @@ -660,17 +736,16 @@ nsfw_mgr_get_dst_socket (u8 proc_type, u32 dst_pid) * Calls : * Called By : *****************************************************************************/ -i32 -nsfw_mgr_get_new_socket (u8 proc_type, u32 dst_pid) +i32 nsfw_mgr_get_new_socket(u8 proc_type, u32 dst_pid) { - i32 fd = 0; - fd = nsfw_mgr_get_connect_socket (proc_type, dst_pid); - if (fd > 0) + i32 fd = 0; + fd = nsfw_mgr_get_connect_socket(proc_type, dst_pid); + if (fd > 0) { - (void) nsfw_mgr_new_socket (fd, proc_type, dst_pid); - (void) nsfw_mgr_reg_sock_fun (fd, nsfw_mgr_new_msg); + (void) nsfw_mgr_new_socket(fd, proc_type, dst_pid); + (void) nsfw_mgr_reg_sock_fun(fd, nsfw_mgr_new_msg); } - return fd; + return fd; } /***************************************************************************** @@ -682,20 +757,19 @@ nsfw_mgr_get_new_socket (u8 proc_type, u32 dst_pid) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_clr_fd_lock () +u8 nsfw_mgr_clr_fd_lock() { - i32 i; - if (!g_mgr_socket_map.sock) + i32 i; + if (!g_mgr_sockt_map.sock) { - NSFW_LOGERR ("clr fd lock fail, sock is null"); - return FALSE; + NSFW_LOGERR("clr fd lock fail, sock is null"); + return FALSE; } - for (i = 0; i < (i32) NSFW_MGR_FD_MAX; i++) + for (i = 0; i < (i32) NSFW_MGR_FD_MAX; i++) { - common_mem_spinlock_init (&(g_mgr_socket_map.sock[i].opr_lock)); + dmm_spin_init(&(g_mgr_sockt_map.sock[i].opr_lock)); } - return TRUE; + return TRUE; } /***************************************************************************** @@ -708,15 +782,14 @@ nsfw_mgr_clr_fd_lock () * Calls : * Called By : *****************************************************************************/ -void -nsfw_mgr_close_dst_proc (u8 proc_type, u32 dst_pid) +void nsfw_mgr_close_dst_proc(u8 proc_type, u32 dst_pid) { - i32 fd = nsfw_mgr_get_dst_socket (proc_type, dst_pid); - if (fd > 0) + i32 fd = nsfw_mgr_get_dst_socket(proc_type, dst_pid); + if (fd > 0) { - (void) nsfw_mgr_del_socket (fd); - (void) nsfw_mgr_unreg_sock_fun (fd); - (void) nsfw_base_close (fd); + (void) nsfw_mgr_del_socket(fd); + (void) nsfw_mgr_unreg_sock_fun(fd); + (void) nsfw_base_close(fd); } } @@ -730,49 +803,49 @@ nsfw_mgr_close_dst_proc (u8 proc_type, u32 dst_pid) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_send_msg_socket (u32 fd, nsfw_mgr_msg * msg) +u8 nsfw_mgr_send_msg_socket(u32 fd, nsfw_mgr_msg * msg) { - i32 send_len = 0; - i32 off_set = 0; + i32 send_len = 0; + i32 off_set = 0; - if (NULL == msg) + if (NULL == msg) { - NSFW_LOGERR ("msg nul]mgr_fd=%u", fd); - return FALSE; + NSFW_LOGERR("msg nul]mgr_fd=%u", fd); + return FALSE; } - if (msg->msg_len < sizeof (nsfw_mgr_msg)) + if (msg->msg_len < sizeof(nsfw_mgr_msg)) { - msg->msg_len = sizeof (nsfw_mgr_msg); + msg->msg_len = sizeof(nsfw_mgr_msg); } - if (msg->msg_type == MGR_MSG_LARGE_ALARM_RSP) + /* only need send msg->msg_body */ + if (msg->msg_type == MGR_MSG_LARGE_ALARM_RSP) { - off_set = NSFW_MGR_MSG_HDR_LEN; + off_set = NSFW_MGR_MSG_HDR_LEN; } - do + /*TODO if closed by peer, may send failed, should close this fd */ + do { - off_set += send_len; - send_len = - nsfw_base_send (fd, (char *) msg + off_set, msg->msg_len - off_set, - MSG_NOSIGNAL); - if (send_len <= 0) + off_set += send_len; + send_len = + nsfw_base_send(fd, (char *) msg + off_set, + msg->msg_len - off_set, MSG_NOSIGNAL); + if (send_len <= 0) { - NSFW_LOGERR - ("send error]mgr_fd=%u,send_len=%d,off_set=%d,errno=%d" MSGINFO, - fd, send_len, off_set, errno, PRTMSG (msg)); - return FALSE; + NSFW_LOGERR("send err]mgr_fd=%u,send_len=%d,off_set=%d,errno=%d" + MSGINFO, fd, send_len, off_set, errno, PRTMSG(msg)); + return FALSE; } } - while ((send_len + off_set) < (i32) msg->msg_len); - NSFW_LOGDBG ("send mgr_msg suc]mgr_fd=%u," MSGINFO, fd, PRTMSG (msg)); - g_mgr_stat.msg_send[msg->msg_type]++; - return TRUE; + while ((send_len + off_set) < (i32) msg->msg_len); + NSFW_LOGDBG("send mgr_msg suc]mgr_fd=%u," MSGINFO, fd, PRTMSG(msg)); + g_mgr_stat.msg_send[msg->msg_type]++; + return TRUE; } -#define MAX_RECV_COUNT 100 +#define MAX_RECV_COUNT 2 /***************************************************************************** * Prototype : nsfw_mgr_recv_msg_socket @@ -784,212 +857,289 @@ nsfw_mgr_send_msg_socket (u32 fd, nsfw_mgr_msg * msg) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_recv_msg_socket (u32 fd, nsfw_mgr_msg * msg, - nsfw_mgr_msg ** large_msg) +u8 nsfw_mgr_recv_msg_socket(u32 fd, nsfw_mgr_msg * msg, + nsfw_mgr_msg ** large_msg) { - i32 recv_len = 0; - i32 off_set = 0; - u32 msg_len = 0; - i32 max_count = 0; - if (NULL == msg) + i32 recv_len = 0; + i32 off_set = 0; + u32 msg_len = 0; + i32 max_count = 0; + if (NULL == msg) { - return FALSE; + return FALSE; } - u8 from_flag = msg->from_mem; - msg_len = msg->msg_len; - do + u8 from_flag = msg->from_mem; + msg_len = msg->msg_len; + do { - off_set += recv_len; - recv_len = - nsfw_base_recv (fd, (char *) msg + off_set, msg_len - off_set, 0); - if (recv_len <= 0) + off_set += recv_len; + recv_len = + nsfw_base_recv(fd, (char *) msg + off_set, msg_len - off_set, 0); + if (recv_len <= 0) { - if ((EINTR == errno || EAGAIN == errno) - && (max_count < MAX_RECV_COUNT)) + if ((EINTR == errno || EAGAIN == errno) + && (max_count < MAX_RECV_COUNT)) { - recv_len = 0; - max_count++; - continue; + recv_len = 0; + max_count++; + continue; } - NSFW_LOGERR - ("recv error]mgr_fd=%u,recv_len=%d,off_set=%d,errno=%d," - MSGINFO, fd, recv_len, off_set, errno, PRTMSG (msg)); - msg->from_mem = from_flag; - return FALSE; + NSFW_LOGERR("recv err]mgr_fd=%u,recv_len=%d,off_set=%d,errno=%d," + MSGINFO, fd, recv_len, off_set, errno, PRTMSG(msg)); + msg->from_mem = from_flag; + return FALSE; } } - while (recv_len + off_set < (i32) msg_len); + while (recv_len + off_set < (i32) msg_len); - msg->from_mem = from_flag; + msg->from_mem = from_flag; - g_mgr_stat.msg_recv[msg->msg_type]++; + g_mgr_stat.msg_recv[msg->msg_type]++; - if (msg->msg_len <= msg_len) + if (msg->msg_len <= msg_len) { - NSFW_LOGDBG ("recv mgr_msg suc]mgr_fd=%u," MSGINFO, fd, PRTMSG (msg)); - return TRUE; + NSFW_LOGDBG("recv mgr_msg suc]mgr_fd=%u," MSGINFO, fd, PRTMSG(msg)); + return TRUE; } - if (large_msg == NULL) + if (large_msg == NULL) { - return TRUE; + return TRUE; } - nsfw_mgr_msg *l_msg = - nsfw_mgr_msg_alloc (msg->msg_type, msg->dst_proc_type); - if (NULL == l_msg) + nsfw_mgr_msg *l_msg = + nsfw_mgr_msg_alloc(msg->msg_type, msg->dst_proc_type); + if (NULL == l_msg) { - return TRUE; + return TRUE; } - if (l_msg->msg_len <= msg_len) + if (l_msg->msg_len <= msg_len) { - NSFW_LOGWAR ("alloc new msg error!]len=%u,org_len=%u,type=%u", - l_msg->msg_len, msg->msg_len, msg->msg_type); - nsfw_mgr_msg_free (l_msg); - return TRUE; + NSFW_LOGWAR("alloc new msg err]len=%u,org_len=%u,type=%u", + l_msg->msg_len, msg->msg_len, msg->msg_type); + nsfw_mgr_msg_free(l_msg); + return TRUE; } - max_count = 0; - (void) nsfw_set_sock_block (fd, FALSE); - from_flag = l_msg->from_mem; - u32 l_msg_len = l_msg->msg_len; - do + max_count = 0; + (void) nsfw_set_sock_block(fd, FALSE); + from_flag = l_msg->from_mem; + u32 l_msg_len = l_msg->msg_len; + do { - off_set += recv_len; - recv_len = - nsfw_base_recv (fd, (char *) l_msg + off_set, l_msg_len - off_set, 0); - if (recv_len <= 0) + off_set += recv_len; + recv_len = + nsfw_base_recv(fd, (char *) l_msg + off_set, l_msg_len - off_set, + 0); + if (recv_len <= 0) { - if ((EINTR == errno || EAGAIN == errno) - && (max_count < MAX_RECV_COUNT)) + if ((EINTR == errno || EAGAIN == errno) + && (max_count < MAX_RECV_COUNT)) { - recv_len = 0; - max_count++; - continue; + recv_len = 0; + max_count++; + continue; } - NSFW_LOGERR - ("recv error]mgr_fd=%u,recv_len=%d,off_set=%d,errno=%d," - MSGINFO, fd, recv_len, off_set, errno, PRTMSG (msg)); - l_msg->from_mem = from_flag; - nsfw_mgr_msg_free (l_msg); - return FALSE; + NSFW_LOGERR("recv err]mgr_fd=%u,recv_len=%d,off_set=%d,errno=%d," + MSGINFO, fd, recv_len, off_set, errno, PRTMSG(msg)); + l_msg->from_mem = from_flag; + nsfw_mgr_msg_free(l_msg); + return FALSE; } } - while (recv_len + off_set < (i32) l_msg_len); - (void) nsfw_set_sock_block (fd, TRUE); - int retVal = MEMCPY_S (l_msg, msg_len, msg, msg_len); - if (EOK != retVal) + while (recv_len + off_set < (i32) l_msg_len); + (void) nsfw_set_sock_block(fd, TRUE); + int retVal = memcpy_s(l_msg, msg_len, msg, msg_len); + if (EOK != retVal) { - NSFW_LOGERR ("MEMCPY_S failed] ret=%d", retVal); - l_msg->from_mem = from_flag; - nsfw_mgr_msg_free (l_msg); - return TRUE; + NSFW_LOGERR("memcpy_s fail]ret=%d", retVal); + l_msg->from_mem = from_flag; + nsfw_mgr_msg_free(l_msg); + return TRUE; } - l_msg->from_mem = from_flag; - l_msg->msg_len = l_msg_len; + l_msg->from_mem = from_flag; + l_msg->msg_len = l_msg_len; - *large_msg = l_msg; - NSFW_LOGDBG ("recv large mgr_msg suc]mgr_fd=%u," MSGINFO, fd, - PRTMSG (l_msg)); - return TRUE; + *large_msg = l_msg; + NSFW_LOGDBG("recv large mgr_msg suc]mgr_fd=%u," MSGINFO, fd, + PRTMSG(l_msg)); + return TRUE; } /***************************************************************************** -* Prototype : nsfw_mgr_send_req_wait_rsp -* Description : send request message and block waiting for it's response - within MGR_COM_RECV_TIMEOUT +* Prototype : nsfw_mgr_get_socket +* Description : try best to return an available dst_socket * Input : nsfw_mgr_msg* req_msg * nsfw_mgr_msg* rsp_msg + i32 dst_socket (origin fd, <=0 to lookup or create, >0 to renew) * Output : None -* Return Value : u8 +* Return Value : i32 * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_send_req_wait_rsp (nsfw_mgr_msg * req_msg, nsfw_mgr_msg * rsp_msg) +i32 nsfw_mgr_get_socket(nsfw_mgr_msg * req_msg, nsfw_mgr_msg * rsp_msg, + i32 dst_socket) { - if (NULL == req_msg) + if (dst_socket <= 0) /* origin fd <= 0, first lookup the eastablished, if none, create a new one */ { - NSFW_LOGERR ("req msg nul!"); - return FALSE; + dst_socket = + nsfw_mgr_get_dst_socket(req_msg->dst_proc_type, req_msg->dst_pid); + if (dst_socket <= 0) + { + dst_socket = + nsfw_mgr_get_new_socket(req_msg->dst_proc_type, + req_msg->dst_pid); + if (dst_socket <= 0) + { + NSFW_LOGERR("send msg get dst_socket_err]" MSGINFO, + PRTMSG(req_msg)); + return -1; + } + } } - - i32 dst_socket = - nsfw_mgr_get_dst_socket (req_msg->dst_proc_type, req_msg->dst_pid); - if (dst_socket <= 0) + else /* origin fd is broken probably because the other end just upgraded, delete the old one and re-create */ { - dst_socket = - nsfw_mgr_get_new_socket (req_msg->dst_proc_type, req_msg->dst_pid); - if (dst_socket <= 0) + (void) nsfw_mgr_del_socket(dst_socket); + (void) nsfw_mgr_unreg_sock_fun(dst_socket); + (void) nsfw_base_close(dst_socket); + UNLOCK_MGR_FD(dst_socket) + dst_socket = + nsfw_mgr_get_new_socket(req_msg->dst_proc_type, req_msg->dst_pid); + if (dst_socket <= 0) { - NSFW_LOGERR ("send msg get dst_socket_error]" MSGINFO, - PRTMSG (req_msg)); - return FALSE; + NSFW_LOGERR("send msg get dst_socket_err]" MSGINFO, + PRTMSG(req_msg)); + return -1; } } + return dst_socket; +} - if ((NULL == rsp_msg) && (req_msg->msg_len == sizeof (nsfw_mgr_msg))) +/***************************************************************************** +* Prototype : nsfw_mgr_do_send_and_recv +* Description : do send and recv work +* Input : nsfw_mgr_msg* req_msg +* nsfw_mgr_msg* rsp_msg +* Output : None +* Return Value : u8 +* Calls : +* Called By : +*****************************************************************************/ +u8 nsfw_mgr_do_send_and_recv(nsfw_mgr_msg * req_msg, nsfw_mgr_msg * rsp_msg, + i32 dst_socket, i32 retry_times_left) +{ + LOCK_MGR_FD(dst_socket) + if ((NULL == rsp_msg) && (req_msg->msg_len == sizeof(nsfw_mgr_msg))) { - LOCK_MGR_FD (dst_socket) - if (FALSE == nsfw_mgr_send_msg_socket (dst_socket, req_msg)) + if (FALSE == nsfw_mgr_send_msg_socket(dst_socket, req_msg)) { - NSFW_LOGERR ("send msg error]" MSGINFO, PRTMSG (req_msg)); - g_mgr_stat.msg_send_failed++; - UNLOCK_MGR_FD (dst_socket) return FALSE; + g_mgr_stat.msg_send_failed++; + goto ERROR_RETURN; } - UNLOCK_MGR_FD (dst_socket) return TRUE; + UNLOCK_MGR_FD(dst_socket) return TRUE; } - LOCK_MGR_FD (dst_socket); - (void) nsfw_mgr_unreg_sock_fun (dst_socket); - if (FALSE == nsfw_mgr_send_msg_socket (dst_socket, req_msg)) + (void) nsfw_mgr_unreg_sock_fun(dst_socket); + if (FALSE == nsfw_mgr_send_msg_socket(dst_socket, req_msg)) { - NSFW_LOGERR ("send msg error]" MSGINFO, PRTMSG (req_msg)); - g_mgr_stat.msg_send_failed++; - (void) nsfw_mgr_reg_sock_fun (dst_socket, nsfw_mgr_new_msg); - UNLOCK_MGR_FD (dst_socket); - return FALSE; + g_mgr_stat.msg_send_failed++; + goto ERROR_RETURN; } - if (NULL == rsp_msg) + if (NULL == rsp_msg) { - (void) nsfw_mgr_reg_sock_fun (dst_socket, nsfw_mgr_new_msg); - UNLOCK_MGR_FD (dst_socket) return TRUE; + (void) nsfw_mgr_reg_sock_fun(dst_socket, nsfw_mgr_new_msg); + UNLOCK_MGR_FD(dst_socket) return TRUE; } - u16 i; - for (i = 0; i < MGR_COM_MAX_DROP_MSG; i++) + u16 i; + for (i = 0; i < MGR_COM_MAX_DROP_MSG; i++) { - if (FALSE == nsfw_mgr_recv_msg_socket (dst_socket, rsp_msg, NULL)) + if (FALSE == nsfw_mgr_recv_msg_socket(dst_socket, rsp_msg, NULL)) { - NSFW_LOGERR ("recv msg error]" MSGINFO, PRTMSG (req_msg)); - (void) nsfw_mgr_reg_sock_fun (dst_socket, nsfw_mgr_new_msg); - UNLOCK_MGR_FD (dst_socket) return FALSE; + goto ERROR_RETURN; } - if ((rsp_msg->seq == req_msg->seq) - && (rsp_msg->msg_type == req_msg->msg_type + MGR_MSG_RSP_BASE)) + if ((rsp_msg->seq == req_msg->seq) + && (rsp_msg->msg_type == req_msg->msg_type + MGR_MSG_RSP_BASE)) { - break; + break; } - NSFW_LOGINF ("recv msg forward]" MSGINFO, PRTMSG (rsp_msg)); - rsp_msg->fw_flag = TRUE; - (void) nsfw_mgr_send_msg (rsp_msg); + NSFW_LOGDBG("recv msg forward]" MSGINFO, PRTMSG(rsp_msg)); + rsp_msg->fw_flag = TRUE; + (void) nsfw_mgr_send_msg(rsp_msg); + } + + (void) nsfw_mgr_reg_sock_fun(dst_socket, nsfw_mgr_new_msg); + if (0 == req_msg->dst_pid) + { + (void) nsfw_mgr_new_socket(dst_socket, rsp_msg->src_proc_type, + rsp_msg->src_pid); + } + UNLOCK_MGR_FD(dst_socket) return TRUE; + + ERROR_RETURN: + if (0 >= retry_times_left) + { + NSFW_LOGERR("send msg err]" MSGINFO, PRTMSG(req_msg)); + (void) nsfw_mgr_reg_sock_fun(dst_socket, nsfw_mgr_new_msg); + UNLOCK_MGR_FD(dst_socket); + } + else + { + NSFW_LOGWAR + ("origin mgr socket=%d is broken, try re-create, %d times left", + dst_socket, retry_times_left); + /* NOTE: no need to re-register sock_fun, will UNLOCK in next call of nsfw_mgr_get_socket */ + } + return FALSE; + +} + +/***************************************************************************** +* Prototype : nsfw_mgr_send_req_wait_rsp +* Description : send request message and block waiting for it's response + within MGR_COM_RECV_TIMEOUT +* Input : nsfw_mgr_msg* req_msg +* nsfw_mgr_msg* rsp_msg +* Output : None +* Return Value : u8 +* Calls : +* Called By : +*****************************************************************************/ +u8 nsfw_mgr_send_req_wait_rsp(nsfw_mgr_msg * req_msg, nsfw_mgr_msg * rsp_msg) +{ + if (NULL == req_msg) + { + NSFW_LOGERR("req msg nul"); + return FALSE; } - (void) nsfw_mgr_reg_sock_fun (dst_socket, nsfw_mgr_new_msg); - if (0 == req_msg->dst_pid) + i32 dst_socket = 0; + i32 retry_times_left = 1; + while (retry_times_left >= 0) { - (void) nsfw_mgr_new_socket (dst_socket, rsp_msg->src_proc_type, - rsp_msg->src_pid); + dst_socket = nsfw_mgr_get_socket(req_msg, rsp_msg, dst_socket); + if (dst_socket <= 0) + { + NSFW_LOGERR("send msg get dst_socket_err]" MSGINFO, + PRTMSG(req_msg)); + return FALSE; + } + u8 ret = nsfw_mgr_do_send_and_recv(req_msg, rsp_msg, dst_socket, + retry_times_left); + if (ret == TRUE) + { + return TRUE; + } + --retry_times_left; } - UNLOCK_MGR_FD (dst_socket) return TRUE; + return FALSE; } /***************************************************************************** @@ -1001,10 +1151,9 @@ nsfw_mgr_send_req_wait_rsp (nsfw_mgr_msg * req_msg, nsfw_mgr_msg * rsp_msg) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_send_msg (nsfw_mgr_msg * msg) +u8 nsfw_mgr_send_msg(nsfw_mgr_msg * msg) { - return nsfw_mgr_send_req_wait_rsp (msg, NULL); + return nsfw_mgr_send_req_wait_rsp(msg, NULL); } /***************************************************************************** @@ -1016,79 +1165,77 @@ nsfw_mgr_send_msg (nsfw_mgr_msg * msg) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_msg_in (i32 fd) +u8 nsfw_mgr_msg_in(i32 fd) { - u32 i = 0; - u8 ret = FALSE; - u8 msg_match = FALSE; - nsfw_mgr_msg *msg = nsfw_mgr_null_rspmsg_alloc (); - nsfw_mgr_msg *large_msg = NULL; + u32 i = 0; + u8 ret = FALSE; + u8 msg_match = FALSE; + nsfw_mgr_msg *msg = nsfw_mgr_null_rspmsg_alloc(); + nsfw_mgr_msg *large_msg = NULL; - LOCK_MGR_FD (fd) ret = nsfw_mgr_recv_msg_socket (fd, msg, &large_msg); - UNLOCK_MGR_FD (fd) if (large_msg != NULL) + LOCK_MGR_FD(fd) ret = nsfw_mgr_recv_msg_socket(fd, msg, &large_msg); + UNLOCK_MGR_FD(fd) if (large_msg != NULL) { - nsfw_mgr_msg_free (msg); - msg = large_msg; + nsfw_mgr_msg_free(msg); + msg = large_msg; } - if (FALSE == ret) + if (FALSE == ret) { - nsfw_mgr_msg_free (msg); - return FALSE; + nsfw_mgr_msg_free(msg); + return FALSE; } - - if (msg->fw_flag != TRUE) + if (msg->fw_flag != TRUE) { - (void) nsfw_mgr_new_socket (fd, msg->src_proc_type, msg->src_pid); + (void) nsfw_mgr_new_socket(fd, msg->src_proc_type, msg->src_pid); } - if (msg->msg_type < MGR_MSG_MAX) + if (msg->msg_type < MGR_MSG_MAX) { - for (i = 0; i < NSFW_MGRCOM_MAX_PROC_FUN; i++) + for (i = 0; i < NSFW_MGRCOM_MAX_PROC_FUN; i++) { - if (NULL == g_mgr_fun[msg->msg_type][i]) + if (NULL == g_mgr_fun[msg->msg_type][i]) { - break; + break; } - (void) g_mgr_fun[msg->msg_type][i] (msg); - msg_match = TRUE; + (void) g_mgr_fun[msg->msg_type][i] (msg); + msg_match = TRUE; } } - if (FALSE != msg_match) + if (FALSE != msg_match) { - nsfw_mgr_msg_free (msg); - return TRUE; + nsfw_mgr_msg_free(msg); + return TRUE; } - if (msg->msg_type < MGR_MSG_RSP_BASE) + if (msg->msg_type < MGR_MSG_RSP_BASE) { - NSFW_LOGERR ("msg match failed! auto rsp]" MSGINFO, PRTMSG (msg)); - nsfw_mgr_msg *rsp_msg = nsfw_mgr_rsp_msg_alloc (msg); - if (NULL != rsp_msg) + NSFW_LOGERR("msg match failed! auto rsp]" MSGINFO, PRTMSG(msg)); + nsfw_mgr_msg *rsp_msg = nsfw_mgr_rsp_msg_alloc(msg); + if (NULL != rsp_msg) { - rsp_msg->resp_code = NSFW_MGR_MSG_TYPE_ERROR; - (void) nsfw_mgr_send_msg (rsp_msg); - nsfw_mgr_msg_free (rsp_msg); + rsp_msg->resp_code = NSFW_MGR_MSG_TYPE_ERROR; + (void) nsfw_mgr_send_msg(rsp_msg); + nsfw_mgr_msg_free(rsp_msg); } } - NSFW_LOGERR ("drop msg]" MSGINFO, PRTMSG (msg)); - /* fix "Out-of-bounds write" type codex issue */ - if (msg->msg_type < MGR_MSG_MAX) + NSFW_LOGERR("drop msg]" MSGINFO, PRTMSG(msg)); + /* fix "Out-of-bounds write" */ + if (msg->msg_type < MGR_MSG_MAX) { - g_mgr_stat.recv_drop[msg->msg_type]++; + g_mgr_stat.recv_drop[msg->msg_type]++; } - nsfw_mgr_msg_free (msg); - return FALSE; + nsfw_mgr_msg_free(msg); + return FALSE; } /***************************************************************************** * Prototype : nsfw_mgr_new_msg -* Description : when new mgr message receive from socket, this function +* Description : when new mgr message recive from socket, this funciton will call back * Input : i32 epfd * i32 fd @@ -1098,22 +1245,19 @@ nsfw_mgr_msg_in (i32 fd) * Calls : * Called By : *****************************************************************************/ -int -nsfw_mgr_new_msg (i32 epfd, i32 fd, u32 events) +/*try to get event form all modules */ +int nsfw_mgr_new_msg(i32 epfd, i32 fd, u32 events) { - lint_lock_1 (); - if ((events & EPOLLERR) || (events & EPOLLHUP) || (!(events & EPOLLIN))) + if ((events & EPOLLERR) || (events & EPOLLHUP) || (!(events & EPOLLIN))) { - (void) nsfw_mgr_del_socket (fd); - (void) nsfw_mgr_unreg_sock_fun (fd); - (void) nsfw_base_close (fd); - lint_unlock_1 (); - return TRUE; + (void) nsfw_mgr_del_socket(fd); + (void) nsfw_mgr_unreg_sock_fun(fd); + (void) nsfw_base_close(fd); + return TRUE; } - (void) nsfw_mgr_msg_in (fd); - lint_unlock_1 (); - return TRUE; + (void) nsfw_mgr_msg_in(fd); + return TRUE; } /***************************************************************************** @@ -1126,11 +1270,11 @@ nsfw_mgr_new_msg (i32 epfd, i32 fd, u32 events) * Calls : * Called By : *****************************************************************************/ -int -nsfw_mgr_com_rereg_fun (u32 timer_type, void *data) +int nsfw_mgr_com_rereg_fun(u32 timer_type, void *data) { - (void) nsfw_mgr_reg_sock_fun (timer_type, (nsfw_mgr_sock_fun) data); - return TRUE; + + (void) nsfw_mgr_reg_sock_fun(timer_type, (nsfw_mgr_sock_fun) data); + return TRUE; } /***************************************************************************** @@ -1144,18 +1288,18 @@ nsfw_mgr_com_rereg_fun (u32 timer_type, void *data) * Calls : * Called By : *****************************************************************************/ -int -nsfw_mgr_com_socket_error (i32 fd, nsfw_mgr_sock_fun fun, i32 timer) +int nsfw_mgr_com_socket_error(i32 fd, nsfw_mgr_sock_fun fun, i32 timer) { - struct timespec time_left = { timer, 0 }; - nsfw_mgr_unreg_sock_fun (fd); - nsfw_timer_reg_timer (fd, (void *) fun, nsfw_mgr_com_rereg_fun, time_left); - return TRUE; + + struct timespec time_left = { timer, 0 }; + nsfw_mgr_unreg_sock_fun(fd); + nsfw_timer_reg_timer(fd, (void *) fun, nsfw_mgr_com_rereg_fun, time_left); + return TRUE; } /***************************************************************************** * Prototype : nsfw_mgr_new_connection -* Description : when new mgr connection in, this function will call back +* Description : when new mgr connection in, this funciton will call back * Input : i32 epfd * i32 fd * u32 events @@ -1164,81 +1308,79 @@ nsfw_mgr_com_socket_error (i32 fd, nsfw_mgr_sock_fun fun, i32 timer) * Calls : * Called By : *****************************************************************************/ -int -nsfw_mgr_new_connection (i32 epfd, i32 fd, u32 events) +int nsfw_mgr_new_connection(i32 epfd, i32 fd, u32 events) { - if ((events & EPOLLERR) || (events & EPOLLHUP) || (!(events & EPOLLIN))) - { - (void) nsfw_base_close (fd); - NSFW_LOGWAR ("listen disconnect!]epfd=%d,listen=%d,event=0x%x", epfd, - fd, events); - (void) nsfw_mgr_unreg_sock_fun (fd); - i32 listen_fd = nsfw_mgr_get_listen_socket (); - if (listen_fd < 0) + if ((events & EPOLLERR) || (events & EPOLLHUP) || (!(events & EPOLLIN))) + { + (void) nsfw_base_close(fd); + NSFW_LOGWAR("listen disconnect]epfd=%d,listen=%d,event=0x%x", epfd, + fd, events); + (void) nsfw_mgr_unreg_sock_fun(fd); + i32 listen_fd = nsfw_mgr_get_listen_socket(); + if (listen_fd < 0) { - NSFW_LOGERR - ("get listen_fd failed!]epfd=%d,listen_fd=%d,event=0x%x", epfd, - fd, events); - return FALSE; + NSFW_LOGERR("get listen_fd fail]epfd=%d,listen_fd=%d,event=0x%x", + epfd, fd, events); + return FALSE; } - (void) nsfw_mgr_reg_sock_fun (listen_fd, nsfw_mgr_new_connection); - return TRUE; + (void) nsfw_mgr_reg_sock_fun(listen_fd, nsfw_mgr_new_connection); + return TRUE; } - struct sockaddr in_addr; - socklen_t in_len; - int infd; - in_len = sizeof in_addr; + int infd; + struct sockaddr addr; + socklen_t len = sizeof(addr); + int size, size_len; + u8 accept_flag = FALSE; - int size, size_len; - u8 accept_flag = FALSE; - while (1) + while (1) { - infd = nsfw_base_accept (fd, &in_addr, &in_len); - if (infd == -1) + infd = nsfw_base_accept(fd, &addr, &len); + if (infd == -1) { - if (FALSE == accept_flag) + if (FALSE == accept_flag) { - nsfw_mgr_com_socket_error (fd, nsfw_mgr_new_connection, 1); + nsfw_mgr_com_socket_error(fd, nsfw_mgr_new_connection, 1); } - break; + break; } - if (-1 == nsfw_set_close_on_exec (infd)) + /* close on exec */ + if (-1 == nsfw_set_close_on_exec(infd)) { - (void) nsfw_base_close (infd); - NSFW_LOGERR ("set exec err]fd=%d, errno=%d", infd, errno); - break; + (void) nsfw_base_close(infd); + NSFW_LOGERR("set exec err]fd=%d, errno=%d", infd, errno); + break; } - size = MAX_RECV_BUF_DEF; - size_len = sizeof (size); - if (0 > - nsfw_base_setsockopt (infd, SOL_SOCKET, SO_RCVBUF, (void *) &size, - (socklen_t) size_len)) + size = MAX_RECV_BUF_DEF; + size_len = sizeof(size); + if (0 > + nsfw_base_setsockopt(infd, SOL_SOCKET, SO_RCVBUF, (void *) &size, + (socklen_t) size_len)) { - NSFW_LOGERR ("set socket opt err!]error=%d", errno); + NSFW_LOGERR("set socket opt err]error=%d", errno); } - if (0 > - nsfw_base_setsockopt (infd, SOL_SOCKET, SO_SNDBUF, (void *) &size, - (socklen_t) size_len)) + if (0 > + nsfw_base_setsockopt(infd, SOL_SOCKET, SO_SNDBUF, (void *) &size, + (socklen_t) size_len)) { - NSFW_LOGERR ("set socket opt err!]error=%d", errno); + NSFW_LOGERR("set socket opt err]error=%d", errno); } - (void) nsfw_mgr_reg_sock_fun (infd, nsfw_mgr_new_msg); - NSFW_LOGDBG ("accept_flag new fd]new_mgr_fd=%d", infd); - accept_flag = TRUE; + (void) nsfw_mgr_reg_sock_fun(infd, nsfw_mgr_new_msg); + NSFW_LOGDBG("accept_flag new fd]new_mgr_fd=%d", infd); + accept_flag = TRUE; } - return TRUE; + return TRUE; } /***************************************************************************** * Prototype : nsfw_set_sock_block -* Description : set fd block or not for epoll thread +* Description : set fd blok or not for epoll thread * Input : i32 sock * u8 flag * Output : None @@ -1246,45 +1388,45 @@ nsfw_mgr_new_connection (i32 epfd, i32 fd, u32 events) * Calls : * Called By : *****************************************************************************/ -i32 -nsfw_set_sock_block (i32 sock, u8 flag) +i32 nsfw_set_sock_block(i32 sock, u8 flag) { - i32 flags; - flags = nsfw_base_fcntl (sock, F_GETFL, 0); - if (flags < 0) + i32 flags; + flags = nsfw_base_fcntl(sock, F_GETFL, 0); + if (flags < 0) { - NSFW_LOGERR ("fcntl err]new_mgr_fd=%d,errno=%d", sock, errno); - return -1; + NSFW_LOGERR("fcntl err]new_mgr_fd=%d,errno=%d", sock, errno); + return -1; } - if (TRUE == flag) + if (TRUE == flag) { - flags = flags | O_NONBLOCK; + flags = flags | O_NONBLOCK; } - else + else { - flags = flags & (~O_NONBLOCK); - struct timeval tv; - tv.tv_sec = MGR_COM_RECV_TIMEOUT; - tv.tv_usec = 0; - if (nsfw_base_setsockopt - (sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof tv)) + flags = flags & (~O_NONBLOCK); + struct timeval tv; + tv.tv_sec = MGR_COM_RECV_TIMEOUT; + tv.tv_usec = 0; + if (nsfw_base_setsockopt + (sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof tv)) { - NSFW_LOGERR ("setsockopt socket err]mgr_fd=%d", sock); - return -1; + NSFW_LOGERR("setsockopt socket err]mgr_fd=%d", sock); + return -1; } } - if (nsfw_base_fcntl (sock, F_SETFL, flags) < 0) + if (nsfw_base_fcntl(sock, F_SETFL, flags) < 0) { - NSFW_LOGERR ("fcntl err]new_mgr_fd=%d,errno=%d,flags=%d", sock, errno, - flags); - return -1; + NSFW_LOGERR("fcntl err]new_mgr_fd=%d,errno=%d,flags=%d", sock, errno, + flags); + return -1; } - return 0; + return 0; } +/* close on exec */ /***************************************************************************** * Prototype : nsfw_set_close_on_exec * Description : close on exec set @@ -1294,26 +1436,25 @@ nsfw_set_sock_block (i32 sock, u8 flag) * Calls : * Called By : *****************************************************************************/ -i32 -nsfw_set_close_on_exec (i32 sock) +i32 nsfw_set_close_on_exec(i32 sock) { - i32 flags; - flags = nsfw_base_fcntl (sock, F_GETFD, 0); - if (flags < 0) + i32 flags; + flags = nsfw_base_fcntl(sock, F_GETFD, 0); + if (flags < 0) { - NSFW_LOGERR ("fcntl err]fd=%d,errno=%d", sock, errno); - return -1; + NSFW_LOGERR("fcntl err]fd=%d,errno=%d", sock, errno); + return -1; } - flags |= FD_CLOEXEC; + flags |= FD_CLOEXEC; - if (nsfw_base_fcntl (sock, F_SETFD, flags) < 0) + if (nsfw_base_fcntl(sock, F_SETFD, flags) < 0) { - NSFW_LOGERR ("fcntl err]fd=%d,errno=%d,flags=%d", sock, errno, flags); - return -1; + NSFW_LOGERR("fcntl err]fd=%d,errno=%d,flags=%d", sock, errno, flags); + return -1; } - return 0; + return 0; } /***************************************************************************** @@ -1325,29 +1466,35 @@ nsfw_set_close_on_exec (i32 sock) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_add_sock_to_ep (i32 fd) +u8 nsfw_add_sock_to_ep(i32 fd) { - struct epoll_event event; - event.data.fd = fd; - event.events = EPOLLIN; - if (g_ep_proc.epfd == 0) + struct epoll_event event; + event.data.fd = fd; + event.events = EPOLLIN; + if (g_ep_proc.epfd == 0) { - return TRUE; + return TRUE; } - (void) nsfw_set_sock_block (fd, TRUE); + (void) nsfw_set_sock_block(fd, TRUE); - if (0 > nsfw_base_epoll_ctl (g_ep_proc.epfd, EPOLL_CTL_ADD, fd, &event)) + if (0 > nsfw_base_epoll_ctl(g_ep_proc.epfd, EPOLL_CTL_ADD, fd, &event)) { - NSFW_LOGINF - ("add sock to ep thread failed]mgr_fd=%d,errno=%d,epfd=%d", fd, - errno, g_ep_proc.epfd); - return FALSE; + /*It is possible that multi-threads operate EPOLL_ADD at the same time, + *we allow this case, and return TRUE for it when errno==EEXIST*/ + if (EEXIST == errno) + { + NSFW_LOGDBG + ("add sock to ep thread but exist already, return TRUE directly]mgr_fd=%d,epfd=%d", + fd, g_ep_proc.epfd) return TRUE; + } + NSFW_LOGINF("add sock to ep thread fail]mgr_fd=%d,errno=%d,epfd=%d", + fd, errno, g_ep_proc.epfd); + return FALSE; } - NSFW_LOGDBG ("add sock to ep thread]mgr_fd=%d,epfd=%d", fd, - g_ep_proc.epfd) return TRUE; + NSFW_LOGDBG("add sock to ep thread]mgr_fd=%d,epfd=%d", fd, + g_ep_proc.epfd) return TRUE; } /***************************************************************************** @@ -1359,29 +1506,28 @@ nsfw_add_sock_to_ep (i32 fd) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_rmv_sock_from_ep (i32 fd) +u8 nsfw_rmv_sock_from_ep(i32 fd) { - struct epoll_event event; - event.data.fd = fd; - event.events = EPOLLIN; - if (g_ep_proc.epfd == 0) + struct epoll_event event; + event.data.fd = fd; + event.events = EPOLLIN; + if (g_ep_proc.epfd == 0) { - return TRUE; + //NSFW_LOGINF("rmv sock to ep thread before start]mgr_fd=%d",fd); + return TRUE; } - (void) nsfw_set_sock_block (fd, FALSE); + (void) nsfw_set_sock_block(fd, FALSE); - if (0 > nsfw_base_epoll_ctl (g_ep_proc.epfd, EPOLL_CTL_DEL, fd, &event)) + if (0 > nsfw_base_epoll_ctl(g_ep_proc.epfd, EPOLL_CTL_DEL, fd, &event)) { - NSFW_LOGINF - ("rmv sock to ep thread failed] mgr_fd=%d,errno=%d,epfd=%d", fd, - errno, g_ep_proc.epfd); - return FALSE; + NSFW_LOGINF("rmv sock to ep thread fail]mgr_fd=%d,errno=%d,epfd=%d", + fd, errno, g_ep_proc.epfd); + return FALSE; } - NSFW_LOGDBG ("rmv sock to ep thread] mgr_fd=%d,epfd=%d", fd, - g_ep_proc.epfd) return TRUE; + NSFW_LOGDBG("rmv sock to ep thread]mgr_fd=%d,epfd=%d", fd, + g_ep_proc.epfd) return TRUE; } /***************************************************************************** @@ -1395,33 +1541,28 @@ nsfw_rmv_sock_from_ep (i32 fd) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_reg_sock_fun (i32 fd, nsfw_mgr_sock_fun fun) +/*try to get event form all modules */ +u8 nsfw_mgr_reg_sock_fun(i32 fd, nsfw_mgr_sock_fun fun) { - lint_lock_1 (); - if ((fd >= (i32) NSFW_MGR_FD_MAX) || (fd < 0) || NULL == fun) + if ((fd >= (i32) NSFW_MGR_FD_MAX) || (fd < 0) || NULL == fun) { - NSFW_LOGINF ("reg sock fun error!] mgr_fd=%d,fun=%p", fd, fun); - lint_unlock_1 (); - return FALSE; + NSFW_LOGINF("reg sock fun error]mgr_fd=%d,fun=%p", fd, fun); + return FALSE; } - if ((g_ep_proc.ep_fun) && (NULL == g_ep_proc.ep_fun[fd])) + if ((g_ep_proc.ep_fun) && (NULL == g_ep_proc.ep_fun[fd])) { - g_ep_proc.ep_fun[fd] = fun; - if (FALSE == nsfw_add_sock_to_ep (fd)) + g_ep_proc.ep_fun[fd] = fun; + if (FALSE == nsfw_add_sock_to_ep(fd)) { - g_ep_proc.ep_fun[fd] = NULL; - lint_unlock_1 (); - return FALSE; + g_ep_proc.ep_fun[fd] = NULL; + return FALSE; } - NSFW_LOGDBG ("reg sock fun] mgr_fd=%d,fun=%p", fd, fun); - lint_unlock_1 (); - return TRUE; + NSFW_LOGDBG("reg sock fun]mgr_fd=%d,fun=%p", fd, fun); + return TRUE; } - lint_unlock_1 (); - return FALSE; + return FALSE; } /***************************************************************************** @@ -1433,28 +1574,24 @@ nsfw_mgr_reg_sock_fun (i32 fd, nsfw_mgr_sock_fun fun) * Calls : * Called By : *****************************************************************************/ -void -nsfw_mgr_unreg_sock_fun (i32 fd) +/*try to get event form all modules */ +void nsfw_mgr_unreg_sock_fun(i32 fd) { - lint_lock_1 (); - if (fd >= (i32) NSFW_MGR_FD_MAX) + if (fd >= (i32) NSFW_MGR_FD_MAX) { - NSFW_LOGINF ("unreg sock fun failed!] mgr_fd=%d", fd); - lint_unlock_1 (); - return; + NSFW_LOGINF("unreg sock fun fail]mgr_fd=%d", fd); + return; } - if ((g_ep_proc.ep_fun) && (NULL != g_ep_proc.ep_fun[fd])) + if ((g_ep_proc.ep_fun) && (NULL != g_ep_proc.ep_fun[fd])) { - g_ep_proc.ep_fun[fd] = NULL; - (void) nsfw_rmv_sock_from_ep (fd); - NSFW_LOGDBG ("unreg sock fun] mgr_fd=%d", fd); - lint_unlock_1 (); - return; + g_ep_proc.ep_fun[fd] = NULL; + (void) nsfw_rmv_sock_from_ep(fd); + NSFW_LOGDBG("unreg sock fun]mgr_fd=%d", fd); + return; } - lint_unlock_1 (); - return; + return; } /***************************************************************************** @@ -1468,22 +1605,21 @@ nsfw_mgr_unreg_sock_fun (i32 fd) * Calls : * Called By : *****************************************************************************/ -NSTACK_STATIC inline u8 -nsfw_sock_fun_callback (i32 epfd, i32 fd, u32 events) +NSTACK_STATIC inline u8 nsfw_sock_fun_callback(i32 epfd, i32 fd, u32 events) { - if ((fd < (i32) NSFW_MGR_FD_MAX) - && (g_ep_proc.ep_fun) && (NULL != g_ep_proc.ep_fun[fd])) + if ((fd < (i32) NSFW_MGR_FD_MAX) + && (g_ep_proc.ep_fun) && (NULL != g_ep_proc.ep_fun[fd])) { - (void) g_ep_proc.ep_fun[fd] (epfd, fd, events); - return TRUE; + (void) g_ep_proc.ep_fun[fd] (epfd, fd, events); + return TRUE; } - return FALSE; + return FALSE; } /***************************************************************************** -* Prototype : nsfw_sock_add_to_ep -* Description : add all event process function has ben reg to the epoll +* Prototype : nsfw_add_prestored_sock_to_ep +* Description : add all the socks (whose process function has ben reg) to the epoll thread when thread start * Input : i32 epfd * Output : None @@ -1491,21 +1627,37 @@ nsfw_sock_fun_callback (i32 epfd, i32 fd, u32 events) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_sock_add_to_ep (i32 epfd) +u8 nsfw_add_prestored_sock_to_ep() { - u32 i; + u32 i; + u8 ret; + + if (NULL == g_ep_proc.ep_fun) + { + NSFW_LOGERR("g_ep_proc.ep_fun should not be NULL at this time"); + return FALSE; + } - for (i = 0; i < NSFW_MGR_FD_MAX; i++) + for (i = 0; i < NSFW_MGR_FD_MAX; i++) { - if ((g_ep_proc.ep_fun) && (NULL == g_ep_proc.ep_fun[i])) + if (NULL == g_ep_proc.ep_fun[i]) { - continue; + continue; + } + + /*add return value check */ + ret = nsfw_add_sock_to_ep(i); + if (FALSE == ret) + { + /*here, we add some fd(which belongs to other module and prestore to g_ep_proc) to ep . + must add success. if add fail, stack init should end up */ + NSFW_LOGERR("nsfw_add_sock_to_ep fail]epfd=%d,i=%u", + g_ep_proc.epfd, i); + return FALSE; } - (void) nsfw_add_sock_to_ep (i); } - return TRUE; + return TRUE; } /***************************************************************************** @@ -1517,19 +1669,18 @@ nsfw_sock_add_to_ep (i32 epfd) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_com_start () +u8 nsfw_mgr_com_start() { - i32 listen_fd = nsfw_mgr_get_listen_socket (); - if (listen_fd < 0) + i32 listern_fd = nsfw_mgr_get_listen_socket(); + if (listern_fd < 0) { - NSFW_LOGERR ("get listen_fd failed!"); - return FALSE; + NSFW_LOGERR("get listern_fd fail"); + return FALSE; } - NSFW_LOGINF ("start mgr_com module!] listen_fd=%d", listen_fd); - (void) nsfw_mgr_reg_sock_fun (listen_fd, nsfw_mgr_new_connection); - return TRUE; + NSFW_LOGINF("start mgr_com module]listern_fd=%d", listern_fd); + (void) nsfw_mgr_reg_sock_fun(listern_fd, nsfw_mgr_new_connection); + return TRUE; } /***************************************************************************** @@ -1541,24 +1692,28 @@ nsfw_mgr_com_start () * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_com_start_local (u8 proc_type) +u8 nsfw_mgr_com_start_local(u8 proc_type) { - int fd[2]; - if ((socketpair (AF_UNIX, SOCK_STREAM, 0, fd)) < 0) + int fd[2]; + if ((socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) < 0) { - NSFW_LOGERR ("create socket err] type=%u,errno=%d", proc_type, errno); - return FALSE; + NSFW_LOGERR("create socket err]type=%u,errno=%d", proc_type, errno); + return FALSE; } - (void) nsfw_mgr_new_socket (fd[0], proc_type, get_sys_pid ()); - (void) nsfw_mgr_new_socket (fd[1], proc_type, get_sys_pid ()); - (void) nsfw_mgr_reg_sock_fun (fd[0], nsfw_mgr_new_msg); - (void) nsfw_mgr_reg_sock_fun (fd[1], nsfw_mgr_new_msg); - NSFW_LOGINF ("create local socket] fd0=%d,fd1=%d", fd[0], fd[1]); - return TRUE; + (void) nsfw_mgr_new_socket(fd[0], proc_type, get_sys_pid()); + (void) nsfw_mgr_new_socket(fd[1], proc_type, get_sys_pid()); + (void) nsfw_mgr_reg_sock_fun(fd[0], nsfw_mgr_new_msg); + (void) nsfw_mgr_reg_sock_fun(fd[1], nsfw_mgr_new_msg); + if (proc_type != NSFW_PROC_CTRL) + { + NSFW_LOGINF("create local socket]fd0=%d,fd1=%d", fd[0], fd[1]); + } + return TRUE; } +/*try to get event form all modules */ + /***************************************************************************** * Prototype : nsfw_mgr_listen_thread * Description : epoll thread function @@ -1568,115 +1723,40 @@ nsfw_mgr_com_start_local (u8 proc_type) * Calls : * Called By : *****************************************************************************/ -void * -nsfw_mgr_listen_thread (void *arg) +void *nsfw_mgr_listen_thread(void *arg) { - i32 epfd = 0; - //i32 listen_socket = 0; - - lint_lock_1 (); #define MAXEVENTS 10 - epfd = nsfw_base_epoll_create (10); + struct epoll_event events[MAXEVENTS]; + + i32 epfd = g_ep_proc.epfd; - struct epoll_event events[MAXEVENTS]; - if (EOK != MEMSET_S (events, sizeof (events), 0, sizeof (events))) + /* Init log suppression for this thread */ + if (NULL == init_sup_table(LOG_SUP_TABLE_SIZE_FOR_MGR_COM_THREAD)) { - NSFW_LOGERR ("MEMSET_S failed!]epfd=%d", epfd); - lint_unlock_1 (); - return NULL; + NSFW_LOGWAR("log suppression init failed in thread: %s", + NSFW_MGRCOM_THREAD); } - g_ep_proc.epfd = epfd; - g_ep_proc.hbt_count = 0; - (void) nsfw_sock_add_to_ep (epfd); - lint_unlock_1 (); - while (1) + while (1) { - lint_lock_1 (); - int n, i; - n = nsfw_base_epoll_wait (epfd, events, MAXEVENTS, -1); - for (i = 0; i < n; i++) + int n, i; + n = nsfw_base_epoll_wait(epfd, events, MAXEVENTS, -1); + for (i = 0; i < n; i++) { - if (TRUE == - nsfw_sock_fun_callback (epfd, events[i].data.fd, - events[i].events)) + if (TRUE == + nsfw_sock_fun_callback(epfd, events[i].data.fd, + events[i].events)) { - g_ep_proc.hbt_count = 0; - continue; + g_ep_proc.hbt_count = 0; /*, we know here has multi-thread case, but we allow it */ + continue; } - NSFW_LOGERR ("error event recv] fd=%d,event=%d", - events[i].data.fd, events[i].events); + NSFW_LOGERR("error event recv]fd=%d,event=%u", events[i].data.fd, + events[i].events); } - lint_unlock_1 (); - } - -} - -NSTACK_STATIC inline void -get_thread_policy (pthread_attr_t * attr) -{ - int policy; - int rs = pthread_attr_getschedpolicy (attr, &policy); - if (rs != 0) - { - NSFW_LOGERR ("pthread_attr_getschedpolicy failed"); - return; - } - switch (policy) - { - case SCHED_FIFO: - NSFW_LOGINF ("policy= SCHED_FIFO"); - break; - case SCHED_RR: - NSFW_LOGINF ("policy= SCHED_RR"); - break; - case SCHED_OTHER: - NSFW_LOGINF ("policy=SCHED_OTHER"); - break; - default: - NSFW_LOGINF ("policy=UNKNOWN"); - break; - } - - return; -} -NSTACK_STATIC inline void -get_thread_priority (pthread_attr_t * attr) -{ - struct sched_param param; - int rs = pthread_attr_getschedparam (attr, ¶m); - if (rs != 0) - { - NSFW_LOGERR ("pthread_attr_getschedparam failed"); - return; } - NSFW_LOGINF ("get thread priority] pri=%d", param.sched_priority); -} - -/* support thread priority configuration */ -void -set_thread_attr (pthread_attr_t * pattr, int stacksize, int pri, int policy) -{ - struct sched_param param; - (void) pthread_attr_init (pattr); - - if (stacksize > 0) - { - (void) pthread_attr_setstacksize (pattr, stacksize); - } - - param.sched_priority = pri; - if (SCHED_OTHER != policy) - { - (void) pthread_attr_setschedpolicy (pattr, policy); - (void) pthread_attr_setschedparam (pattr, ¶m); - (void) pthread_attr_setinheritsched (pattr, PTHREAD_EXPLICIT_SCHED); - } - get_thread_policy (pattr); - get_thread_priority (pattr); } /***************************************************************************** @@ -1688,66 +1768,71 @@ set_thread_attr (pthread_attr_t * pattr, int stacksize, int pri, int policy) * Calls : * Called By : *****************************************************************************/ -u8 -nsfw_mgr_ep_start () +u8 nsfw_mgr_ep_start() { - /* heart beat thread should have the same priority with the tcpip thread */ - pthread_attr_t attr; - pthread_attr_t *pattr = NULL; + pthread_attr_t *pattr = NULL; - if (g_thread_policy != SCHED_OTHER) + /* move this code snippet from nsfw_mgr_listen_thread to here, + * to avoid multi-thread problem when calling nsfw_add_prestored_sock_to_ep in nsfw_mgr_listen_thread*/ + g_ep_proc.epfd = nsfw_base_epoll_create(10); + if (g_ep_proc.epfd <= 0) { - set_thread_attr (&attr, 0, g_thread_pri, g_thread_policy); - pattr = &attr; + NSFW_LOGERR("epoll_create fail]epfd=%d,errno=%d", g_ep_proc.epfd, + errno); + return FALSE; } + g_ep_proc.hbt_count = 0; - if (pthread_create - (&g_ep_proc.ep_thread, pattr, nsfw_mgr_listen_thread, NULL)) + if (FALSE == nsfw_add_prestored_sock_to_ep()) { - return FALSE; + return FALSE; } - NSFW_LOGINF ("start thread] id=%d", g_ep_proc.ep_thread); + if (pthread_create + (&g_ep_proc.ep_thread, pattr, nsfw_mgr_listen_thread, NULL)) + { + return FALSE; + } - if (pthread_setname_np (g_ep_proc.ep_thread, NSFW_MGRCOM_THREAD)) + NSFW_LOGINF("start thread]id=%d", g_ep_proc.ep_thread); + + if (pthread_setname_np(g_ep_proc.ep_thread, NSFW_MGRCOM_THREAD)) { - return TRUE; + return TRUE; } - (void) nsfw_reg_trace_thread (g_ep_proc.ep_thread); - return TRUE; + (void) nsfw_reg_trace_thread(g_ep_proc.ep_thread); + return TRUE; } -int -nsfw_mgr_com_chk_hbt (int v_add) +int nsfw_mgr_com_chk_hbt(int v_add) { - int ret = g_ep_proc.hbt_count; - g_ep_proc.hbt_count += v_add; - return ret; + int ret = g_ep_proc.hbt_count; + g_ep_proc.hbt_count += v_add; + return ret; } /***************************************************************************** * Prototype : nsfw_mgr_comm_fd_destroy -* Description : free the memory +* Description : free the memeory * Input : * Output : None * Return Value : int * Calls : * Called By : *****************************************************************************/ -void -nsfw_mgr_comm_fd_destroy () +void nsfw_mgr_comm_fd_destroy() { - if (g_ep_proc.ep_fun) + if (g_ep_proc.ep_fun) { - free (g_ep_proc.ep_fun); - g_ep_proc.ep_fun = NULL; + free(g_ep_proc.ep_fun); + g_ep_proc.ep_fun = NULL; } - if (g_mgr_socket_map.sock) + if (g_mgr_sockt_map.sock) { - free (g_mgr_socket_map.sock); - g_mgr_socket_map.sock = NULL; + free(g_mgr_sockt_map.sock); + g_mgr_sockt_map.sock = NULL; } - return; + return; } /***************************************************************************** @@ -1759,115 +1844,91 @@ nsfw_mgr_comm_fd_destroy () * Calls : * Called By : *****************************************************************************/ -int -nsfw_mgr_comm_fd_init (u32 proc_type) +int nsfw_mgr_comm_fd_init(u32 proc_type) { - /*only app need to do this */ - if ((g_mgr_socket_map.sock) && (g_ep_proc.ep_fun)) + /*distributed log collect, RANCU multi-nodes senario, nstack fd is limited to 1024, + this leads to DLOG SERVER container can't accept new connection, log can't be record normally. + maxfd limit to 60k begin */ + /*only app need to do this */ + errno_t err_ret = -1; + + if ((g_mgr_sockt_map.sock) && (g_ep_proc.ep_fun)) { - return 0; + return 0; } - if (NSFW_PROC_APP == proc_type) + if (NSFW_PROC_APP == proc_type) { - long sysfdmax = 0; - sysfdmax = sysconf (_SC_OPEN_MAX); - NSFW_LOGINF ("] sys max open files=%d", sysfdmax); - if (sysfdmax > 0) + long sysfdmax = 0; + sysfdmax = sysconf(_SC_OPEN_MAX); + NSFW_LOGINF("sys max open files]fds=%ld", sysfdmax); + if (sysfdmax > 0) { - NSFW_MGR_FD_MAX = - (int) ((sysfdmax <= - NSFW_MGRCOM_MAX_SOCKET * - 60) ? sysfdmax : NSFW_MGRCOM_MAX_SOCKET * 60); + NSFW_MGR_FD_MAX = + (int) ((sysfdmax <= + NSFW_MGRCOM_MAX_SOCKET * + 60) ? sysfdmax : NSFW_MGRCOM_MAX_SOCKET * 60); } - else + else { - NSFW_LOGERR ("get sys max open file fail"); - NSFW_MGR_FD_MAX = NSFW_MGRCOM_MAX_SOCKET; + NSFW_LOGERR("get sys max open file fail"); + NSFW_MGR_FD_MAX = NSFW_MGRCOM_MAX_SOCKET; } } - NSFW_LOGINF ("] final max fd=%d", NSFW_MGR_FD_MAX); - if (!g_mgr_socket_map.sock) + /* distributed log collect, RANCU multi-nodes senario, nstack fd is limited to 1024, + this leads to DLOG SERVER container can't accept new connection, log can't be record normally. + maxfd limit to 60k end */ + if (proc_type != NSFW_PROC_CTRL) { - g_mgr_socket_map.sock = - (nsfw_mgr_sock_info *) malloc (sizeof (nsfw_mgr_sock_info) * - NSFW_MGR_FD_MAX); - if (NULL == g_mgr_socket_map.sock) - { - NSFW_LOGERR ("malloc fail] length=%d", - sizeof (nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX); - return -1; - } - (void) MEMSET_S (g_mgr_socket_map.sock, - sizeof (nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX, 0, - sizeof (nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX); + NSFW_LOGINF("final]max fd=%d", NSFW_MGR_FD_MAX); } - if (!g_ep_proc.ep_fun) + + if (!g_mgr_sockt_map.sock) { - g_ep_proc.ep_fun = - (nsfw_mgr_sock_fun *) malloc (sizeof (nsfw_mgr_sock_fun) * - NSFW_MGR_FD_MAX); - if (NULL == g_ep_proc.ep_fun) + g_mgr_sockt_map.sock = + (nsfw_mgr_sock_info *) malloc(sizeof(nsfw_mgr_sock_info) * + NSFW_MGR_FD_MAX); + if (NULL == g_mgr_sockt_map.sock) { - NSFW_LOGERR ("malloc fail] length=%d ", - sizeof (nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX); - return -1; + NSFW_LOGERR("malloc fail]length=%d", + sizeof(nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX); + return -1; + } + err_ret = + memset_s(g_mgr_sockt_map.sock, + sizeof(nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX, 0, + sizeof(nsfw_mgr_sock_info) * NSFW_MGR_FD_MAX); + if (EOK != err_ret) + { + NSFW_LOGERR("memset_s fail]err_ret=%d", err_ret); + goto error; } - (void) MEMSET_S (g_ep_proc.ep_fun, - sizeof (nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX, 0, - sizeof (nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX); } - return 0; -} - -/***************************************************************************** -* Prototype : nsfw_mgr_com_mkdir_domainpath -* Description : check whether the domain path exist.if not exist, create it. -* Input : char *pathname -* Output : None -* Return Value : void -* Calls : -* Called By : -*****************************************************************************/ -void -nsfw_mgr_com_mkdir_domainpath (char *pathname) -{ - char dirname[NSFW_MGRCOM_PATH_LEN] = { 0 }; - int i, len; - if (NULL == pathname) + if (!g_ep_proc.ep_fun) { - NSFW_LOGERR ("the pathname is null."); - return; - } - - strncpy (dirname, pathname, NSFW_MGRCOM_PATH_LEN - 1); - len = strlen (dirname); - if (dirname[len - 1] != '/') - strncat (dirname, "/", 2); - - if (access (dirname, F_OK) == 0) - return; - - len = strlen (dirname); - - for (i = 1; i < len; i++) - { - if (dirname[i] == '/') + g_ep_proc.ep_fun = + (nsfw_mgr_sock_fun *) malloc(sizeof(nsfw_mgr_sock_fun) * + NSFW_MGR_FD_MAX); + if (NULL == g_ep_proc.ep_fun) { - dirname[i] = 0; - if (access (dirname, F_OK) != 0) - { - if (mkdir (dirname, 0755) == -1) - { - NSFW_LOGERR ("mkdir:%s error", dirname); - return; - } - } - dirname[i] = '/'; + NSFW_LOGERR("malloc fail] length=%d ", + sizeof(nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX); + goto error; + } + err_ret = + memset_s(g_ep_proc.ep_fun, + sizeof(nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX, 0, + sizeof(nsfw_mgr_sock_fun) * NSFW_MGR_FD_MAX); + if (EOK != err_ret) + { + NSFW_LOGERR("memset_s fail]err_ret=%d", err_ret); + goto error; } } - - return; + return 0; + error: + nsfw_mgr_comm_fd_destroy(); + return -1; } /***************************************************************************** @@ -1879,129 +1940,155 @@ nsfw_mgr_com_mkdir_domainpath (char *pathname) * Calls : * Called By : *****************************************************************************/ -int nsfw_mgr_com_module_init (void *param); -int -nsfw_mgr_com_module_init (void *param) +/*try to get event form all modules */ +int nsfw_mgr_com_module_init(void *param); +int nsfw_mgr_com_module_init(void *param) { - lint_lock_1 (); - u32 proc_type = (u32) ((long long) param); - nsfw_mgr_init_cfg *mgr_cfg = &g_mgr_com_cfg; - const char *directory = NSFW_DOMAIN_DIR; - const char *home_dir = getenv ("HOME"); + u32 proc_type = (u32) ((long long) param); + nsfw_mgr_init_cfg *mgr_cfg = &g_mgr_com_cfg; + const char *directory = NSFW_DOMAIN_DIR; + const char *home_dir = get_home_path(); - NSFW_LOGINF ("module mgr init] type=%u", proc_type); + NSFW_LOGINF("module mgr init]type=%u", proc_type); - if (getuid () != 0 && home_dir != NULL) - directory = home_dir; + if (home_dir) + { + directory = home_dir; + } - if (0 != nsfw_mgr_comm_fd_init (proc_type)) + if (0 != nsfw_mgr_comm_fd_init(proc_type)) { - NSFW_LOGERR ("fd init fail] proc_type=%u", proc_type); - lint_unlock_1 (); - return -1; + NSFW_LOGERR("fd init fail]proc_type=%u", proc_type); + return -1; } - switch (proc_type) + switch (proc_type) { - case NSFW_PROC_MAIN: - /* modify destMax, remove "-1" */ - if (EOK != - STRCPY_S (mgr_cfg->domain_path, NSFW_MGRCOM_PATH_LEN, directory)) - { - NSFW_LOGERR ("module mgr init STRCPY_S failed!"); - lint_unlock_1 (); - return -1; - } + case NSFW_PROC_MAIN: + /*modify destMax, remove "-1" */ + if (EOK != + strcpy_s(mgr_cfg->domain_path, NSFW_MGRCOM_PATH_LEN, + directory)) + { + NSFW_LOGERR("module mgr init strcpy_s fail"); + return -1; + } - nsfw_mgr_com_mkdir_domainpath (mgr_cfg->domain_path); + /*modify destMax, remove "-1" */ + if (EOK != + strcat_s(mgr_cfg->domain_path, NSFW_MGRCOM_PATH_LEN, + NSFW_MAIN_FILE)) + { + NSFW_LOGERR("module mgr init strcat_s fail"); + return -1; + } - NSFW_LOGINF ("module mgr init]NSFW_PROC_MAIN domain_path=%s", - mgr_cfg->domain_path); + NSFW_LOGINF("module mgr init]NSFW_PROC_MAIN domain_path=%s", + mgr_cfg->domain_path); - if (TRUE != nsfw_mgr_com_start ()) - { - NSFW_LOGERR ("module mgr nsfw_mgr_com_start failed!"); - lint_unlock_1 (); - return -1; - } + if (TRUE != nsfw_mgr_com_start()) + { + NSFW_LOGERR("module mgr nsfw_mgr_com_start fail"); + return -1; + } - break; + break; + case NSFW_PROC_MASTER: + /* modify destMax, remove "-1" */ + if (EOK != + strcpy_s(mgr_cfg->domain_path, NSFW_MGRCOM_PATH_LEN, + directory)) + { + NSFW_LOGERR("module mgr init strcpy_s fail"); + return -1; + } - case NSFW_PROC_TOOLS: - break; - case NSFW_PROC_CTRL: - if (TRUE != nsfw_mgr_com_start_local (proc_type)) - { - NSFW_LOGERR ("module mgr nsfw_mgr_com_start_local failed!"); - lint_unlock_1 (); - return -1; - } - break; - default: - if (proc_type < NSFW_PROC_MAX) - { - break; - } - lint_unlock_1 (); - return -1; + /* modify destMax, remove "-1" */ + if (EOK != + strcat_s(mgr_cfg->domain_path, NSFW_MGRCOM_PATH_LEN, + NSFW_MASTER_FILE)) + { + NSFW_LOGERR("module mgr init strcat_s fail"); + return -1; + } + + NSFW_LOGINF("module mgr init]NSFW_PROC_MASTER domain_path=%s", + mgr_cfg->domain_path); + + if (TRUE != nsfw_mgr_com_start()) + { + NSFW_LOGERR("module mgr nsfw_mgr_com_start fail"); + return -1; + } + + break; + case NSFW_PROC_TOOLS: + case NSFW_PROC_CTRL: + if (TRUE != nsfw_mgr_com_start_local(proc_type)) + { + NSFW_LOGERR("module mgr nsfw_mgr_com_start_local fail"); + return -1; + } + break; + default: + if (proc_type < NSFW_PROC_MAX) + { + break; + } + return -1; } - mgr_cfg->msg_size = MGR_COM_MSG_COUNT_DEF; - mgr_cfg->max_recv_timeout = MGR_COM_RECV_TIMEOUT_DEF; - mgr_cfg->max_recv_drop_msg = MGR_COM_MAX_DROP_MSG_DEF; + mgr_cfg->msg_size = MGR_COM_MSG_COUNT_DEF; + mgr_cfg->max_recv_timeout = MGR_COM_RECV_TIMEOUT_DEF; + mgr_cfg->max_recv_drop_msg = MGR_COM_MAX_DROP_MSG_DEF; - mgr_cfg->proc_type = proc_type; + mgr_cfg->proc_type = proc_type; - nsfw_mem_sppool pmpinfo; - if (EOK != MEMSET_S (&pmpinfo, sizeof (pmpinfo), 0, sizeof (pmpinfo))) + nsfw_mem_sppool pmpinfo; + if (EOK != memset_s(&pmpinfo, sizeof(pmpinfo), 0, sizeof(pmpinfo))) { - NSFW_LOGERR ("Error to memset!!!"); - nsfw_mgr_comm_fd_destroy (); - lint_unlock_1 (); - return -1; + NSFW_LOGERR("memset fail"); + nsfw_mgr_comm_fd_destroy(); + return -1; } - pmpinfo.enmptype = NSFW_MRING_MPMC; - pmpinfo.usnum = mgr_cfg->msg_size; - pmpinfo.useltsize = sizeof (nsfw_mgr_msg); - pmpinfo.isocket_id = NSFW_SOCKET_ANY; - pmpinfo.stname.entype = NSFW_NSHMEM; - if (-1 == - SPRINTF_S (pmpinfo.stname.aname, sizeof (pmpinfo.stname.aname), "%s", - "MS_MGR_MSGPOOL")) + pmpinfo.enmptype = NSFW_MRING_MPMC; + pmpinfo.usnum = mgr_cfg->msg_size; + pmpinfo.useltsize = sizeof(nsfw_mgr_msg); + pmpinfo.isocket_id = NSFW_SOCKET_ANY; + pmpinfo.stname.entype = NSFW_NSHMEM; + if (-1 == + sprintf_s(pmpinfo.stname.aname, sizeof(pmpinfo.stname.aname), "%s", + "MS_MGR_MSGPOOL")) { - NSFW_LOGERR ("Error to SPRINTF_S!!!"); - nsfw_mgr_comm_fd_destroy (); - lint_unlock_1 (); - return -1; + NSFW_LOGERR("sprintf_s fail"); + nsfw_mgr_comm_fd_destroy(); + return -1; } - mgr_cfg->msg_pool = nsfw_mem_sp_create (&pmpinfo); + mgr_cfg->msg_pool = nsfw_mem_sp_create(&pmpinfo); - if (!mgr_cfg->msg_pool) + if (!mgr_cfg->msg_pool) { - NSFW_LOGERR ("module mgr init msg_pool alloc failed!"); - nsfw_mgr_comm_fd_destroy (); - lint_unlock_1 (); - return -1; + NSFW_LOGERR("module mgr init msg_pool alloc fail"); + nsfw_mgr_comm_fd_destroy(); + return -1; } - (void) MEM_STAT (NSFW_MGR_COM_MODULE, pmpinfo.stname.aname, NSFW_NSHMEM, - nsfw_mem_get_len (mgr_cfg->msg_pool, NSFW_MEM_SPOOL)); + (void) MEM_STAT(NSFW_MGR_COM_MODULE, pmpinfo.stname.aname, NSFW_NSHMEM, + nsfw_mem_get_len(mgr_cfg->msg_pool, NSFW_MEM_SPOOL)); - if ((NSFW_PROC_TOOLS == proc_type) - || (NSFW_PROC_CTRL == proc_type) || (NSFW_PROC_MAIN == proc_type)) + if ((NSFW_PROC_TOOLS == proc_type) + || (NSFW_PROC_CTRL == proc_type) || (NSFW_PROC_MAIN == proc_type)) { - if (TRUE != nsfw_mgr_ep_start ()) + if (TRUE != nsfw_mgr_ep_start()) { - NSFW_LOGERR ("module mgr nsfw_mgr_ep_start failed!"); - nsfw_mgr_comm_fd_destroy (); - lint_unlock_1 (); - return -1; + NSFW_LOGERR("module mgr nsfw_mgr_ep_start fail"); + nsfw_mgr_comm_fd_destroy(); + return -1; } } - lint_unlock_1 (); - return 0; + return 0; } /***************************************************************************** @@ -2012,37 +2099,36 @@ nsfw_mgr_com_module_init (void *param) * Return Value : int * Calls : * Called By : - *****************************************************************************/ -int -nsfw_mgr_run_script (const char *cmd, char *result, int result_buf_len) +*****************************************************************************/ +int nsfw_mgr_run_script(const char *cmd, char *result, int result_buf_len) { - if (!cmd || !result || result_buf_len <= 1) + if (!cmd || !result || result_buf_len <= 1) { - return -1; + return -1; } - FILE *fp = popen (cmd, "r"); - if (fp != NULL) + FILE *fp = popen(cmd, "r"); + if (fp != NULL) { - size_t n = fread (result, sizeof (char), result_buf_len - 1, fp); - if (n == 0) + size_t n = fread(result, sizeof(char), result_buf_len - 1, fp); + if (n == 0) { - result[0] = '\0'; + result[0] = '\0'; } - else if ('\n' == result[n - 1]) + else if ('\n' == result[n - 1]) { - result[n - 1] = '\0'; + result[n - 1] = '\0'; } - else + else { - result[n] = '\0'; + result[n] = '\0'; } - pclose (fp); - return n; + pclose(fp); + return n; } - return -1; + return -1; } /* *INDENT-OFF* */ |