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@21: * Log a message with the given level terom@21: */ terom@21: void log_msg (enum log_level level, const char *func, const char *format, ...) terom@21: __attribute__ ((format (printf, 3, 4))); 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@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@21: * Log a message with LOG_ERROR, appending the formatted error code terom@21: */ terom@22: void _log_err (enum log_level level, err_t err, const char *func, const char *format, ...) terom@22: __attribute__ ((format (printf, 4, 5))); terom@21: terom@22: void _log_err_info (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@22: #define log_err(err, ...) _log_err(LOG_ERROR, err, __func__, __VA_ARGS__) terom@22: #define log_err_info(err_info, ...) _log_err_info(LOG_ERROR, err_info, __func__, __VA_ARGS__) terom@21: 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@22: #define FATAL_ERR(err_code, ...) do { _log_err(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@22: #define FATAL_ERROR(err_info, ...) do { _log_err_info(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 */