diff --git a/services/include/device.h b/services/include/device.h index 73265fe2180936055d1eb8fa5871d7e78bec3132..b129056ebe4f80e3b0f508e9835f8ac658e29303 100644 --- a/services/include/device.h +++ b/services/include/device.h @@ -31,6 +31,7 @@ extern "C" { void MountBasicFs(); void CreateDeviceNode(); int MakeSocketDir(const char *path, mode_t mode); +void CloseStdio(); #ifdef __cplusplus #if __cplusplus diff --git a/services/log/init_log.c b/services/log/init_log.c index aa0307903f2bec7eed6e27430351c216b259dcfa..158d29b03ffa8e1e0ceebf2906db2a5bfb9e6daf 100644 --- a/services/log/init_log.c +++ b/services/log/init_log.c @@ -16,20 +16,15 @@ #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 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" }; @@ -57,8 +52,8 @@ void InitToHiLog(const char *tag, LogLevel logLevel, const char *fmt, ...) } 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; } @@ -68,7 +63,32 @@ void InitToHiLog(const char *tag, LogLevel logLevel, const char *fmt, ...) } #endif -void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int line, const char *fmt, ...) +static int g_fd = -1; +void OpenLogDevice() +{ + int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP); + if (fd >= 0) { + g_fd = fd; + } + return; +} + +void EnableDevKmsg() +{ + /* 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; + } + char *kmsgStatus = "on"; + write(fd, kmsgStatus, strlen(kmsgStatus) + 1); + close(fd); + fd = -1; + return; +} + +void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int line, const char *kLevel, + const char *fmt, ...) { if (logLevel < g_logLevel) { return; @@ -76,34 +96,34 @@ void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int l if (tag == NULL) { return; } - time_t second = time(0); - struct tm *t = localtime(&second); - if (t == NULL) { - printf("time is NULL.\n"); + + 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; } - 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); + 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, tag, LOG_LEVEL_STR[logLevel], tmpFmt) == -1) { + close(g_fd); + g_fd = -1; return; } - if (write(fd, logInfo, strlen(logInfo)) < -1) { - printf("xxxxxxxxxxxxxxx write failed.%d\n", errno); - close(fd); - return; + va_end(vargs); + + if (write(g_fd, logInfo, strlen(logInfo)) < 0) { + close(g_fd); + g_fd = -1; } - close(fd); -#endif + return; } - diff --git a/services/log/init_log.h b/services/log/init_log.h index 8c7e08518d098abadaaf412117b22486ed1fcc61..ce5bbe230866845bd15afcc2defd712bea25b682 100644 --- a/services/log/init_log.h +++ b/services/log/init_log.h @@ -42,7 +42,7 @@ 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__) @@ -54,24 +54,34 @@ typedef enum InitLogLevel { #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 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 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, ...); +#define INIT_LOGD(fmt, ...) InitLog(INIT_LOG_TAG, INIT_DEBUG, (__FILE_NAME__), (__LINE__), \ + "<7>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGI(fmt, ...) InitLog(INIT_LOG_TAG, INIT_INFO, (__FILE_NAME__), (__LINE__), \ + "<6>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGW(fmt, ...) InitLog(INIT_LOG_TAG, INIT_WARN, (__FILE_NAME__), (__LINE__), \ + "<4>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGE(fmt, ...) InitLog(INIT_LOG_TAG, INIT_ERROR, (__FILE_NAME__), (__LINE__), \ + "<3>", fmt"\n", ##__VA_ARGS__) +#define INIT_LOGF(fmt, ...) InitLog(INIT_LOG_TAG, INIT_FATAL, (__FILE_NAME__), (__LINE__), \ + "<3>", fmt"\n", ##__VA_ARGS__) + +#define STARTUP_LOGD(LABEL, fmt, ...) InitLog(LABEL, INIT_DEBUG, (__FILE_NAME__), (__LINE__), \ + "<7>", fmt "\n", ##__VA_ARGS__); +#define STARTUP_LOGI(LABEL, fmt, ...) InitLog(LABEL, INIT_INFO, (__FILE_NAME__), (__LINE__), \ + "<6>", fmt "\n", ##__VA_ARGS__); +#define STARTUP_LOGE(LABEL, fmt, ...) InitLog(LABEL, INIT_ERROR, (__FILE_NAME__), (__LINE__), \ + "<3>", fmt "\n", ##__VA_ARGS__); + +void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int line, const char *kLevel, + const char *fmt, ...); void SetLogLevel(InitLogLevel logLevel); +void OpenLogDevice(); +void EnableDevKmsg(); #endif #define INIT_ERROR_CHECK(ret, statement, format, ...) \ diff --git a/services/src/device.c b/services/src/device.c index fabc880bcf3516bbd90ccc0db78d7ee4e31604d3..d5a01c3421264a62c2669e8901fc4262b73fc806 100644 --- a/services/src/device.c +++ b/services/src/device.c @@ -15,42 +15,49 @@ #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 CloseStdio() +{ + 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() { 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() diff --git a/services/src/main.c b/services/src/main.c index 619eb911cd86810b091f92dec889e090e3563e76..2bce7f3354a6c9c3214e53c919bf169dca5c5f7e 100644 --- a/services/src/main.c +++ b/services/src/main.c @@ -70,6 +70,9 @@ int main(int argc, char * const argv[]) 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