summaryrefslogtreecommitdiffstats
path: root/src/framework/maintain/nsfw_ver_mgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/framework/maintain/nsfw_ver_mgr.c')
-rw-r--r--src/framework/maintain/nsfw_ver_mgr.c391
1 files changed, 391 insertions, 0 deletions
diff --git a/src/framework/maintain/nsfw_ver_mgr.c b/src/framework/maintain/nsfw_ver_mgr.c
new file mode 100644
index 0000000..993fd49
--- /dev/null
+++ b/src/framework/maintain/nsfw_ver_mgr.c
@@ -0,0 +1,391 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include <stdlib.h>
+#include "types.h"
+#include "nstack_securec.h"
+#include "nsfw_init_api.h"
+#include "nstack_log.h"
+#include "nsfw_maintain_api.h"
+#include "nsfw_mem_api.h"
+
+nsfw_ver_info g_ver_info;
+
+int g_cur_upg_state = 0;
+int g_start_type = 0;
+
+#define NSFW_VER_UPG_KILL_TIME 5
+
+u8 nsfw_init_version_info(u8 proc_type)
+{
+ int retVal;
+ char *module_name = nsfw_get_proc_name(proc_type);
+ if (NULL == module_name)
+ {
+ return FALSE;
+ }
+
+ retVal =
+ strcpy_s(g_ver_info.module_name, NSTACK_MAX_MODULE_LEN, module_name);
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strcpy_s failed]ret=%d.", retVal);
+ return FALSE;
+ }
+
+ /* `sizeof(constant string) -1` equals to `strlen(constant string)` */
+ retVal = strcpy_s(g_ver_info.version, NSTACK_MAX_VERSION_LEN, NSTACK_GETVER_VERSION); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ return FALSE;
+ }
+
+ retVal = strcpy_s(g_ver_info.build_time, NSTACK_MAX_BUILDTIME_LEN, NSTACK_GETVER_BUILDTIME); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ return FALSE;
+ }
+ NSFW_LOGINF("init version]daemon-stack_version=%s", NSTACK_VERSION);
+ return TRUE;
+}
+
+/*****************************************************************************
+* Prototype : nsfw_srv_ctrl_send
+* Description : send service control message
+* Input : nsfw_srv_ctrl_state state
+* Output : None
+* Return Value : u8
+* Calls :
+* Called By :
+*****************************************************************************/
+u8 nsfw_srv_ctrl_send(nsfw_srv_ctrl_state state, u8 rsp_flag)
+{
+ nsfw_mgr_msg *req_msg =
+ nsfw_mgr_msg_alloc(MGR_MSG_SRV_CTL_REQ, NSFW_PROC_MASTER);
+ if (NULL == req_msg)
+ {
+ NSFW_LOGERR("alloc req msg failed]state=%d", state);
+ return FALSE;
+ }
+
+ nsfw_mgr_msg *rsp_msg = NULL;
+ if (TRUE == rsp_flag)
+ {
+ rsp_msg = nsfw_mgr_null_rspmsg_alloc();
+ if (NULL == rsp_msg)
+ {
+ nsfw_mgr_msg_free(req_msg);
+ NSFW_LOGERR("alloc rsp msg failed]state=%d", state);
+ return FALSE;
+ }
+ }
+
+ nsfw_srv_ctrl_msg *ctrl_msg = GET_USER_MSG(nsfw_srv_ctrl_msg, req_msg);
+ ctrl_msg->srv_state = state;
+
+ u8 ret;
+ ret = nsfw_mgr_send_req_wait_rsp(req_msg, rsp_msg);
+ NSFW_LOGINF("send srv ctrl end msg]state=%d,ret=%u,rsp=%u", state, ret,
+ rsp_flag);
+ nsfw_mgr_msg_free(req_msg);
+ if (NULL != rsp_msg)
+ {
+ nsfw_mgr_msg_free(rsp_msg);
+ }
+ return ret;
+}
+
+/*****************************************************************************
+* Prototype : nsfw_ver_mgr_rsq
+* Description : send version mgr message
+* Input : u16 rsp_code
+* Output : None
+* Return Value : u8
+* Calls :
+* Called By :
+*****************************************************************************/
+u8 nsfw_ver_mgr_rsq(u16 rsp_code, u32 src_pid)
+{
+ nsfw_mgr_msg *rsp_msg =
+ nsfw_mgr_msg_alloc(MGR_MSG_VER_MGR_RSP, NSFW_PROC_CTRL);
+ if (NULL == rsp_msg)
+ {
+ NSFW_LOGERR("alloc rsp msg failed]rsp_code=%u", rsp_code);
+ return FALSE;
+ }
+
+ rsp_msg->dst_pid = src_pid;
+ if (rsp_code != 0)
+ {
+ g_cur_upg_state = 0;
+ }
+
+ nsfw_ver_mgr_msg *ver_msg = GET_USER_MSG(nsfw_ver_mgr_msg, rsp_msg);
+ ver_msg->rsp_code = rsp_code;
+ (void) nsfw_mgr_send_msg(rsp_msg);
+ nsfw_mgr_msg_free(rsp_msg);
+ NSFW_LOGINF("send ver mgr rsp msg]state=%u", rsp_code);
+ return TRUE;
+}
+
+/*****************************************************************************
+* Prototype : nsfw_ver_mgr_req
+* Description : send ver mgr request message
+* Input : nsfw_ver_mgr_state state
+* char *src_ver
+* char* dst_ver
+* Output : None
+* Return Value : u8
+* Calls :
+* Called By :
+*****************************************************************************/
+u8 nsfw_ver_mgr_req(nsfw_ver_mgr_state state, char *src_ver, char *dst_ver)
+{
+ nsfw_mgr_msg *req_msg =
+ nsfw_mgr_msg_alloc(MGR_MSG_VER_MGR_REQ, NSFW_PROC_MAIN);
+ if (NULL == req_msg)
+ {
+ NSFW_LOGERR("alloc rsp msg failed]state=%d", state);
+ return FALSE;
+ }
+
+ nsfw_ver_mgr_msg *ver_msg = GET_USER_MSG(nsfw_ver_mgr_msg, req_msg);
+ ver_msg->ver_state = state;
+
+ /* we'd better use `strlen(src)` or `sizeof(dst)` to explain copying length of src string.
+ it's meaningless using `sizeof(dst) - 1` to reserve 1 byte for '\0'.
+ if copying length equals to or bigger than dst length, just let strncpy_s() returns failure. */
+ int retVal;
+ retVal = strcpy_s(ver_msg->src_ver, NSTACK_MAX_VERSION_LEN, src_ver); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ nsfw_mgr_msg_free(req_msg);
+ return FALSE;
+ }
+
+ retVal = strcpy_s(ver_msg->dst_ver, NSTACK_MAX_VERSION_LEN, dst_ver); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ nsfw_mgr_msg_free(req_msg);
+ return FALSE;
+ }
+
+ (void) nsfw_mgr_send_msg(req_msg);
+ nsfw_mgr_msg_free(req_msg);
+ NSFW_LOGINF("send srv ctrl end msg]state=%d", state);
+ return TRUE;
+}
+
+/*****************************************************************************
+* Prototype : nsfw_ver_mgr_msg_proc
+* Description : version info query message process
+* Input : nsfw_mgr_msg* msg
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*****************************************************************************/
+int nsfw_ver_mgr_msg_proc(nsfw_mgr_msg * msg)
+{
+ if (NULL == msg)
+ {
+ NSFW_LOGERR("msg nul");
+ return FALSE;
+ }
+
+ nsfw_ver_mgr_msg *ver_mgr_msg = GET_USER_MSG(nsfw_ver_mgr_msg, msg);
+ NSFW_LOGDBG("recv ver mgr msg]state=%d,src_ver=%s,dst_ver=%s",
+ ver_mgr_msg->ver_state, ver_mgr_msg->src_ver,
+ ver_mgr_msg->dst_ver);
+
+ if (NSFW_VER_QRY == ver_mgr_msg->ver_state)
+ {
+ nsfw_mgr_msg *rsp_msg = nsfw_mgr_rsp_msg_alloc(msg);
+ if (NULL == rsp_msg)
+ {
+ NSFW_LOGERR("alloc rsp failed,drop msg!" MSGINFO, PRTMSG(msg));
+ return FALSE;
+ }
+
+ nsfw_ver_mgr_msg *ver_rsp_msg =
+ GET_USER_MSG(nsfw_ver_mgr_msg, rsp_msg);
+
+ /* we'd better use `strlen(src)` or `sizeof(dst)` to explain copying length of src string.
+ it's meaningless using `sizeof(dst) - 1` to reserve 1 byte for '\0'.
+ if copying length equals to or bigger than dst length, just let strncpy_s() returns failure. */
+
+ /* change strncpy_s's param 'count' from XXX to XXX-1 */
+ int retVal;
+ retVal = strcpy_s(ver_rsp_msg->module_name, NSTACK_MAX_MODULE_LEN, g_ver_info.module_name); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ nsfw_mgr_msg_free(rsp_msg);
+ return FALSE;
+ }
+
+ retVal = strcpy_s(ver_rsp_msg->src_ver, NSTACK_MAX_VERSION_LEN, g_ver_info.version); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ nsfw_mgr_msg_free(rsp_msg);
+ return FALSE;
+ }
+
+ retVal = strcpy_s(ver_rsp_msg->build_time, NSTACK_MAX_BUILDTIME_LEN, g_ver_info.build_time); //remove needless 'count' param and change strncpy_s to strcpy_s
+ if (EOK != retVal)
+ {
+ NSFW_LOGERR("strncpy_s failed]ret=%d.", retVal);
+ nsfw_mgr_msg_free(rsp_msg);
+ return FALSE;
+ }
+
+ ver_rsp_msg->ver_state = ver_mgr_msg->ver_state;
+ (void) nsfw_mgr_send_msg(rsp_msg);
+ nsfw_mgr_msg_free(rsp_msg);
+ }
+
+ return TRUE;
+}
+
+/*****************************************************************************
+* Prototype : nsfw_ver_mgr_upg_msg_proc
+* Description : master upg
+* Input : nsfw_mgr_msg* msg
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*****************************************************************************/
+int nsfw_ver_mgr_upg_msg_proc(nsfw_mgr_msg * msg)
+{
+ if (NULL == msg)
+ {
+ NSFW_LOGERR("msg nul");
+ return FALSE;
+ }
+
+ nsfw_ver_mgr_msg *ver_mgr_msg = GET_USER_MSG(nsfw_ver_mgr_msg, msg); /*not redeclared */
+ NSFW_LOGDBG("recv ver mgr msg]state=%d,src_ver=%s,dst_ver=%s",
+ ver_mgr_msg->ver_state, ver_mgr_msg->src_ver,
+ ver_mgr_msg->dst_ver);
+
+ if ((NSFW_VER_UPG != ver_mgr_msg->ver_state)
+ && (NSFW_VER_RBK != ver_mgr_msg->ver_state))
+ {
+ return FALSE;
+ }
+
+ if (TRUE == nsfw_ver_mgr_rsq(0, msg->src_pid))
+ {
+ int i = 0;
+ while (i < NSFW_VER_UPG_KILL_TIME)
+ {
+ NSFW_LOGINF("wait nStackKill!]i=%d", i);
+ (void) sleep(1);
+ i++;
+ }
+
+ exit(0);
+ }
+ return TRUE;
+}
+
+u8 nsfw_init_result_send(u8 local_proc, nsfw_init_state state, u8 rsp_flag)
+{
+ nsfw_mgr_msg *req_msg =
+ nsfw_mgr_msg_alloc(MGR_MSG_INIT_NTY_REQ, NSFW_PROC_MASTER);
+ if (NULL == req_msg)
+ {
+ NSFW_LOGERR("alloc req msg failed]state=%d", state);
+ return FALSE;
+ }
+
+ nsfw_mgr_msg *rsp_msg = NULL;
+ if (TRUE == rsp_flag)
+ {
+ rsp_msg = nsfw_mgr_rsp_msg_alloc(req_msg);
+ if (NULL == rsp_msg)
+ {
+ NSFW_LOGERR("alloc rsp msg failed]state=%d", state);
+ nsfw_mgr_msg_free(req_msg);
+ return FALSE;
+ }
+ }
+
+ if (TRUE == req_msg->from_mem)
+ {
+ req_msg->src_proc_type = local_proc;
+ }
+
+ nsfw_init_nty_msg *init_msg = GET_USER_MSG(nsfw_init_nty_msg, req_msg);
+ init_msg->init_state = state;
+
+ u8 ret;
+ ret = nsfw_mgr_send_req_wait_rsp(req_msg, rsp_msg);
+ NSFW_LOGINF("send init end msg]state=%d,ret=%u,rsp=%u", state, ret,
+ rsp_flag);
+ nsfw_mgr_msg_free(req_msg);
+ if (NULL != rsp_msg)
+ {
+ nsfw_mgr_msg_free(rsp_msg);
+ }
+
+ return ret;
+}
+
+int nsfw_vermgr_module_init(void *param);
+int nsfw_vermgr_module_init(void *param)
+{
+ u8 proc_type = (u8) ((long long) param);
+ if (proc_type != NSFW_PROC_CTRL)
+ {
+ NSFW_LOGINF("verupg module init]type=%d", proc_type);
+ }
+ (void) nsfw_init_version_info(proc_type);
+ switch (proc_type)
+ {
+ case NSFW_PROC_MASTER:
+ (void) nsfw_mgr_reg_msg_fun(MGR_MSG_VER_MGR_REQ,
+ nsfw_ver_mgr_upg_msg_proc);
+ (void) nsfw_mgr_reg_msg_fun(MGR_MSG_VER_MGR_REQ,
+ nsfw_ver_mgr_msg_proc);
+ return 0;
+ case NSFW_PROC_MAIN:
+ case NSFW_PROC_CTRL:
+ (void) nsfw_mgr_reg_msg_fun(MGR_MSG_VER_MGR_REQ,
+ nsfw_ver_mgr_msg_proc);
+ return 0;
+ default:
+ if (proc_type < NSFW_PROC_MAX)
+ {
+ break;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+/* *INDENT-OFF* */
+NSFW_MODULE_NAME(NSFW_VER_MGR_MODULE)
+NSFW_MODULE_PRIORITY(99)
+NSFW_MODULE_INIT(nsfw_vermgr_module_init)
+/* *INDENT-ON* */