diff --git a/services/include/device.h b/services/include/device.h index 73265fe2180936055d1eb8fa5871d7e78bec3132..beef68ff448588e6cd95ddfec04ecc422d830d43 100644 --- a/services/include/device.h +++ b/services/include/device.h @@ -28,9 +28,10 @@ extern "C" { #define DEV_RANDOM_MINOR 8 #define DEV_URANDOM_MINOR 9 -void MountBasicFs(); -void CreateDeviceNode(); +void MountBasicFs(void); +void CreateDeviceNode(void); int MakeSocketDir(const char *path, mode_t mode); +void CloseStdio(void); #ifdef __cplusplus #if __cplusplus diff --git a/services/log/init_log.c b/services/log/init_log.c index aa0307903f2bec7eed6e27430351c216b259dcfa..5c5719d9cb27e1bc4ea4c886f8b5073d0bd16f9a 100644 --- a/services/log/init_log.c +++ b/services/log/init_log.c @@ -16,20 +16,19 @@ #include "init_log.h" #include #include -#ifdef OHOS_LITE -#include "hilog/log.h" -#endif #include -#include -#include +#include #include -#include #include "securec.h" -#define UNUSED(x) (void)(x) -#define MAX_FORMAT_SIZE 2048 -#define MAX_LOG_SIZE 2048 +#define UNUSED(x) \ + do { \ + (void)(x) \ + } while (0) + +#define MAX_LOG_SIZE 1024 #define BASE_YEAR 1900 +#define UNLIKELY(x) __builtin_expect(!!(x), 0) static InitLogLevel g_logLevel = INIT_INFO; static const char *LOG_LEVEL_STR[] = { "DEBUG", "INFO", "WARNING", "ERROR", "FATAL" }; @@ -47,63 +46,83 @@ void SetHiLogLevel(LogLevel logLevel) g_hiLogLevel = logLevel; } -void InitToHiLog(const char *tag, LogLevel logLevel, const char *fmt, ...) +void InitToHiLog(LogLevel logLevel, const char *fmt, ...) { if (logLevel < g_hiLogLevel) { return; } - if (tag == NULL) { - tag = "Init"; - } + va_list list; va_start(list, fmt); - char tmpFmt[MAX_FORMAT_SIZE]; - if (vsnprintf_s(tmpFmt, MAX_FORMAT_SIZE, MAX_FORMAT_SIZE - 1, fmt, list) == -1) { + char tmpFmt[MAX_LOG_SIZE]; + if (vsnprintf_s(tmpFmt, MAX_LOG_SIZE, MAX_LOG_SIZE - 1, fmt, list) == -1) { va_end(list); return; } - (void)HiLogPrint(LOG_CORE, logLevel, LOG_DOMAIN, tag, "%{public}s", tmpFmt); + (void)HiLogPrint(LOG_CORE, logLevel, LOG_DOMAIN, INIT_LOG_TAG, "%{public}s", tmpFmt); va_end(list); return; } #endif -void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int line, const char *fmt, ...) +static int g_fd = -1; +void OpenLogDevice(void) { - if (logLevel < g_logLevel) { - return; + int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP); + if (fd >= 0) { + g_fd = fd; } - if (tag == NULL) { + return; +} + +void EnableDevKmsg(void) +{ + /* printk_devkmsg default value is ratelimit, We need to set "on" and remove the restrictions */ + int fd = open("/proc/sys/kernel/printk_devkmsg", O_WRONLY | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP); + if (fd < 0) { return; } - time_t second = time(0); - struct tm *t = localtime(&second); - if (t == NULL) { - printf("time is NULL.\n"); + char *kmsgStatus = "on"; + write(fd, kmsgStatus, strlen(kmsgStatus) + 1); + close(fd); + fd = -1; + return; +} + +void InitLog(InitLogLevel logLevel, const char *fileName, int line, const char *kLevel, + const char *fmt, ...) +{ + if (logLevel < g_logLevel) { return; } - fprintf(stdout, "[%d-%d-%d %d:%d:%d][pid=%d][%s:%d][%s][%s] ", - (t->tm_year + BASE_YEAR), (t->tm_mon + 1), t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, - getpid(), fileName, line, tag, LOG_LEVEL_STR[logLevel]); - va_list list; - va_start(list, fmt); - vfprintf(stdout, fmt, list); - va_end(list); - fflush(stdout); - -#if 0 - int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC | O_APPEND ); - if (fd < 1) { - printf("xxxxxxxxxxxxxxx open failed. %d\n", errno); + if (UNLIKELY(g_fd < 0)) { + OpenLogDevice(); + if (g_fd < 0) { + return; + } + } + va_list vargs; + va_start(vargs, fmt); + char tmpFmt[MAX_LOG_SIZE]; + if (vsnprintf_s(tmpFmt, MAX_LOG_SIZE, MAX_LOG_SIZE - 1, fmt, vargs) == -1) { + close(g_fd); + g_fd = -1; return; } - if (write(fd, logInfo, strlen(logInfo)) < -1) { - printf("xxxxxxxxxxxxxxx write failed.%d\n", errno); - close(fd); + + char logInfo[MAX_LOG_SIZE]; + if (snprintf_s(logInfo, MAX_LOG_SIZE, MAX_LOG_SIZE - 1, "%s[pid=%d][%s:%d][%s][%s] %s", + kLevel, getpid(), fileName, line, INIT_LOG_TAG, LOG_LEVEL_STR[logLevel], tmpFmt) == -1) { + close(g_fd); + g_fd = -1; return; } - close(fd); -#endif -} + va_end(vargs); + if (write(g_fd, logInfo, strlen(logInfo)) < 0) { + close(g_fd); + g_fd = -1; + } + return; +} diff --git a/services/log/init_log.h b/services/log/init_log.h index 8c7e08518d098abadaaf412117b22486ed1fcc61..25f88c72aabb8cc4200006c71e3e0330a2a80a0b 100644 --- a/services/log/init_log.h +++ b/services/log/init_log.h @@ -34,6 +34,10 @@ typedef enum InitLogLevel { INIT_FATAL } InitLogLevel; +#ifdef LABEL +#define INIT_LOG_TAG LABEL +#endif + #ifndef INIT_LOG_TAG #define INIT_LOG_TAG "Init" #endif @@ -42,58 +46,76 @@ typedef enum InitLogLevel { #include "hilog/log.h" #undef LOG_DOMAIN -#define LOG_DOMAIN 0xD000719 +#define LOG_DOMAIN 0xD000719 -#define INIT_LOGD(fmt, ...) InitToHiLog(INIT_LOG_TAG, LOG_DEBUG, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) -#define INIT_LOGI(fmt, ...) InitToHiLog(INIT_LOG_TAG, LOG_INFO, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) -#define INIT_LOGW(fmt, ...) InitToHiLog(INIT_LOG_TAG, LOG_WARN, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) -#define INIT_LOGE(fmt, ...) InitToHiLog(INIT_LOG_TAG, LOG_ERROR, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) -#define INIT_LOGF(fmt, ...) InitToHiLog(INIT_LOG_TAG, LOG_FATAL, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) +#define INIT_LOGD(fmt, ...) InitToHiLog(LOG_DEBUG, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) +#define INIT_LOGI(fmt, ...) InitToHiLog(LOG_INFO, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) +#define INIT_LOGW(fmt, ...) InitToHiLog(LOG_WARN, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) +#define INIT_LOGE(fmt, ...) InitToHiLog(LOG_ERROR, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) +#define INIT_LOGF(fmt, ...) InitToHiLog(LOG_FATAL, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) #define STARTUP_LOGD(LABEL, fmt, ...) InitToHiLog(LABEL, LOG_DEBUG, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) #define STARTUP_LOGI(LABEL, fmt, ...) InitToHiLog(LABEL, LOG_INFO, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) #define STARTUP_LOGE(LABEL, fmt, ...) InitToHiLog(LABEL, LOG_ERROR, "%s : "fmt, (__FUNCTION__), ##__VA_ARGS__) - -void InitToHiLog(const char *tag, LogLevel logLevel, const char *fmt, ...); +void InitToHiLog(LogLevel logLevel, const char *fmt, ...); void SetHiLogLevel(LogLevel logLevel); #else #define __FILE_NAME__ (strrchr((__FILE__), '/') ? strrchr((__FILE__), '/') + 1 : (__FILE__)) -#define INIT_LOGD(fmt, ...) InitLog(INIT_LOG_TAG, INIT_DEBUG, (__FILE_NAME__), (__LINE__), fmt"\n", ##__VA_ARGS__) -#define INIT_LOGI(fmt, ...) InitLog(INIT_LOG_TAG, INIT_INFO, (__FILE_NAME__), (__LINE__), fmt"\n", ##__VA_ARGS__) -#define INIT_LOGW(fmt, ...) InitLog(INIT_LOG_TAG, INIT_WARN, (__FILE_NAME__), (__LINE__), fmt"\n", ##__VA_ARGS__) -#define INIT_LOGE(fmt, ...) InitLog(INIT_LOG_TAG, INIT_ERROR, (__FILE_NAME__), (__LINE__), fmt"\n", ##__VA_ARGS__) -#define INIT_LOGF(fmt, ...) InitLog(INIT_LOG_TAG, INIT_FATAL, (__FILE_NAME__), (__LINE__), fmt"\n", ##__VA_ARGS__) +#define INIT_LOGD(fmt, ...) InitLog(INIT_DEBUG, (__FILE_NAME__), (__LINE__), "<7>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGI(fmt, ...) InitLog(INIT_INFO, (__FILE_NAME__), (__LINE__), "<6>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGW(fmt, ...) InitLog(INIT_WARN, (__FILE_NAME__), (__LINE__), "<4>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGE(fmt, ...) InitLog(INIT_ERROR, (__FILE_NAME__), (__LINE__), "<3>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGF(fmt, ...) InitLog(INIT_FATAL, (__FILE_NAME__), (__LINE__), "<3>", fmt"\n", ##__VA_ARGS__) + +#define STARTUP_LOGD(LABEL, fmt, ...) InitLog(INIT_DEBUG, (__FILE_NAME__), (__LINE__), "<7>", fmt "\n", ##__VA_ARGS__) +#define STARTUP_LOGI(LABEL, fmt, ...) InitLog(INIT_INFO, (__FILE_NAME__), (__LINE__), "<6>", fmt "\n", ##__VA_ARGS__) +#define STARTUP_LOGE(LABEL, fmt, ...) InitLog(INIT_ERROR, (__FILE_NAME__), (__LINE__), "<3>", fmt "\n", ##__VA_ARGS__) -#define STARTUP_LOGD(LABEL, fmt, ...) InitLog(LABEL, INIT_DEBUG, (__FILE_NAME__), (__LINE__), fmt "\n", ##__VA_ARGS__) -#define STARTUP_LOGI(LABEL, fmt, ...) InitLog(LABEL, INIT_INFO, (__FILE_NAME__), (__LINE__), fmt "\n", ##__VA_ARGS__) -#define STARTUP_LOGE(LABEL, fmt, ...) InitLog(LABEL, INIT_ERROR, (__FILE_NAME__), (__LINE__), fmt "\n", ##__VA_ARGS__) -void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int line, const char *fmt, ...); +void InitLog(InitLogLevel logLevel, const char *fileName, int line, const char *kLevel, const char *fmt, ...); void SetLogLevel(InitLogLevel logLevel); +void OpenLogDevice(void); +void EnableDevKmsg(void); #endif -#define INIT_ERROR_CHECK(ret, statement, format, ...) \ - if (!(ret)) { \ - INIT_LOGE(format, ##__VA_ARGS__); \ - statement; \ - } - -#define INIT_CHECK(ret, statement) \ - if (!(ret)) { \ - statement; \ - } - -#define INIT_CHECK_RETURN_VALUE(ret, result) \ - if (!(ret)) { \ - return result; \ - } - -#define INIT_CHECK_ONLY_RETURN(ret) \ - if (!(ret)) { \ - return; \ - } +#define INIT_ERROR_CHECK(ret, statement, format, ...) \ + do { \ + if (!(ret)) { \ + INIT_LOGE(format, ##__VA_ARGS__); \ + statement; \ + } \ + } while (0) + +#define INIT_INFO_CHECK(ret, statement, format, ...) \ + do { \ + if (!(ret)) { \ + INIT_LOGI(format, ##__VA_ARGS__); \ + statement; \ + } \ + } while (0) + +#define INIT_CHECK(ret, statement) \ + do { \ + if (!(ret)) { \ + statement; \ + } \ + } while (0) + +#define INIT_CHECK_RETURN_VALUE(ret, result) \ + do { \ + if (!(ret)) { \ + return result; \ + } \ + } while (0) + +#define INIT_CHECK_ONLY_RETURN(ret) \ + do { \ + if (!(ret)) { \ + return; \ + } \ + } while (0) #ifdef __cplusplus #if __cplusplus diff --git a/services/src/device.c b/services/src/device.c index fabc880bcf3516bbd90ccc0db78d7ee4e31604d3..1c8a864745598be922c1e8d93f64f7af8638dc0b 100644 --- a/services/src/device.c +++ b/services/src/device.c @@ -15,45 +15,52 @@ #include "device.h" #include +#include #include -#include -#include #include #include #include -#include #include "init_log.h" #define DEFAULT_RW_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) #define DEFAULT_NO_AUTHORITY_MODE (S_IWUSR | S_IRUSR) +#define STDERR_HANDLE 2 -void MountBasicFs() +void CloseStdio(void) +{ + int fd = open("/dev/null", O_RDWR | O_CLOEXEC); + if (fd < 0) { + return; + } + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, STDERR_HANDLE); + close(fd); +} + +void MountBasicFs(void) { if (mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755") != 0) { INIT_LOGE("Mount tmpfs failed. %s", strerror(errno)); } -#ifndef __LITEOS__ if (mkdir("/dev/pts", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) { INIT_LOGE("mkdir /dev/pts failed. %s", strerror(errno)); } if (mount("devpts", "/dev/pts", "devpts", 0, NULL) != 0) { INIT_LOGE("Mount devpts failed. %s", strerror(errno)); } -#endif if (mount("proc", "/proc", "proc", 0, "hidepid=2") != 0) { INIT_LOGE("Mount procfs failed. %s", strerror(errno)); } if (mount("sysfs", "/sys", "sysfs", 0, NULL) != 0) { INIT_LOGE("Mount sysfs failed. %s", strerror(errno)); } -#ifndef __LITEOS__ if (mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL) != 0) { INIT_LOGE("Mount selinuxfs failed. %s", strerror(errno)); } -#endif } -void CreateDeviceNode() +void CreateDeviceNode(void) { if (mknod("/dev/kmsg", S_IFCHR | DEFAULT_NO_AUTHORITY_MODE, makedev(MEM_MAJOR, DEV_KMSG_MINOR)) != 0) { INIT_LOGE("Create /dev/kmsg device node failed. %s", strerror(errno)); diff --git a/services/src/main.c b/services/src/main.c index 619eb911cd86810b091f92dec889e090e3563e76..8c027bcd21ab8b261475685dadd9f2774bc81d82 100644 --- a/services/src/main.c +++ b/services/src/main.c @@ -63,13 +63,16 @@ static long TimeDiffMs(const struct timespec* tmBefore, const struct timespec* t } #endif // OHOS_DEBUG -int main(int argc, char * const argv[]) +int main(int argc, char **argv) { #ifndef OHOS_LITE if(setenv("UV_THREADPOOL_SIZE", "1", 1) != 0) { INIT_LOGE("set UV_THREADPOOL_SIZE error : %d.", errno); } + CloseStdio(); + OpenLogDevice(); + #endif #ifdef OHOS_DEBUG struct timespec tmEnter; @@ -90,6 +93,7 @@ int main(int argc, char * const argv[]) // 2. Mount basic filesystem and create common device node. MountBasicFs(); CreateDeviceNode(); + EnableDevKmsg(); MakeSocketDir("/dev/unix/socket/", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); #endif diff --git a/ueventd/BUILD.gn b/ueventd/BUILD.gn index c2dda3cbd76e3b7ba0ab05df57e4e7cc5a4f105b..5d725eff9dc11259cb8dead521bf21f4303553d2 100755 --- a/ueventd/BUILD.gn +++ b/ueventd/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. +# Copyright (c) 2021 Huawei Device 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 diff --git a/ueventd/ueventd_device_handler.c b/ueventd/ueventd_device_handler.c index c7f222687aca9a9de822c242e8f4af5e4e9e329f..bd0dc3d1f0a42c421d252a451d04feb1ad7b9aee 100755 --- a/ueventd/ueventd_device_handler.c +++ b/ueventd/ueventd_device_handler.c @@ -284,7 +284,7 @@ static const char *GetDeviceName(char *sysPath, const char *deviceName) } } } else { - // kernel does not report DEVNAME, which is possible. use base name is syspath instead. + // kernel does not report DEVNAME, which is possible. use base name of syspath instead. devName = basename(sysPath); } return devName;