terom@21: #ifndef LOG_H terom@21: #define LOG_H terom@21: terom@21: /** @file log.h terom@21: * terom@21: * Local logging functions terom@21: */ terom@21: #include "error.h" terom@21: terom@21: /** terom@21: * Log level definitions terom@21: * terom@21: * XXX: these names conflict with terom@21: */ terom@21: enum log_level { terom@21: LOG_DEBUG, terom@21: LOG_INFO, terom@21: LOG_WARN, terom@21: LOG_ERROR, terom@21: LOG_FATAL, terom@21: }; terom@21: terom@21: /** terom@104: * List of log_level values as strings, NULL-terminated terom@104: */ terom@104: extern const char *log_level_names[]; terom@104: terom@104: /** terom@73: * The default log level terom@73: */ terom@73: #define LOG_LEVEL_DEFAULT LOG_INFO terom@73: terom@73: /** terom@137: * Maximum length of a log message, including terminating NUL terom@21: */ terom@137: #define LOG_MSG_MAX 1024 terom@137: terom@137: /** terom@137: * Log output function, for displaying a line of text, without any trailing newline. terom@137: */ terom@137: typedef void (*log_output_func) (const char *line, void *arg); terom@21: terom@21: /** terom@73: * Set the current log level to filter out messages below the given level terom@73: */ terom@73: void set_log_level (enum log_level level); terom@73: terom@73: /** terom@137: * Set the current log output function, replacing any default or previous value. terom@137: * terom@137: * Pass in func as NULL to revert to the default handler. terom@137: */ terom@137: void log_set_func (log_output_func func, void *arg); terom@137: terom@137: /** terom@137: * Log a message with the given level terom@137: */ terom@137: void log_msg (enum log_level level, const char *func, const char *format, ...) terom@137: __attribute__ ((format (printf, 3, 4))); terom@137: terom@137: /** terom@21: * Shorthand for log_msg terom@21: */ terom@21: #define log_debug(...) log_msg(LOG_DEBUG, __func__, __VA_ARGS__) terom@21: #define log_info(...) log_msg(LOG_INFO, __func__, __VA_ARGS__) terom@21: #define log_warn(...) log_msg(LOG_WARN, __func__, __VA_ARGS__) terom@21: #define log_error(...) log_msg(LOG_ERROR, __func__, __VA_ARGS__) terom@21: #define log_fatal(...) log_msg(LOG_FATAL, __func__, __VA_ARGS__) terom@21: terom@21: /** terom@137: * Log a message with the given level, appending the formatted error code name terom@21: */ terom@139: void _log_err_code (enum log_level level, err_t err, const char *func, const char *format, ...) terom@22: __attribute__ ((format (printf, 4, 5))); terom@21: terom@137: /** terom@137: * Log a message with the given level, appending the formatted error message terom@137: */ terom@139: void _log_err (enum log_level level, struct error_info *err, const char *func, const char *format, ...) terom@22: __attribute__ ((format (printf, 4, 5))); terom@21: terom@118: /** terom@118: * Log using errno. terom@118: */ terom@118: void _log_perr (enum log_level level, const char *func, const char *format, ...) terom@118: __attribute__ ((format (printf, 3, 4))); terom@118: terom@137: /** terom@137: * Shorthand for _log_* terom@139: * terom@139: * XXX: kill log_err_info, add log_err_code terom@137: */ terom@139: #define log_err(err_code, ...) _log_err_code(LOG_ERROR, err_code, __func__, __VA_ARGS__) terom@139: #define log_err_info(err_info, ...) _log_err(LOG_ERROR, err_info, __func__, __VA_ARGS__) terom@137: #define log_perr(...) _log_perr(LOG_ERROR, __func__, __VA_ARGS__) terom@21: terom@139: #define log_warn_err_code(err_code, ...) _log_err_code(LOG_WARN, err_code, __func__, __VA_ARGS__) terom@139: #define log_warn_err(err_info, ...) _log_err(LOG_WARN, err_info, __func__, __VA_ARGS__) terom@139: terom@118: /** terom@21: * log_fatal + exit failure terom@21: */ terom@21: #define FATAL(...) do { log_fatal(__VA_ARGS__); exit(EXIT_FAILURE); } while (0) terom@21: terom@118: /** terom@22: * log_err + exit failure terom@22: */ terom@139: #define FATAL_ERR(err_code, ...) do { _log_err_code(LOG_FATAL, err_code, __func__, __VA_ARGS__); exit(EXIT_FAILURE); } while (0) terom@22: terom@118: /** terom@21: * log_err_info + exit failure terom@21: */ terom@139: #define FATAL_ERROR(err_info, ...) do { _log_err(LOG_FATAL, err_info, __func__, __VA_ARGS__); exit(EXIT_FAILURE); } while (0) terom@21: terom@118: /** terom@118: * log_perr + exit failure terom@118: */ terom@118: #define FATAL_PERROR(...) do { _log_perr(LOG_FATAL, __func__, __VA_ARGS__); exit(EXIT_FAILURE); } while (0) terom@118: terom@21: #endif /* LOG_H */