zephyr/lib/posix/options/syslog.c

94 lines
1.5 KiB
C

/*
* Copyright (c) 2024, Meta
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <errno.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#undef LOG_ERR
#include <zephyr/posix/syslog.h>
#include <zephyr/sys/printk.h>
static struct k_spinlock syslog_lock;
static uint8_t syslog_mask;
static int syslog_priority_to_zephyr_log_level(int priority)
{
switch (priority) {
case LOG_EMERG:
case LOG_ALERT:
case LOG_CRIT:
case LOG_ERR:
return LOG_LEVEL_ERR;
case LOG_WARNING:
return LOG_LEVEL_WRN;
case LOG_NOTICE:
case LOG_INFO:
return LOG_LEVEL_INF;
case LOG_DEBUG:
return LOG_LEVEL_DBG;
default:
return -EINVAL;
}
}
void closelog(void)
{
}
void openlog(const char *ident, int option, int facility)
{
ARG_UNUSED(ident);
ARG_UNUSED(option);
ARG_UNUSED(facility);
}
void syslog(int priority, const char *format, ...)
{
va_list ap;
va_start(ap, format);
vsyslog(priority, format, ap);
va_end(ap);
}
int setlogmask(int maskpri)
{
int oldpri = -1;
K_SPINLOCK(&syslog_lock) {
oldpri = syslog_mask;
syslog_mask = maskpri;
}
return oldpri;
}
void vsyslog(int priority, const char *format, va_list ap)
{
uint8_t mask = 0;
int level = syslog_priority_to_zephyr_log_level(priority);
if (level < 0) {
/* invalid priority */
return;
}
K_SPINLOCK(&syslog_lock) {
mask = syslog_mask;
}
if ((BIT(level) & mask) == 0) {
/* masked */
return;
}
#if !defined(CONFIG_LOG) || defined(CONFIG_LOG_MODE_MINIMAL)
vprintk(format, ap);
#else
log_generic(level, format, ap);
#endif
}