162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1+ 262306a36Sopenharmony_ci// Copyright (C) 2022, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org> 362306a36Sopenharmony_ci#include <stdarg.h> 462306a36Sopenharmony_ci#include <stdio.h> 562306a36Sopenharmony_ci#include <string.h> 662306a36Sopenharmony_ci#include <syslog.h> 762306a36Sopenharmony_ci#include "log.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistatic const char *__ident = "unknown"; 1062306a36Sopenharmony_cistatic int __options; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic const char * const loglvl[] = { 1362306a36Sopenharmony_ci [LOG_DEBUG] = "DEBUG", 1462306a36Sopenharmony_ci [LOG_INFO] = "INFO", 1562306a36Sopenharmony_ci [LOG_NOTICE] = "NOTICE", 1662306a36Sopenharmony_ci [LOG_WARNING] = "WARN", 1762306a36Sopenharmony_ci [LOG_ERR] = "ERROR", 1862306a36Sopenharmony_ci [LOG_CRIT] = "CRITICAL", 1962306a36Sopenharmony_ci [LOG_ALERT] = "ALERT", 2062306a36Sopenharmony_ci [LOG_EMERG] = "EMERG", 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciint log_str2level(const char *lvl) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci int i; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci for (i = 0; i < sizeof(loglvl) / sizeof(loglvl[LOG_DEBUG]); i++) 2862306a36Sopenharmony_ci if (!strcmp(lvl, loglvl[i])) 2962306a36Sopenharmony_ci return i; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci return LOG_DEBUG; 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciextern void logit(int level, const char *format, ...) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci va_list args; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci va_start(args, format); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci if (__options & TO_SYSLOG) 4162306a36Sopenharmony_ci vsyslog(level, format, args); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci if (__options & TO_STDERR) 4462306a36Sopenharmony_ci vfprintf(stderr, format, args); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if (__options & TO_STDOUT) 4762306a36Sopenharmony_ci vfprintf(stdout, format, args); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci va_end(args); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ciint log_init(int level, const char *ident, int options) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci if (!options) 5562306a36Sopenharmony_ci return -1; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci if (level > LOG_DEBUG) 5862306a36Sopenharmony_ci return -1; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci if (!ident) 6162306a36Sopenharmony_ci return -1; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci __ident = ident; 6462306a36Sopenharmony_ci __options = options; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (options & TO_SYSLOG) { 6762306a36Sopenharmony_ci openlog(__ident, options | LOG_NDELAY, LOG_USER); 6862306a36Sopenharmony_ci setlogmask(LOG_UPTO(level)); 6962306a36Sopenharmony_ci } 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci return 0; 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_civoid log_exit(void) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci closelog(); 7762306a36Sopenharmony_ci} 78