/* * Copyright (C) 2011 Red Hat, Inc. * * All rights reserved. * * Author: Angus Salkeld * * libqb is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libqb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libqb. If not, see . */ #ifndef _QB_LOG_INT_H_ #define _QB_LOG_INT_H_ #include #include #include #include struct qb_log_target; struct qb_log_target { uint32_t pos; enum qb_log_target_state state; char name[PATH_MAX]; char filename[PATH_MAX]; struct qb_list_head filter_head; int32_t facility; int32_t priority_bump; int32_t file_sync; int32_t debug; int32_t extended; size_t size; char *format; int32_t threaded; void *instance; qb_log_reload_fn reload; qb_log_close_fn close; qb_log_logger_fn logger; qb_log_vlogger_fn vlogger; }; struct qb_log_filter { enum qb_log_filter_conf conf; enum qb_log_filter_type type; char *text; uint8_t high_priority; uint8_t low_priority; uint32_t new_value; struct qb_list_head list; regex_t *regex; }; struct qb_log_record { struct qb_log_callsite *cs; time_t timestamp; char *buffer; struct qb_list_head list; }; #define TIME_STRING_SIZE 64 /** * @internal * @brief Call a log function, handling any extended information marker * * If the string to be passed to the log function contains an extended * information marker, temporarily modify the string to strip the extended * information if appropriate. Special cases: if a marker occurs with nothing * after it, it will always be stripped; if only extended information is * present, stmt will be called only if extended is true. * * @param[in] str Null-terminated log message * @param[in] extended QB_TRUE if extended information should be printed * @param[in] stmt Code block to call log function * * @note Because this is a macro, none of the arguments other than stmt should * have side effects. */ #define qb_do_extended(str, extended, stmt) do { \ char *qb_xc = strchr((str), QB_XC); \ if (qb_xc) { \ if ((qb_xc != (str)) || (extended)) { \ *qb_xc = ((extended) && *(qb_xc + 1))? '|' : '\0'; \ stmt; \ *qb_xc = QB_XC; \ } \ } else { \ stmt; \ } \ } while (0) struct qb_log_target * qb_log_target_alloc(void); void qb_log_target_free(struct qb_log_target *t); struct qb_log_target * qb_log_target_get(int32_t pos); int32_t qb_log_syslog_open(struct qb_log_target *t); int32_t qb_log_stderr_open(struct qb_log_target *t); int32_t qb_log_blackbox_open(struct qb_log_target *t); void qb_log_thread_stop(void); void qb_log_thread_log_post(struct qb_log_callsite *cs, time_t current_time, const char *buffer); void qb_log_thread_log_write(struct qb_log_callsite *cs, time_t current_time, const char *buffer); void qb_log_dcs_init(void); void qb_log_dcs_fini(void); struct qb_log_callsite *qb_log_dcs_get(int32_t *newly_created, const char *function, const char *filename, const char *format, uint8_t priority, uint32_t lineno, uint32_t tags); void qb_log_format_init(void); void qb_log_format_fini(void); const char * qb_log_priority2str(uint8_t priority); size_t qb_vsnprintf_serialize(char *serialize, size_t max_len, const char *fmt, va_list ap); size_t qb_vsnprintf_deserialize(char *string, size_t str_len, const char *buf); void qb_log_target_format_static(int32_t target, const char * format, char *output_buffer); #endif /* _QB_LOG_INT_H_ */