#ifndef FAILURES_H
#define FAILURES_H
struct ip_addr;
enum fatal_exit_status {
FATAL_LOGOPEN = 80,
FATAL_LOGWRITE = 81,
FATAL_LOGERROR = 82,
FATAL_OUTOFMEM = 83,
FATAL_EXEC = 84,
FATAL_DEFAULT = 89
};
enum log_type {
LOG_TYPE_DEBUG,
LOG_TYPE_INFO,
LOG_TYPE_WARNING,
LOG_TYPE_ERROR,
LOG_TYPE_FATAL,
LOG_TYPE_PANIC,
LOG_TYPE_COUNT,
LOG_TYPE_OPTION
};
struct failure_line {
pid_t pid;
enum log_type log_type;
const char *text;
};
struct failure_context {
enum log_type type;
int exit_status;
const struct tm *timestamp;
};
#define DEFAULT_FAILURE_STAMP_FORMAT "%b %d %H:%M:%S "
typedef void failure_callback_t(const struct failure_context *ctx,
const char *format, va_list args);
extern const char *failure_log_type_prefixes[];
void i_log_type(const struct failure_context *ctx, const char *format, ...)
ATTR_FORMAT(2, 3);
void i_panic(const char *format, ...) ATTR_FORMAT(1, 2) ATTR_NORETURN ATTR_COLD;
void i_fatal(const char *format, ...) ATTR_FORMAT(1, 2) ATTR_NORETURN ATTR_COLD;
void i_error(const char *format, ...) ATTR_FORMAT(1, 2) ATTR_COLD;
void i_warning(const char *format, ...) ATTR_FORMAT(1, 2);
void i_info(const char *format, ...) ATTR_FORMAT(1, 2);
void i_debug(const char *format, ...) ATTR_FORMAT(1, 2);
void i_fatal_status(int status, const char *format, ...)
ATTR_FORMAT(2, 3) ATTR_NORETURN ATTR_COLD;
#ifndef __cplusplus
void i_set_fatal_handler(failure_callback_t *callback ATTR_NORETURN);
#else
void i_set_fatal_handler(failure_callback_t *callback);
#endif
void i_set_error_handler(failure_callback_t *callback);
void i_set_info_handler(failure_callback_t *callback);
void i_set_debug_handler(failure_callback_t *callback);
void i_get_failure_handlers(failure_callback_t **fatal_callback_r,
failure_callback_t **error_callback_r,
failure_callback_t **info_callback_r,
failure_callback_t **debug_callback_r);
void default_fatal_handler(const struct failure_context *ctx,
const char *format, va_list args)
ATTR_NORETURN ATTR_FORMAT(2, 0);
void default_error_handler(const struct failure_context *ctx,
const char *format, va_list args)
ATTR_FORMAT(2, 0);
void i_syslog_fatal_handler(const struct failure_context *ctx,
const char *format, va_list args)
ATTR_NORETURN ATTR_FORMAT(2, 0);
void i_syslog_error_handler(const struct failure_context *ctx,
const char *format, va_list args)
ATTR_FORMAT(2, 0);
void i_set_failure_syslog(const char *ident, int options, int facility);
void i_set_failure_file(const char *path, const char *prefix);
void i_set_failure_internal(void);
void i_set_failure_ignore_errors(bool ignore);
void i_set_info_file(const char *path);
void i_set_debug_file(const char *path);
void i_set_failure_prefix(const char *prefix);
void i_set_failure_timestamp_format(const char *fmt);
void i_set_failure_ip(const struct ip_addr *ip);
void i_set_failure_exit_callback(void (*callback)(int *status));
void failure_exit(int status) ATTR_NORETURN ATTR_COLD;
void i_failure_parse_line(const char *line, struct failure_line *failure);
void failures_deinit(void);
#endif