147c9fbaeSopenharmony_ci/*
247c9fbaeSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
347c9fbaeSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
447c9fbaeSopenharmony_ci * you may not use this file except in compliance with the License.
547c9fbaeSopenharmony_ci * You may obtain a copy of the License at
647c9fbaeSopenharmony_ci *
747c9fbaeSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
847c9fbaeSopenharmony_ci *
947c9fbaeSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1047c9fbaeSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1147c9fbaeSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1247c9fbaeSopenharmony_ci * See the License for the specific language governing permissions and
1347c9fbaeSopenharmony_ci * limitations under the License.
1447c9fbaeSopenharmony_ci */
1547c9fbaeSopenharmony_ci
1647c9fbaeSopenharmony_ci#include "blackbox.h"
1747c9fbaeSopenharmony_ci#include "blackbox_adapter.h"
1847c9fbaeSopenharmony_ci#include "blackbox_detector.h"
1947c9fbaeSopenharmony_ci#include "ohos_init.h"
2047c9fbaeSopenharmony_ci#include "ohos_types.h"
2147c9fbaeSopenharmony_ci#include "pthread.h"
2247c9fbaeSopenharmony_ci#include "securec.h"
2347c9fbaeSopenharmony_ci#include "utils_list.h"
2447c9fbaeSopenharmony_ci
2547c9fbaeSopenharmony_ci/******************local macroes*********************/
2647c9fbaeSopenharmony_ci#define LOG_ROOT_DIR_WAIT_TIME  1000
2747c9fbaeSopenharmony_ci#define LOG_ROOT_DIR_WAIT_COUNT 1
2847c9fbaeSopenharmony_ci#ifndef LOS_WAIT_FOREVER
2947c9fbaeSopenharmony_ci#define LOS_WAIT_FOREVER        0xFFFFFFFF
3047c9fbaeSopenharmony_ci#endif
3147c9fbaeSopenharmony_ci#ifndef LOS_NO_WAIT
3247c9fbaeSopenharmony_ci#define LOS_NO_WAIT             0
3347c9fbaeSopenharmony_ci#endif
3447c9fbaeSopenharmony_ci#ifndef LOS_OK
3547c9fbaeSopenharmony_ci#define LOS_OK                  0
3647c9fbaeSopenharmony_ci#endif
3747c9fbaeSopenharmony_ci
3847c9fbaeSopenharmony_ci/******************local prototypes******************/
3947c9fbaeSopenharmony_cistruct BBoxOps {
4047c9fbaeSopenharmony_ci    UTILS_DL_LIST opsList;
4147c9fbaeSopenharmony_ci    struct ModuleOps ops;
4247c9fbaeSopenharmony_ci};
4347c9fbaeSopenharmony_ci
4447c9fbaeSopenharmony_ci/******************global functions*******************/
4547c9fbaeSopenharmony_ci/******************local variables*******************/
4647c9fbaeSopenharmony_cistatic UTILS_DL_LIST_HEAD(g_opsList);
4747c9fbaeSopenharmony_cistatic unsigned int g_opsListSem;
4847c9fbaeSopenharmony_ci
4947c9fbaeSopenharmony_ci/******************function definitions*******************/
5047c9fbaeSopenharmony_cistatic void GetDirName(char *dirBuf, unsigned int dirBufSize, const char *path)
5147c9fbaeSopenharmony_ci{
5247c9fbaeSopenharmony_ci    if (dirBuf == NULL || dirBufSize == 0 || path == NULL) {
5347c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("dirBuf: %p, dirBufSize: %u, path: %p!\n", dirBuf, dirBufSize, path);
5447c9fbaeSopenharmony_ci        return;
5547c9fbaeSopenharmony_ci    }
5647c9fbaeSopenharmony_ci
5747c9fbaeSopenharmony_ci    const char *end = path + strlen(path);
5847c9fbaeSopenharmony_ci    while (*end != '/' && end >= path) {
5947c9fbaeSopenharmony_ci        end--;
6047c9fbaeSopenharmony_ci    }
6147c9fbaeSopenharmony_ci    if (end >= path) {
6247c9fbaeSopenharmony_ci        (void)memset_s(dirBuf, dirBufSize, 0, dirBufSize);
6347c9fbaeSopenharmony_ci        if (strncpy_s(dirBuf, dirBufSize - 1, path, end - path + strlen("/")) != EOK) {
6447c9fbaeSopenharmony_ci            BBOX_PRINT_ERR("strncpy_s failed or the dirBuf is not enough!\n");
6547c9fbaeSopenharmony_ci        }
6647c9fbaeSopenharmony_ci    } else {
6747c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("no / has been found!\n");
6847c9fbaeSopenharmony_ci    }
6947c9fbaeSopenharmony_ci}
7047c9fbaeSopenharmony_ci
7147c9fbaeSopenharmony_cistatic void FormatErrorInfo(struct ErrorInfo *info,
7247c9fbaeSopenharmony_ci    const char event[EVENT_MAX_LEN],
7347c9fbaeSopenharmony_ci    const char module[MODULE_MAX_LEN],
7447c9fbaeSopenharmony_ci    const char errorDesc[ERROR_DESC_MAX_LEN])
7547c9fbaeSopenharmony_ci{
7647c9fbaeSopenharmony_ci    if (info == NULL || event == NULL || module == NULL || errorDesc == NULL) {
7747c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("info: %p, event: %p, module: %p, errorDesc: %p\n",
7847c9fbaeSopenharmony_ci            info, event, module, errorDesc);
7947c9fbaeSopenharmony_ci        return;
8047c9fbaeSopenharmony_ci    }
8147c9fbaeSopenharmony_ci
8247c9fbaeSopenharmony_ci    (void)memset_s(info, sizeof(*info), 0, sizeof(*info));
8347c9fbaeSopenharmony_ci    if (strncpy_s(info->event, sizeof(info->event), event,
8447c9fbaeSopenharmony_ci        Min(strlen(event), sizeof(info->event) - 1)) != EOK) {
8547c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("strncpy_s failed or the info->event is not enough!\n");
8647c9fbaeSopenharmony_ci    }
8747c9fbaeSopenharmony_ci    if (strncpy_s(info->module, sizeof(info->module), module,
8847c9fbaeSopenharmony_ci        Min(strlen(module), sizeof(info->module) - 1)) != EOK) {
8947c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("strncpy_s failed or the info->module is not enough!\n");
9047c9fbaeSopenharmony_ci    }
9147c9fbaeSopenharmony_ci    if (strncpy_s(info->errorDesc, sizeof(info->errorDesc), errorDesc,
9247c9fbaeSopenharmony_ci        Min(strlen(errorDesc), sizeof(info->errorDesc) - 1)) != EOK) {
9347c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("strncpy_s failed or the info->errorDesc is not enough!\n");
9447c9fbaeSopenharmony_ci    }
9547c9fbaeSopenharmony_ci}
9647c9fbaeSopenharmony_ci
9747c9fbaeSopenharmony_cistatic void WaitForLogRootDir(const char *rootDir)
9847c9fbaeSopenharmony_ci{
9947c9fbaeSopenharmony_ci    int i = 0;
10047c9fbaeSopenharmony_ci
10147c9fbaeSopenharmony_ci    if (rootDir == NULL) {
10247c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("rootDir: %p\n", rootDir);
10347c9fbaeSopenharmony_ci        return;
10447c9fbaeSopenharmony_ci    }
10547c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("wait for log root dir [%s] begin!\n", rootDir);
10647c9fbaeSopenharmony_ci    while (i++ < LOG_ROOT_DIR_WAIT_COUNT) {
10747c9fbaeSopenharmony_ci        LOS_Msleep(LOG_ROOT_DIR_WAIT_TIME);
10847c9fbaeSopenharmony_ci    }
10947c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("wait for log root dir [%s] end!\n", rootDir);
11047c9fbaeSopenharmony_ci}
11147c9fbaeSopenharmony_ci
11247c9fbaeSopenharmony_cistatic void SaveBasicErrorInfo(const char *filePath, struct ErrorInfo *info)
11347c9fbaeSopenharmony_ci{
11447c9fbaeSopenharmony_ci    char *buf = NULL;
11547c9fbaeSopenharmony_ci
11647c9fbaeSopenharmony_ci    if (filePath == NULL || info == NULL) {
11747c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("filePath: %p, info: %p!\n", filePath, info);
11847c9fbaeSopenharmony_ci        return;
11947c9fbaeSopenharmony_ci    }
12047c9fbaeSopenharmony_ci
12147c9fbaeSopenharmony_ci    buf = malloc(ERROR_INFO_MAX_LEN);
12247c9fbaeSopenharmony_ci    if (buf == NULL) {
12347c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("malloc failed!\n");
12447c9fbaeSopenharmony_ci        return;
12547c9fbaeSopenharmony_ci    }
12647c9fbaeSopenharmony_ci    (void)memset_s(buf, ERROR_INFO_MAX_LEN, 0, ERROR_INFO_MAX_LEN);
12747c9fbaeSopenharmony_ci    if (snprintf_s(buf, ERROR_INFO_MAX_LEN, ERROR_INFO_MAX_LEN - 1,
12847c9fbaeSopenharmony_ci        ERROR_INFO_HEADER ERROR_INFO_HEADER_FORMAT,
12947c9fbaeSopenharmony_ci        info->event, info->module, info->errorDesc) != -1) {
13047c9fbaeSopenharmony_ci        *(buf + ERROR_INFO_MAX_LEN - 1) = '\0';
13147c9fbaeSopenharmony_ci        (void)FullWriteFile(filePath, buf, strlen(buf), 0);
13247c9fbaeSopenharmony_ci    } else {
13347c9fbaeSopenharmony_ci        PRINT_ERR("buf is not enough or snprintf_s failed\n");
13447c9fbaeSopenharmony_ci    }
13547c9fbaeSopenharmony_ci    free(buf);
13647c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("[%s] starts uploading event [%s]\n",
13747c9fbaeSopenharmony_ci        info->module, info->event);
13847c9fbaeSopenharmony_ci    (void)UploadEventByFile(filePath);
13947c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("[%s] ends uploading event [%s]\n",
14047c9fbaeSopenharmony_ci        info->module, info->event);
14147c9fbaeSopenharmony_ci}
14247c9fbaeSopenharmony_ci
14347c9fbaeSopenharmony_cistatic void* SaveErrorLog(void *param)
14447c9fbaeSopenharmony_ci{
14547c9fbaeSopenharmony_ci    (void)param;
14647c9fbaeSopenharmony_ci    struct ErrorInfo *info = NULL;
14747c9fbaeSopenharmony_ci    struct BBoxOps *ops = NULL;
14847c9fbaeSopenharmony_ci    char dirName[PATH_MAX_LEN] = { 0 };
14947c9fbaeSopenharmony_ci
15047c9fbaeSopenharmony_ci    info = malloc(sizeof(*info));
15147c9fbaeSopenharmony_ci    if (info == NULL) {
15247c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("malloc failed!\n");
15347c9fbaeSopenharmony_ci        return NULL;
15447c9fbaeSopenharmony_ci    }
15547c9fbaeSopenharmony_ci
15647c9fbaeSopenharmony_ci    GetDirName(dirName, sizeof(dirName), GetFaultLogPath());
15747c9fbaeSopenharmony_ci    WaitForLogRootDir(dirName);
15847c9fbaeSopenharmony_ci    if (LOS_SemPend(g_opsListSem, LOS_WAIT_FOREVER) != 0) {
15947c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("Request g_opsListSem failed!\n");
16047c9fbaeSopenharmony_ci        free(info);
16147c9fbaeSopenharmony_ci        return NULL;
16247c9fbaeSopenharmony_ci    }
16347c9fbaeSopenharmony_ci    UTILS_DL_LIST_FOR_EACH_ENTRY(ops, &g_opsList, struct BBoxOps, opsList) {
16447c9fbaeSopenharmony_ci        if (ops == NULL) {
16547c9fbaeSopenharmony_ci            continue;
16647c9fbaeSopenharmony_ci        }
16747c9fbaeSopenharmony_ci        if (ops->ops.GetLastLogInfo != NULL && ops->ops.SaveLastLog != NULL) {
16847c9fbaeSopenharmony_ci            (void)memset_s(info, sizeof(*info), 0, sizeof(*info));
16947c9fbaeSopenharmony_ci            if (ops->ops.GetLastLogInfo(info) != 0) {
17047c9fbaeSopenharmony_ci                BBOX_PRINT_ERR("[%s] failed to get log info!\n",
17147c9fbaeSopenharmony_ci                    ops->ops.module);
17247c9fbaeSopenharmony_ci                    continue;
17347c9fbaeSopenharmony_ci            }
17447c9fbaeSopenharmony_ci            BBOX_PRINT_INFO("[%s] starts saving log!\n", ops->ops.module);
17547c9fbaeSopenharmony_ci            if (ops->ops.SaveLastLog(dirName, info) != 0) {
17647c9fbaeSopenharmony_ci                BBOX_PRINT_ERR("[%s] failed to save log!\n", ops->ops.module);
17747c9fbaeSopenharmony_ci            } else {
17847c9fbaeSopenharmony_ci                BBOX_PRINT_INFO("[%s] ends saving log!\n", ops->ops.module);
17947c9fbaeSopenharmony_ci                BBOX_PRINT_INFO("[%s] starts uploading event [%s]\n", info->module, info->event);
18047c9fbaeSopenharmony_ci                (void)UploadEventByFile(GetFaultLogPath());
18147c9fbaeSopenharmony_ci                BBOX_PRINT_INFO("[%s] ends uploading event [%s]\n", info->module, info->event);
18247c9fbaeSopenharmony_ci            }
18347c9fbaeSopenharmony_ci        }
18447c9fbaeSopenharmony_ci    }
18547c9fbaeSopenharmony_ci    (void)LOS_SemPost(g_opsListSem);
18647c9fbaeSopenharmony_ci    free(info);
18747c9fbaeSopenharmony_ci
18847c9fbaeSopenharmony_ci    return NULL;
18947c9fbaeSopenharmony_ci}
19047c9fbaeSopenharmony_ci
19147c9fbaeSopenharmony_ci#ifdef BLACKBOX_DEBUG
19247c9fbaeSopenharmony_cistatic void PrintModuleOps(void)
19347c9fbaeSopenharmony_ci{
19447c9fbaeSopenharmony_ci    struct BBoxOps *temp = NULL;
19547c9fbaeSopenharmony_ci
19647c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("The following modules have been registered!\n");
19747c9fbaeSopenharmony_ci    UTILS_DL_LIST_FOR_EACH_ENTRY(temp, &g_opsList, struct BBoxOps, opsList) {
19847c9fbaeSopenharmony_ci        BBOX_PRINT_INFO("module: %s, Dump: %p, Reset: %p, "
19947c9fbaeSopenharmony_ci            "GetLastLogInfo: %p, SaveLastLog: %p\n",
20047c9fbaeSopenharmony_ci            temp->ops.module, temp->ops.Dump, temp->ops.Reset,
20147c9fbaeSopenharmony_ci            temp->ops.GetLastLogInfo, temp->ops.SaveLastLog);
20247c9fbaeSopenharmony_ci    }
20347c9fbaeSopenharmony_ci}
20447c9fbaeSopenharmony_ci#endif
20547c9fbaeSopenharmony_ci
20647c9fbaeSopenharmony_ciint BBoxRegisterModuleOps(struct ModuleOps *ops)
20747c9fbaeSopenharmony_ci{
20847c9fbaeSopenharmony_ci    struct BBoxOps *newOps = NULL;
20947c9fbaeSopenharmony_ci    struct BBoxOps *temp = NULL;
21047c9fbaeSopenharmony_ci
21147c9fbaeSopenharmony_ci    if (ops == NULL) {
21247c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("ops: %p!\n", ops);
21347c9fbaeSopenharmony_ci        return -1;
21447c9fbaeSopenharmony_ci    }
21547c9fbaeSopenharmony_ci
21647c9fbaeSopenharmony_ci    /* Use malloc to avoid the stack overflow */
21747c9fbaeSopenharmony_ci    newOps = malloc(sizeof(*newOps));
21847c9fbaeSopenharmony_ci    if (newOps == NULL) {
21947c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("malloc failed!\n");
22047c9fbaeSopenharmony_ci        return -1;
22147c9fbaeSopenharmony_ci    }
22247c9fbaeSopenharmony_ci    (void)memset_s(newOps, sizeof(*newOps), 0, sizeof(*newOps));
22347c9fbaeSopenharmony_ci    (void)memcpy_s(&newOps->ops, sizeof(newOps->ops), ops, sizeof(*ops));
22447c9fbaeSopenharmony_ci    if (LOS_SemPend(g_opsListSem, LOS_WAIT_FOREVER) != 0) {
22547c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("Request g_opsListSem failed!\n");
22647c9fbaeSopenharmony_ci        free(newOps);
22747c9fbaeSopenharmony_ci        return -1;
22847c9fbaeSopenharmony_ci    }
22947c9fbaeSopenharmony_ci    if (UtilsListEmpty(&g_opsList)) {
23047c9fbaeSopenharmony_ci        goto __out;
23147c9fbaeSopenharmony_ci    }
23247c9fbaeSopenharmony_ci    UTILS_DL_LIST_FOR_EACH_ENTRY(temp, &g_opsList, struct BBoxOps, opsList) {
23347c9fbaeSopenharmony_ci        if (strcmp(temp->ops.module, ops->module) == 0) {
23447c9fbaeSopenharmony_ci            BBOX_PRINT_ERR("[%s] has been registered!\n", ops->module);
23547c9fbaeSopenharmony_ci            (void)LOS_SemPost(g_opsListSem);
23647c9fbaeSopenharmony_ci            free(newOps);
23747c9fbaeSopenharmony_ci            return -1;
23847c9fbaeSopenharmony_ci        }
23947c9fbaeSopenharmony_ci    }
24047c9fbaeSopenharmony_ci
24147c9fbaeSopenharmony_ci__out:
24247c9fbaeSopenharmony_ci    BBOX_PRINT_INFO("[%s] is registered successfully!\n", ops->module);
24347c9fbaeSopenharmony_ci    UtilsListTailInsert(&g_opsList, &newOps->opsList);
24447c9fbaeSopenharmony_ci    (void)LOS_SemPost(g_opsListSem);
24547c9fbaeSopenharmony_ci#ifdef BLACKBOX_DEBUG
24647c9fbaeSopenharmony_ci    PrintModuleOps();
24747c9fbaeSopenharmony_ci#endif
24847c9fbaeSopenharmony_ci
24947c9fbaeSopenharmony_ci    return 0;
25047c9fbaeSopenharmony_ci}
25147c9fbaeSopenharmony_ci
25247c9fbaeSopenharmony_ciint BBoxNotifyError(const char event[EVENT_MAX_LEN],
25347c9fbaeSopenharmony_ci    const char module[MODULE_MAX_LEN],
25447c9fbaeSopenharmony_ci    const char errorDesc[ERROR_DESC_MAX_LEN],
25547c9fbaeSopenharmony_ci    int needSysReset)
25647c9fbaeSopenharmony_ci{
25747c9fbaeSopenharmony_ci    int findModule = 0;
25847c9fbaeSopenharmony_ci    struct BBoxOps *ops = NULL;
25947c9fbaeSopenharmony_ci    struct ErrorInfo *info = NULL;
26047c9fbaeSopenharmony_ci    char dirName[PATH_MAX_LEN] = { 0 };
26147c9fbaeSopenharmony_ci
26247c9fbaeSopenharmony_ci    info = malloc(sizeof(*info));
26347c9fbaeSopenharmony_ci    if (info == NULL) {
26447c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("malloc failed!\n");
26547c9fbaeSopenharmony_ci        return -1;
26647c9fbaeSopenharmony_ci    }
26747c9fbaeSopenharmony_ci
26847c9fbaeSopenharmony_ci    GetDirName(dirName, sizeof(dirName), GetFaultLogPath());
26947c9fbaeSopenharmony_ci    if (needSysReset == 0) {
27047c9fbaeSopenharmony_ci        WaitForLogRootDir(dirName);
27147c9fbaeSopenharmony_ci        if (LOS_SemPend(g_opsListSem, LOS_NO_WAIT) != 0) {
27247c9fbaeSopenharmony_ci            BBOX_PRINT_ERR("Request g_opsListSem failed!\n");
27347c9fbaeSopenharmony_ci            goto __out;
27447c9fbaeSopenharmony_ci        }
27547c9fbaeSopenharmony_ci    }
27647c9fbaeSopenharmony_ci
27747c9fbaeSopenharmony_ci    UTILS_DL_LIST_FOR_EACH_ENTRY(ops, &g_opsList, struct BBoxOps, opsList) {
27847c9fbaeSopenharmony_ci        if (ops == NULL) {
27947c9fbaeSopenharmony_ci            BBOX_PRINT_ERR("ops: %p!\n", ops);
28047c9fbaeSopenharmony_ci            continue;
28147c9fbaeSopenharmony_ci        }
28247c9fbaeSopenharmony_ci        if (strcmp(ops->ops.module, module) != 0) {
28347c9fbaeSopenharmony_ci            continue;
28447c9fbaeSopenharmony_ci        }
28547c9fbaeSopenharmony_ci        FormatErrorInfo(info, event, module, errorDesc);
28647c9fbaeSopenharmony_ci        if (ops->ops.Dump == NULL && ops->ops.Reset == NULL) {
28747c9fbaeSopenharmony_ci            SaveBasicErrorInfo(GetFaultLogPath(), info);
28847c9fbaeSopenharmony_ci            break;
28947c9fbaeSopenharmony_ci        }
29047c9fbaeSopenharmony_ci        if (ops->ops.Dump != NULL) {
29147c9fbaeSopenharmony_ci            BBOX_PRINT_INFO("[%s] starts dumping data!\n", ops->ops.module);
29247c9fbaeSopenharmony_ci            ops->ops.Dump(dirName, info);
29347c9fbaeSopenharmony_ci            BBOX_PRINT_INFO("[%s] ends dumping data!\n", ops->ops.module);
29447c9fbaeSopenharmony_ci        }
29547c9fbaeSopenharmony_ci        if (ops->ops.Reset != NULL) {
29647c9fbaeSopenharmony_ci            BBOX_PRINT_INFO("[%s] starts resetting!\n", ops->ops.module);
29747c9fbaeSopenharmony_ci            ops->ops.Reset(info);
29847c9fbaeSopenharmony_ci            BBOX_PRINT_INFO("[%s] ends resetting!\n", ops->ops.module);
29947c9fbaeSopenharmony_ci        }
30047c9fbaeSopenharmony_ci        findModule = 1;
30147c9fbaeSopenharmony_ci        break;
30247c9fbaeSopenharmony_ci    }
30347c9fbaeSopenharmony_ci    if (needSysReset == 0) {
30447c9fbaeSopenharmony_ci        (void)LOS_SemPost(g_opsListSem);
30547c9fbaeSopenharmony_ci    }
30647c9fbaeSopenharmony_ci
30747c9fbaeSopenharmony_ci__out:
30847c9fbaeSopenharmony_ci    if (info != NULL) {
30947c9fbaeSopenharmony_ci        free(info);
31047c9fbaeSopenharmony_ci    }
31147c9fbaeSopenharmony_ci    if (needSysReset != 0 && findModule != 0) {
31247c9fbaeSopenharmony_ci        RebootSystem();
31347c9fbaeSopenharmony_ci    }
31447c9fbaeSopenharmony_ci
31547c9fbaeSopenharmony_ci    return 0;
31647c9fbaeSopenharmony_ci}
31747c9fbaeSopenharmony_ci
31847c9fbaeSopenharmony_cistatic void BBoxInit(void)
31947c9fbaeSopenharmony_ci{
32047c9fbaeSopenharmony_ci    int ret = -1;
32147c9fbaeSopenharmony_ci    pthread_t taskId = 0;
32247c9fbaeSopenharmony_ci
32347c9fbaeSopenharmony_ci    if (LOS_BinarySemCreate(1, &g_opsListSem) != LOS_OK) {
32447c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("Create binary semaphore failed!\n");
32547c9fbaeSopenharmony_ci        return;
32647c9fbaeSopenharmony_ci    }
32747c9fbaeSopenharmony_ci    UtilsListInit(&g_opsList);
32847c9fbaeSopenharmony_ci    ret = pthread_create(&taskId, NULL, SaveErrorLog, NULL);
32947c9fbaeSopenharmony_ci    if (ret != 0) {
33047c9fbaeSopenharmony_ci        BBOX_PRINT_ERR("Falied to create SaveErrorLog task, ret: %d\n", ret);
33147c9fbaeSopenharmony_ci    }
33247c9fbaeSopenharmony_ci}
33347c9fbaeSopenharmony_ciCORE_INIT_PRI(BBoxInit, 1);