xref: /netbsd/crypto/external/bsd/openssh/dist/log.h (revision cb53afc4)
1*cb53afc4Schristos /*	$NetBSD: log.h,v 1.17 2021/04/19 14:40:15 christos Exp $	*/
2*cb53afc4Schristos /* $OpenBSD: log.h,v 1.33 2021/04/15 16:24:31 markus Exp $ */
3ca32bd8dSchristos 
4ca32bd8dSchristos /*
5ca32bd8dSchristos  * Author: Tatu Ylonen <ylo@cs.hut.fi>
6ca32bd8dSchristos  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
7ca32bd8dSchristos  *                    All rights reserved
8ca32bd8dSchristos  *
9ca32bd8dSchristos  * As far as I am concerned, the code I have written for this software
10ca32bd8dSchristos  * can be used freely for any purpose.  Any derived versions of this
11ca32bd8dSchristos  * software must be clearly marked as such, and if the derived work is
12ca32bd8dSchristos  * incompatible with the protocol description in the RFC file, it must be
13ca32bd8dSchristos  * called by a name other than "ssh" or "Secure Shell".
14ca32bd8dSchristos  */
15ca32bd8dSchristos 
16ca32bd8dSchristos #ifndef SSH_LOG_H
17ca32bd8dSchristos #define SSH_LOG_H
18ca32bd8dSchristos 
193f0e61bfSchristos #include <stdarg.h> /* va_list */
20*cb53afc4Schristos #include "ssherr.h" /* ssh_err() */
213f0e61bfSchristos 
22ca32bd8dSchristos /* Supported syslog facilities and levels. */
23ca32bd8dSchristos typedef enum {
24ca32bd8dSchristos 	SYSLOG_FACILITY_DAEMON,
25ca32bd8dSchristos 	SYSLOG_FACILITY_USER,
26ca32bd8dSchristos 	SYSLOG_FACILITY_AUTH,
27ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL0,
28ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL1,
29ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL2,
30ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL3,
31ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL4,
32ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL5,
33ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL6,
34ca32bd8dSchristos 	SYSLOG_FACILITY_LOCAL7,
35ca32bd8dSchristos 	SYSLOG_FACILITY_NOT_SET = -1
36ca32bd8dSchristos }       SyslogFacility;
37ca32bd8dSchristos 
38ca32bd8dSchristos typedef enum {
39ca32bd8dSchristos 	SYSLOG_LEVEL_QUIET,
40ca32bd8dSchristos 	SYSLOG_LEVEL_FATAL,
41ca32bd8dSchristos 	SYSLOG_LEVEL_ERROR,
42ca32bd8dSchristos 	SYSLOG_LEVEL_INFO,
43ca32bd8dSchristos 	SYSLOG_LEVEL_VERBOSE,
44ca32bd8dSchristos 	SYSLOG_LEVEL_DEBUG1,
45ca32bd8dSchristos 	SYSLOG_LEVEL_DEBUG2,
46ca32bd8dSchristos 	SYSLOG_LEVEL_DEBUG3,
47ca32bd8dSchristos 	SYSLOG_LEVEL_NOT_SET = -1
48ca32bd8dSchristos }       LogLevel;
49ca32bd8dSchristos 
50*cb53afc4Schristos typedef void (log_handler_fn)(LogLevel, int, const char *, void *);
514b46938bSchristos 
528983daf9Schristos void     log_init(const char *, LogLevel, SyslogFacility, int);
530357011aSchristos LogLevel log_level_get(void);
5445a1cd19Schristos int      log_change_level(LogLevel);
5591f119c5Schristos int      log_is_on_stderr(void);
564ec0b1fcSchristos void     log_redirect_stderr_to(const char *);
57c305e046Schristos void	 log_verbose_add(const char *);
58c305e046Schristos void	 log_verbose_reset(void);
59ca32bd8dSchristos 
60ca32bd8dSchristos SyslogFacility	log_facility_number(char *);
61ca32bd8dSchristos const char *	log_facility_name(SyslogFacility);
62ca32bd8dSchristos LogLevel	log_level_number(char *);
63ca32bd8dSchristos const char *	log_level_name(LogLevel);
64ca32bd8dSchristos 
654b46938bSchristos void	 set_log_handler(log_handler_fn *, void *);
66ca32bd8dSchristos void	 cleanup_exit(int) __attribute__((noreturn));
67c305e046Schristos 
68c305e046Schristos void	 sshlog(const char *, const char *, int, int,
69c305e046Schristos     LogLevel, const char *, const char *, ...)
70c305e046Schristos     __attribute__((format(printf, 7, 8)));
71c305e046Schristos void	 sshlogv(const char *, const char *, int, int,
72c305e046Schristos     LogLevel, const char *, const char *, va_list);
73c305e046Schristos void	 sshsigdie(const char *, const char *, int, int,
74c305e046Schristos     LogLevel, const char *, const char *, ...) __attribute__((noreturn))
75c305e046Schristos     __attribute__((format(printf, 7, 8)));
76c305e046Schristos void	 sshlogdie(const char *, const char *, int, int,
77c305e046Schristos     LogLevel, const char *, const char *, ...) __attribute__((noreturn))
78c305e046Schristos     __attribute__((format(printf, 7, 8)));
79c305e046Schristos void	 sshfatal(const char *, const char *, int, int,
80c305e046Schristos     LogLevel, const char *, const char *, ...) __attribute__((noreturn))
81c305e046Schristos     __attribute__((format(printf, 7, 8)));
82*cb53afc4Schristos void	 sshlogdirect(LogLevel, int, const char *, ...)
83*cb53afc4Schristos     __attribute__((format(printf, 3, 4)));
84c305e046Schristos 
85c305e046Schristos #define do_log2(level, ...)	sshlog(__FILE__, __func__, __LINE__, 0, level, NULL, __VA_ARGS__)
86c305e046Schristos #define debug3(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG3, NULL, __VA_ARGS__)
87c305e046Schristos #define debug2(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG2, NULL, __VA_ARGS__)
88c305e046Schristos #define debug(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG1, NULL, __VA_ARGS__)
89c305e046Schristos #define verbose(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_VERBOSE, NULL, __VA_ARGS__)
90c305e046Schristos #define logit(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_INFO, NULL, __VA_ARGS__)
91c305e046Schristos #define error(...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
92c305e046Schristos #define fatal(...)		sshfatal(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_FATAL, NULL, __VA_ARGS__)
93c305e046Schristos #define logdie(...)		sshlogdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
94c305e046Schristos #define sigdie(...)		sshsigdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
95c305e046Schristos 
96c305e046Schristos /* Variants that prepend the caller's function */
97c305e046Schristos #define do_log2_f(level, ...)	sshlog(__FILE__, __func__, __LINE__, 1, level, NULL, __VA_ARGS__)
98c305e046Schristos #define debug3_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG3, NULL, __VA_ARGS__)
99c305e046Schristos #define debug2_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG2, NULL, __VA_ARGS__)
100c305e046Schristos #define debug_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG1, NULL, __VA_ARGS__)
101c305e046Schristos #define verbose_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_VERBOSE, NULL, __VA_ARGS__)
102c305e046Schristos #define logit_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_INFO, NULL, __VA_ARGS__)
103c305e046Schristos #define error_f(...)		sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
104c305e046Schristos #define fatal_f(...)		sshfatal(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_FATAL, NULL, __VA_ARGS__)
105c305e046Schristos #define logdie_f(...)		sshlogdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
106c305e046Schristos #define sigdie_f(...)		sshsigdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, NULL, __VA_ARGS__)
107c305e046Schristos 
108c305e046Schristos /* Variants that appends a ssh_err message */
109c305e046Schristos #define do_log2_r(r, level, ...) sshlog(__FILE__, __func__, __LINE__, 0, level, ssh_err(r), __VA_ARGS__)
110c305e046Schristos #define debug3_r(r, ...)	sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG3, ssh_err(r), __VA_ARGS__)
111c305e046Schristos #define debug2_r(r, ...)	sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG2, ssh_err(r), __VA_ARGS__)
112c305e046Schristos #define debug_r(r, ...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG1, ssh_err(r), __VA_ARGS__)
113c305e046Schristos #define verbose_r(r, ...)	sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_VERBOSE, ssh_err(r), __VA_ARGS__)
114c305e046Schristos #define logit_r(r, ...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_INFO, ssh_err(r), __VA_ARGS__)
115c305e046Schristos #define error_r(r, ...)		sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
116c305e046Schristos #define fatal_r(r, ...)		sshfatal(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_FATAL, ssh_err(r), __VA_ARGS__)
117c305e046Schristos #define logdie_r(r, ...)	sshlogdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
118c305e046Schristos #define sigdie_r(r, ...)	sshsigdie(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
119c305e046Schristos #define do_log2_fr(r, level, ...) sshlog(__FILE__, __func__, __LINE__, 1, level, ssh_err(r), __VA_ARGS__)
120c305e046Schristos #define debug3_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG3, ssh_err(r), __VA_ARGS__)
121c305e046Schristos #define debug2_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG2, ssh_err(r), __VA_ARGS__)
122c305e046Schristos #define debug_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_DEBUG1, ssh_err(r), __VA_ARGS__)
123c305e046Schristos #define verbose_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_VERBOSE, ssh_err(r), __VA_ARGS__)
124c305e046Schristos #define logit_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_INFO, ssh_err(r), __VA_ARGS__)
125c305e046Schristos #define error_fr(r, ...)	sshlog(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
126c305e046Schristos #define fatal_fr(r, ...)	sshfatal(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_FATAL, ssh_err(r), __VA_ARGS__)
127c305e046Schristos #define logdie_fr(r, ...)	sshlogdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
128c305e046Schristos #define sigdie_fr(r, ...)	sshsigdie(__FILE__, __func__, __LINE__, 1, SYSLOG_LEVEL_ERROR, ssh_err(r), __VA_ARGS__)
129c305e046Schristos 
130ca32bd8dSchristos #endif
131