1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "klog.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <cerrno>
19c29fa5a6Sopenharmony_ci#include <cstdarg>
20c29fa5a6Sopenharmony_ci#include <cstdio>
21c29fa5a6Sopenharmony_ci#include <cstdlib>
22c29fa5a6Sopenharmony_ci#include <cstring>
23c29fa5a6Sopenharmony_ci#include <ctime>
24c29fa5a6Sopenharmony_ci
25c29fa5a6Sopenharmony_ci#include <fcntl.h>
26c29fa5a6Sopenharmony_ci#include <pthread.h>
27c29fa5a6Sopenharmony_ci#include <sys/types.h>
28c29fa5a6Sopenharmony_ci#include <sys/stat.h>
29c29fa5a6Sopenharmony_ci#include <sys/wait.h>
30c29fa5a6Sopenharmony_ci#include <unistd.h>
31c29fa5a6Sopenharmony_ci
32c29fa5a6Sopenharmony_ci#include "hilog/log.h"
33c29fa5a6Sopenharmony_ci#include "securec.h"
34c29fa5a6Sopenharmony_ci
35c29fa5a6Sopenharmony_cinamespace OHOS {
36c29fa5a6Sopenharmony_cinamespace MMI {
37c29fa5a6Sopenharmony_ci#define UNUSED(x) \
38c29fa5a6Sopenharmony_ci    do { \
39c29fa5a6Sopenharmony_ci        (void)(x) \
40c29fa5a6Sopenharmony_ci    } while (0)
41c29fa5a6Sopenharmony_ci
42c29fa5a6Sopenharmony_ci#define UNLIKELY(x) __builtin_expect(!!(x), 0)
43c29fa5a6Sopenharmony_ci
44c29fa5a6Sopenharmony_cistatic int g_fd = -1;
45c29fa5a6Sopenharmony_ci
46c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_LOG_SIZE = 1024;
47c29fa5a6Sopenharmony_ci
48c29fa5a6Sopenharmony_civoid KLogOpenLogDevice(void)
49c29fa5a6Sopenharmony_ci{
50c29fa5a6Sopenharmony_ci#ifdef _CLOEXEC_
51c29fa5a6Sopenharmony_ci    int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP);
52c29fa5a6Sopenharmony_ci#else
53c29fa5a6Sopenharmony_ci    int fd = open("/dev/kmsg", O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP);
54c29fa5a6Sopenharmony_ci#endif
55c29fa5a6Sopenharmony_ci    if (fd >= 0) {
56c29fa5a6Sopenharmony_ci        g_fd = fd;
57c29fa5a6Sopenharmony_ci    }
58c29fa5a6Sopenharmony_ci    return;
59c29fa5a6Sopenharmony_ci}
60c29fa5a6Sopenharmony_ci
61c29fa5a6Sopenharmony_civoid kMsgLog(const char* fileName, int line, const char* kLevel,
62c29fa5a6Sopenharmony_ci    const char* fmt, ...)
63c29fa5a6Sopenharmony_ci{
64c29fa5a6Sopenharmony_ci    if (UNLIKELY(g_fd < 0)) {
65c29fa5a6Sopenharmony_ci        KLogOpenLogDevice();
66c29fa5a6Sopenharmony_ci        if (g_fd < 0) {
67c29fa5a6Sopenharmony_ci            return;
68c29fa5a6Sopenharmony_ci        }
69c29fa5a6Sopenharmony_ci    }
70c29fa5a6Sopenharmony_ci    va_list vargs;
71c29fa5a6Sopenharmony_ci    va_start(vargs, fmt);
72c29fa5a6Sopenharmony_ci    char tmpFmt[MAX_LOG_SIZE];
73c29fa5a6Sopenharmony_ci    if (vsnprintf_s(tmpFmt, MAX_LOG_SIZE, MAX_LOG_SIZE - 1, fmt, vargs) == -1) {
74c29fa5a6Sopenharmony_ci        va_end(vargs);
75c29fa5a6Sopenharmony_ci        close(g_fd);
76c29fa5a6Sopenharmony_ci        g_fd = -1;
77c29fa5a6Sopenharmony_ci        return;
78c29fa5a6Sopenharmony_ci    }
79c29fa5a6Sopenharmony_ci
80c29fa5a6Sopenharmony_ci    char logInfo[MAX_LOG_SIZE];
81c29fa5a6Sopenharmony_ci    if (snprintf_s(logInfo, MAX_LOG_SIZE, MAX_LOG_SIZE - 1,
82c29fa5a6Sopenharmony_ci        "%s[dm=%08X][pid=%d][%s:%d][%s][%s] %s",
83c29fa5a6Sopenharmony_ci        kLevel, 0x0D002800, getpid(), fileName, line, "klog", "info", tmpFmt) == -1) {
84c29fa5a6Sopenharmony_ci        va_end(vargs);
85c29fa5a6Sopenharmony_ci        close(g_fd);
86c29fa5a6Sopenharmony_ci        g_fd = -1;
87c29fa5a6Sopenharmony_ci        return;
88c29fa5a6Sopenharmony_ci    }
89c29fa5a6Sopenharmony_ci    va_end(vargs);
90c29fa5a6Sopenharmony_ci
91c29fa5a6Sopenharmony_ci    if (write(g_fd, logInfo, strlen(logInfo)) < 0) {
92c29fa5a6Sopenharmony_ci        close(g_fd);
93c29fa5a6Sopenharmony_ci        g_fd = -1;
94c29fa5a6Sopenharmony_ci    }
95c29fa5a6Sopenharmony_ci    return;
96c29fa5a6Sopenharmony_ci}
97c29fa5a6Sopenharmony_ci} // namespace MMI
98c29fa5a6Sopenharmony_ci} // namespace OHOS
99