1*ba1276acSMatthew Dillon /* $OpenBSD: log.h,v 1.34 2024/06/27 22:36:44 djm Exp $ */ 218de8d7fSPeter Avalos 318de8d7fSPeter Avalos /* 418de8d7fSPeter Avalos * Author: Tatu Ylonen <ylo@cs.hut.fi> 518de8d7fSPeter Avalos * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 618de8d7fSPeter Avalos * All rights reserved 718de8d7fSPeter Avalos * 818de8d7fSPeter Avalos * As far as I am concerned, the code I have written for this software 918de8d7fSPeter Avalos * can be used freely for any purpose. Any derived versions of this 1018de8d7fSPeter Avalos * software must be clearly marked as such, and if the derived work is 1118de8d7fSPeter Avalos * incompatible with the protocol description in the RFC file, it must be 1218de8d7fSPeter Avalos * called by a name other than "ssh" or "Secure Shell". 1318de8d7fSPeter Avalos */ 1418de8d7fSPeter Avalos 1518de8d7fSPeter Avalos #ifndef SSH_LOG_H 1618de8d7fSPeter Avalos #define SSH_LOG_H 1718de8d7fSPeter Avalos 180cbfa66cSDaniel Fojt #include <stdarg.h> /* va_list */ 1950a69bb5SSascha Wildner #include "ssherr.h" /* ssh_err() */ 200cbfa66cSDaniel Fojt 2118de8d7fSPeter Avalos /* Supported syslog facilities and levels. */ 2218de8d7fSPeter Avalos typedef enum { 2318de8d7fSPeter Avalos SYSLOG_FACILITY_DAEMON, 2418de8d7fSPeter Avalos SYSLOG_FACILITY_USER, 2518de8d7fSPeter Avalos SYSLOG_FACILITY_AUTH, 2618de8d7fSPeter Avalos #ifdef LOG_AUTHPRIV 2718de8d7fSPeter Avalos SYSLOG_FACILITY_AUTHPRIV, 2818de8d7fSPeter Avalos #endif 2918de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL0, 3018de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL1, 3118de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL2, 3218de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL3, 3318de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL4, 3418de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL5, 3518de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL6, 3618de8d7fSPeter Avalos SYSLOG_FACILITY_LOCAL7, 3718de8d7fSPeter Avalos SYSLOG_FACILITY_NOT_SET = -1 3818de8d7fSPeter Avalos } SyslogFacility; 3918de8d7fSPeter Avalos 4018de8d7fSPeter Avalos typedef enum { 4118de8d7fSPeter Avalos SYSLOG_LEVEL_QUIET, 4218de8d7fSPeter Avalos SYSLOG_LEVEL_FATAL, 4318de8d7fSPeter Avalos SYSLOG_LEVEL_ERROR, 4418de8d7fSPeter Avalos SYSLOG_LEVEL_INFO, 4518de8d7fSPeter Avalos SYSLOG_LEVEL_VERBOSE, 4618de8d7fSPeter Avalos SYSLOG_LEVEL_DEBUG1, 4718de8d7fSPeter Avalos SYSLOG_LEVEL_DEBUG2, 4818de8d7fSPeter Avalos SYSLOG_LEVEL_DEBUG3, 4918de8d7fSPeter Avalos SYSLOG_LEVEL_NOT_SET = -1 5018de8d7fSPeter Avalos } LogLevel; 5118de8d7fSPeter Avalos 5250a69bb5SSascha Wildner typedef void (log_handler_fn)(LogLevel, int, const char *, void *); 531c188a7fSPeter Avalos 5450a69bb5SSascha Wildner void log_init(const char *, LogLevel, SyslogFacility, int); 55664f4763Szrj LogLevel log_level_get(void); 56ce74bacaSMatthew Dillon int log_change_level(LogLevel); 5736e94dc5SPeter Avalos int log_is_on_stderr(void); 5836e94dc5SPeter Avalos void log_redirect_stderr_to(const char *); 5950a69bb5SSascha Wildner void log_verbose_add(const char *); 6050a69bb5SSascha Wildner void log_verbose_reset(void); 6118de8d7fSPeter Avalos 6218de8d7fSPeter Avalos SyslogFacility log_facility_number(char *); 6318de8d7fSPeter Avalos const char * log_facility_name(SyslogFacility); 6418de8d7fSPeter Avalos LogLevel log_level_number(char *); 6518de8d7fSPeter Avalos const char * log_level_name(LogLevel); 6618de8d7fSPeter Avalos 671c188a7fSPeter Avalos void set_log_handler(log_handler_fn *, void *); 6818de8d7fSPeter Avalos void cleanup_exit(int) __attribute__((noreturn)); 6950a69bb5SSascha Wildner 7050a69bb5SSascha Wildner void sshlog(const char *, const char *, int, int, 7150a69bb5SSascha Wildner LogLevel, const char *, const char *, ...) 7250a69bb5SSascha Wildner __attribute__((format(printf, 7, 8))); 7350a69bb5SSascha Wildner void sshlogv(const char *, const char *, int, int, 7450a69bb5SSascha Wildner LogLevel, const char *, const char *, va_list); 7550a69bb5SSascha Wildner void sshlogdie(const char *, const char *, int, int, 7650a69bb5SSascha Wildner LogLevel, const char *, const char *, ...) __attribute__((noreturn)) 7750a69bb5SSascha Wildner __attribute__((format(printf, 7, 8))); 7850a69bb5SSascha Wildner void sshfatal(const char *, const char *, int, int, 7950a69bb5SSascha Wildner LogLevel, const char *, const char *, ...) __attribute__((noreturn)) 8050a69bb5SSascha Wildner __attribute__((format(printf, 7, 8))); 8150a69bb5SSascha Wildner void sshlogdirect(LogLevel, int, const char *, ...) 8250a69bb5SSascha Wildner __attribute__((format(printf, 3, 4))); 8350a69bb5SSascha Wildner 8450a69bb5SSascha Wildner #define do_log2(level, ...) sshlog(__FILE__, __func__, __LINE__, 0, level, NULL, __VA_ARGS__) 8550a69bb5SSascha Wildner #define debug3(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG3, NULL, __VA_ARGS__) 8650a69bb5SSascha Wildner #define debug2(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG2, NULL, __VA_ARGS__) 8750a69bb5SSascha Wildner #define debug(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG1, NULL, __VA_ARGS__) 8850a69bb5SSascha Wildner #define verbose(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_VERBOSE, NULL, __VA_ARGS__) 8950a69bb5SSascha Wildner #define logit(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_INFO, NULL, __VA_ARGS__) 9050a69bb5SSascha Wildner #define error(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__) 9150a69bb5SSascha Wildner #define fatal(...) sshfatal(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_FATAL, NULL, __VA_ARGS__) 9250a69bb5SSascha Wildner #define logdie(...) sshlogdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__) 9350a69bb5SSascha Wildner 9450a69bb5SSascha Wildner /* Variants that prepend the caller's function */ 9550a69bb5SSascha Wildner #define do_log2_f(level, ...) sshlog(__FILE__, __func__, __LINE__, 1, level, NULL, __VA_ARGS__) 9650a69bb5SSascha Wildner #define debug3_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG3, NULL, __VA_ARGS__) 9750a69bb5SSascha Wildner #define debug2_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG2, NULL, __VA_ARGS__) 9850a69bb5SSascha Wildner #define debug_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG1, NULL, __VA_ARGS__) 9950a69bb5SSascha Wildner #define verbose_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_VERBOSE, NULL, __VA_ARGS__) 10050a69bb5SSascha Wildner #define logit_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_INFO, NULL, __VA_ARGS__) 10150a69bb5SSascha Wildner #define error_f(...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__) 10250a69bb5SSascha Wildner #define fatal_f(...) sshfatal(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_FATAL, NULL, __VA_ARGS__) 10350a69bb5SSascha Wildner #define logdie_f(...) sshlogdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__) 10450a69bb5SSascha Wildner 10550a69bb5SSascha Wildner /* Variants that appends a ssh_err message */ 10650a69bb5SSascha Wildner #define do_log2_r(r, level, ...) sshlog(__FILE__, __func__, __LINE__, 0, level, ssh_err(r), __VA_ARGS__) 10750a69bb5SSascha Wildner #define debug3_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG3, ssh_err(r), __VA_ARGS__) 10850a69bb5SSascha Wildner #define debug2_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG2, ssh_err(r), __VA_ARGS__) 10950a69bb5SSascha Wildner #define debug_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG1, ssh_err(r), __VA_ARGS__) 11050a69bb5SSascha Wildner #define verbose_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_VERBOSE, ssh_err(r), __VA_ARGS__) 11150a69bb5SSascha Wildner #define logit_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_INFO, ssh_err(r), __VA_ARGS__) 11250a69bb5SSascha Wildner #define error_r(r, ...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__) 11350a69bb5SSascha Wildner #define fatal_r(r, ...) sshfatal(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_FATAL, ssh_err(r), __VA_ARGS__) 11450a69bb5SSascha Wildner #define logdie_r(r, ...) sshlogdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__) 11550a69bb5SSascha Wildner #define do_log2_fr(r, level, ...) sshlog(__FILE__, __func__, __LINE__, 1, level, ssh_err(r), __VA_ARGS__) 11650a69bb5SSascha Wildner #define debug3_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG3, ssh_err(r), __VA_ARGS__) 11750a69bb5SSascha Wildner #define debug2_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG2, ssh_err(r), __VA_ARGS__) 11850a69bb5SSascha Wildner #define debug_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG1, ssh_err(r), __VA_ARGS__) 11950a69bb5SSascha Wildner #define verbose_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_VERBOSE, ssh_err(r), __VA_ARGS__) 12050a69bb5SSascha Wildner #define logit_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_INFO, ssh_err(r), __VA_ARGS__) 12150a69bb5SSascha Wildner #define error_fr(r, ...) sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__) 12250a69bb5SSascha Wildner #define fatal_fr(r, ...) sshfatal(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_FATAL, ssh_err(r), __VA_ARGS__) 12350a69bb5SSascha Wildner #define logdie_fr(r, ...) sshlogdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__) 12450a69bb5SSascha Wildner 12518de8d7fSPeter Avalos #endif 126