1/*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "rpc_log.h"
17
18#include <stdint.h>
19#include "securec.h"
20
21#define LOG_NAME_MAX_LEN 5
22#define LOG_PRINT_MAX_LEN 256
23
24typedef struct {
25    RpcLogModule mod;
26    char name[LOG_NAME_MAX_LEN];
27} LogInfo;
28
29static LogInfo g_logInfo[RPC_LOG_MODULE_MAX] = {
30    {RPC_LOG_IPC, "IPC"},
31    {RPC_LOG_RPC, "RPC"},
32    {RPC_LOG_SER, "SER"},
33};
34
35static void RpcOutPrint(const char *buf, RpcLogLevel level)
36{
37#ifdef IPCRPC_PRINTF
38    printf("%s\n", buf);
39    return;
40#endif
41    switch (level) {
42        case RPC_LOG_DBG:
43            HILOG_DEBUG(RPC_HILOG_ID, "%{public}s", buf);
44            break;
45        case RPC_LOG_INFO:
46            HILOG_INFO(RPC_HILOG_ID, "%{public}s", buf);
47            break;
48        case RPC_LOG_WARN:
49            HILOG_WARN(RPC_HILOG_ID, "%{public}s", buf);
50            break;
51        case RPC_LOG_ERROR:
52            HILOG_ERROR(RPC_HILOG_ID, "%{public}s", buf);
53            break;
54        default:
55            break;
56    }
57}
58
59void RpcLog(RpcLogModule module, RpcLogLevel level, const char *fmt, ...)
60{
61    int32_t ulPos;
62    char szStr[LOG_PRINT_MAX_LEN] = {0};
63    va_list arg;
64    int32_t ret;
65
66    if (module >= RPC_LOG_MODULE_MAX || level >= RPC_LOG_LEVEL_MAX) {
67        HILOG_ERROR(RPC_HILOG_ID, "rpc log type or module error");
68        return;
69    }
70
71    ret = sprintf_s(szStr, sizeof(szStr), "[%s]", g_logInfo[module].name);
72    if (ret < 0) {
73        HILOG_ERROR(RPC_HILOG_ID, "rpc log error");
74        return;
75    }
76    ulPos = strlen(szStr);
77    (void)memset_s(&arg, sizeof(va_list), 0, sizeof(va_list));
78    va_start(arg, fmt);
79    ret = vsprintf_s(&szStr[ulPos], sizeof(szStr) - ulPos, fmt, arg);
80    va_end(arg);
81    if (ret < 0) {
82        HILOG_ERROR(RPC_HILOG_ID, "rpc log len error");
83        return;
84    }
85    RpcOutPrint(szStr, level);
86
87    return;
88}
89