199ca880aSopenharmony_ci/*** 299ca880aSopenharmony_ci This file is part of eudev, forked from systemd. 399ca880aSopenharmony_ci 499ca880aSopenharmony_ci Copyright 2010 Lennart Poettering 599ca880aSopenharmony_ci 699ca880aSopenharmony_ci systemd is free software; you can redistribute it and/or modify it 799ca880aSopenharmony_ci under the terms of the GNU Lesser General Public License as published by 899ca880aSopenharmony_ci the Free Software Foundation; either version 2.1 of the License, or 999ca880aSopenharmony_ci (at your option) any later version. 1099ca880aSopenharmony_ci 1199ca880aSopenharmony_ci systemd is distributed in the hope that it will be useful, but 1299ca880aSopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1399ca880aSopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1499ca880aSopenharmony_ci Lesser General Public License for more details. 1599ca880aSopenharmony_ci 1699ca880aSopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1799ca880aSopenharmony_ci along with systemd; If not, see <http://www.gnu.org/licenses/>. 1899ca880aSopenharmony_ci***/ 1999ca880aSopenharmony_ci 2099ca880aSopenharmony_ci#pragma once 2199ca880aSopenharmony_ci 2299ca880aSopenharmony_ci#include <stdbool.h> 2399ca880aSopenharmony_ci#include <stdarg.h> 2499ca880aSopenharmony_ci#include <syslog.h> 2599ca880aSopenharmony_ci#include <errno.h> 2699ca880aSopenharmony_ci 2799ca880aSopenharmony_ci#include "macro.h" 2899ca880aSopenharmony_ci 2999ca880aSopenharmony_citypedef enum LogTarget{ 3099ca880aSopenharmony_ci LOG_TARGET_CONSOLE, 3199ca880aSopenharmony_ci LOG_TARGET_CONSOLE_PREFIXED, 3299ca880aSopenharmony_ci LOG_TARGET_KMSG, 3399ca880aSopenharmony_ci LOG_TARGET_JOURNAL, 3499ca880aSopenharmony_ci LOG_TARGET_JOURNAL_OR_KMSG, 3599ca880aSopenharmony_ci LOG_TARGET_SYSLOG, 3699ca880aSopenharmony_ci LOG_TARGET_SYSLOG_OR_KMSG, 3799ca880aSopenharmony_ci LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */ 3899ca880aSopenharmony_ci LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */ 3999ca880aSopenharmony_ci LOG_TARGET_NULL, 4099ca880aSopenharmony_ci _LOG_TARGET_MAX, 4199ca880aSopenharmony_ci _LOG_TARGET_INVALID = -1 4299ca880aSopenharmony_ci} LogTarget; 4399ca880aSopenharmony_ci 4499ca880aSopenharmony_civoid log_set_target(LogTarget target); 4599ca880aSopenharmony_civoid log_set_max_level(int level); 4699ca880aSopenharmony_ciint log_get_max_level(void) _pure_; 4799ca880aSopenharmony_ci 4899ca880aSopenharmony_ciint log_open(void); 4999ca880aSopenharmony_civoid log_close(void); 5099ca880aSopenharmony_ci 5199ca880aSopenharmony_civoid log_close_syslog(void); 5299ca880aSopenharmony_civoid log_close_journal(void); 5399ca880aSopenharmony_civoid log_close_kmsg(void); 5499ca880aSopenharmony_civoid log_close_console(void); 5599ca880aSopenharmony_ci 5699ca880aSopenharmony_ciint log_internal( 5799ca880aSopenharmony_ci int level, 5899ca880aSopenharmony_ci int error, 5999ca880aSopenharmony_ci const char *file, 6099ca880aSopenharmony_ci int line, 6199ca880aSopenharmony_ci const char *func, 6299ca880aSopenharmony_ci const char *format, ...) _printf_(6,7); 6399ca880aSopenharmony_ci 6499ca880aSopenharmony_ciint log_internalv( 6599ca880aSopenharmony_ci int level, 6699ca880aSopenharmony_ci int error, 6799ca880aSopenharmony_ci const char *file, 6899ca880aSopenharmony_ci int line, 6999ca880aSopenharmony_ci const char *func, 7099ca880aSopenharmony_ci const char *format, 7199ca880aSopenharmony_ci va_list ap) _printf_(6,0); 7299ca880aSopenharmony_ci 7399ca880aSopenharmony_ciint log_oom_internal( 7499ca880aSopenharmony_ci const char *file, 7599ca880aSopenharmony_ci int line, 7699ca880aSopenharmony_ci const char *func); 7799ca880aSopenharmony_ci 7899ca880aSopenharmony_ci/* Logging for various assertions */ 7999ca880aSopenharmony_cinoreturn void log_assert_failed( 8099ca880aSopenharmony_ci const char *text, 8199ca880aSopenharmony_ci const char *file, 8299ca880aSopenharmony_ci int line, 8399ca880aSopenharmony_ci const char *func); 8499ca880aSopenharmony_ci 8599ca880aSopenharmony_cinoreturn void log_assert_failed_unreachable( 8699ca880aSopenharmony_ci const char *text, 8799ca880aSopenharmony_ci const char *file, 8899ca880aSopenharmony_ci int line, 8999ca880aSopenharmony_ci const char *func); 9099ca880aSopenharmony_ci 9199ca880aSopenharmony_ci 9299ca880aSopenharmony_ci/* Logging with level */ 9399ca880aSopenharmony_ci#define log_full_errno(level, error, ...) \ 9499ca880aSopenharmony_ci ({ \ 9599ca880aSopenharmony_ci int _l = (level), _e = (error); \ 9699ca880aSopenharmony_ci (log_get_max_level() >= LOG_PRI(_l)) \ 9799ca880aSopenharmony_ci ? log_internal(_l, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \ 9899ca880aSopenharmony_ci : -abs(_e); \ 9999ca880aSopenharmony_ci }) 10099ca880aSopenharmony_ci 10199ca880aSopenharmony_ci#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__) 10299ca880aSopenharmony_ci 10399ca880aSopenharmony_ci/* Normal logging */ 10499ca880aSopenharmony_ci#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__) 10599ca880aSopenharmony_ci#define log_info(...) log_full(LOG_INFO, __VA_ARGS__) 10699ca880aSopenharmony_ci#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__) 10799ca880aSopenharmony_ci#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__) 10899ca880aSopenharmony_ci#define log_error(...) log_full(LOG_ERR, __VA_ARGS__) 10999ca880aSopenharmony_ci#define log_emergency(...) log_full(getpid() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__) 11099ca880aSopenharmony_ci 11199ca880aSopenharmony_ci/* Logging triggered by an errno-like error */ 11299ca880aSopenharmony_ci#define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__) 11399ca880aSopenharmony_ci#define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__) 11499ca880aSopenharmony_ci#define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__) 11599ca880aSopenharmony_ci#define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__) 11699ca880aSopenharmony_ci#define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__) 11799ca880aSopenharmony_ci#define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__) 11899ca880aSopenharmony_ci 11999ca880aSopenharmony_ci#ifdef LOG_TRACE 12099ca880aSopenharmony_ci# define log_trace(...) log_debug(__VA_ARGS__) 12199ca880aSopenharmony_ci#else 12299ca880aSopenharmony_ci# define log_trace(...) do {} while(0) 12399ca880aSopenharmony_ci#endif 12499ca880aSopenharmony_ci 12599ca880aSopenharmony_ci/* This modifies the buffer passed! */ 12699ca880aSopenharmony_ci 12799ca880aSopenharmony_ci#define log_oom() log_oom_internal(__FILE__, __LINE__, __func__) 12899ca880aSopenharmony_ci 12999ca880aSopenharmony_ciconst char *log_target_to_string(LogTarget target) _const_; 13099ca880aSopenharmony_ciLogTarget log_target_from_string(const char *s) _pure_; 131