Bugfix: console配置支持使用/dev/kmsg

console配置支持使用/dev/kmsg:
0: 进程的stdio重定向到/dev/null
1: 进程的stdio重定向到/dev/console
2: 进程的stdio重定向到/dev/kmsg(新增)

Signed-off-by: handyohos <zhangxiaotian@huawei.com>
Change-Id: I758b4eb1c101e61166b410233903603ffce9dd5b
This commit is contained in:
handyohos 2023-08-26 19:21:41 +08:00
parent 2a6bca812d
commit b92c0acbb4
5 changed files with 40 additions and 8 deletions

View File

@ -79,6 +79,7 @@ int InUpdaterMode(void);
int StringReplaceChr(char *strl, char oldChr, char newChr);
int OpenConsole(void);
int OpenKmsg(void);
void TrimTail(char *str, char c);
char *TrimHead(char *str, char c);

View File

@ -53,6 +53,7 @@ extern "C" {
#define SERVICE_ATTR_NOTIFY_STATE 0x1000 // service notify state
#define SERVICE_ATTR_MODULE_UPDATE 0x2000 // module update
#define SERVICE_ATTR_KMSG 0x4000 // kmsg
#define MAX_SERVICE_NAME 32
#define MAX_APL_NAME 32

View File

@ -362,6 +362,9 @@ static int InitServiceProperties(Service *service, const ServiceArgs *pathArgs)
return INIT_ECONSOLE,
"Service error %d %s, failed to open console.", errno, service->name);
}
if ((service->attribute & SERVICE_ATTR_KMSG)) {
OpenKmsg();
}
INIT_ERROR_CHECK(PublishHoldFds(service) == 0,
service->lastErrno = INIT_EHOLDER;

View File

@ -841,6 +841,19 @@ static void ParseOneServiceArgs(const cJSON *curItem, Service *service)
(void)GetCpuArgs(curItem, CPU_CORE_STR_IN_CFG, service);
}
static int SetConsoleValue(Service *service, const char *attrName, int value, int flag)
{
UNUSED(attrName);
UNUSED(flag);
INIT_ERROR_CHECK(service != NULL, return SERVICE_FAILURE, "Set service attr failed! null ptr.");
if (value == 1) {
service->attribute |= SERVICE_ATTR_CONSOLE;
} if (value == 2) {
service->attribute |= SERVICE_ATTR_KMSG;
}
return SERVICE_SUCCESS;
}
int ParseOneService(const cJSON *curItem, Service *service)
{
INIT_CHECK_RETURN_VALUE(curItem != NULL && service != NULL, SERVICE_FAILURE);
@ -866,7 +879,7 @@ int ParseOneService(const cJSON *curItem, Service *service)
INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get critical flag for service %s", service->name);
ret = GetServiceAttr(curItem, service, DISABLED_STR_IN_CFG, SERVICE_ATTR_DISABLED, NULL);
INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get disabled flag for service %s", service->name);
ret = GetServiceAttr(curItem, service, CONSOLE_STR_IN_CFG, SERVICE_ATTR_CONSOLE, NULL);
ret = GetServiceAttr(curItem, service, CONSOLE_STR_IN_CFG, SERVICE_ATTR_CONSOLE, SetConsoleValue);
INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get console for service %s", service->name);
ret = GetServiceAttr(curItem, service, "notify-state", SERVICE_ATTR_NOTIFY_STATE, NULL);
INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get notify-state for service %s", service->name);

View File

@ -593,22 +593,36 @@ static void RedirectStdio(int fd)
}
#endif
int OpenConsole(void)
{
#ifndef __LITEOS_M__
static int OpenStdioDevice(const char *dev)
{
setsid();
WaitForFile("/dev/console", WAIT_MAX_SECOND);
int fd = open("/dev/console", O_RDWR);
WaitForFile(dev, WAIT_MAX_SECOND);
int fd = open(dev, O_RDWR);
if (fd >= 0) {
ioctl(fd, TIOCSCTTY, 0);
RedirectStdio(fd);
close(fd);
if (fd > 2) {
close(fd);
}
} else {
return errno;
}
return 0;
#else
return 0;
}
#endif
int OpenConsole(void)
{
#ifndef __LITEOS_M__
return OpenStdioDevice("/dev/console");
#endif
}
int OpenKmsg(void)
{
#ifndef __LITEOS_M__
return OpenStdioDevice("/dev/kmsg");
#endif
}