xref: /freebsd/crypto/openssh/log.c (revision 511b41d2a18c00a5f0db1a67a87ef8d831b19f2a)
1511b41d2SMark Murray /*
2511b41d2SMark Murray  * Shared versions of debug(), log(), etc.
3511b41d2SMark Murray  */
4511b41d2SMark Murray 
5511b41d2SMark Murray #include "includes.h"
6511b41d2SMark Murray RCSID("$OpenBSD: log.c,v 1.7 2000/01/04 00:07:59 markus Exp $");
7511b41d2SMark Murray 
8511b41d2SMark Murray #include "ssh.h"
9511b41d2SMark Murray #include "xmalloc.h"
10511b41d2SMark Murray 
11511b41d2SMark Murray /* Fatal messages.  This function never returns. */
12511b41d2SMark Murray 
13511b41d2SMark Murray void
14511b41d2SMark Murray fatal(const char *fmt,...)
15511b41d2SMark Murray {
16511b41d2SMark Murray 	va_list args;
17511b41d2SMark Murray 	va_start(args, fmt);
18511b41d2SMark Murray 	do_log(SYSLOG_LEVEL_FATAL, fmt, args);
19511b41d2SMark Murray 	va_end(args);
20511b41d2SMark Murray 	fatal_cleanup();
21511b41d2SMark Murray }
22511b41d2SMark Murray 
23511b41d2SMark Murray /* Error messages that should be logged. */
24511b41d2SMark Murray 
25511b41d2SMark Murray void
26511b41d2SMark Murray error(const char *fmt,...)
27511b41d2SMark Murray {
28511b41d2SMark Murray 	va_list args;
29511b41d2SMark Murray 	va_start(args, fmt);
30511b41d2SMark Murray 	do_log(SYSLOG_LEVEL_ERROR, fmt, args);
31511b41d2SMark Murray 	va_end(args);
32511b41d2SMark Murray }
33511b41d2SMark Murray 
34511b41d2SMark Murray /* Log this message (information that usually should go to the log). */
35511b41d2SMark Murray 
36511b41d2SMark Murray void
37511b41d2SMark Murray log(const char *fmt,...)
38511b41d2SMark Murray {
39511b41d2SMark Murray 	va_list args;
40511b41d2SMark Murray 	va_start(args, fmt);
41511b41d2SMark Murray 	do_log(SYSLOG_LEVEL_INFO, fmt, args);
42511b41d2SMark Murray 	va_end(args);
43511b41d2SMark Murray }
44511b41d2SMark Murray 
45511b41d2SMark Murray /* More detailed messages (information that does not need to go to the log). */
46511b41d2SMark Murray 
47511b41d2SMark Murray void
48511b41d2SMark Murray verbose(const char *fmt,...)
49511b41d2SMark Murray {
50511b41d2SMark Murray 	va_list args;
51511b41d2SMark Murray 	va_start(args, fmt);
52511b41d2SMark Murray 	do_log(SYSLOG_LEVEL_VERBOSE, fmt, args);
53511b41d2SMark Murray 	va_end(args);
54511b41d2SMark Murray }
55511b41d2SMark Murray 
56511b41d2SMark Murray /* Debugging messages that should not be logged during normal operation. */
57511b41d2SMark Murray 
58511b41d2SMark Murray void
59511b41d2SMark Murray debug(const char *fmt,...)
60511b41d2SMark Murray {
61511b41d2SMark Murray 	va_list args;
62511b41d2SMark Murray 	va_start(args, fmt);
63511b41d2SMark Murray 	do_log(SYSLOG_LEVEL_DEBUG, fmt, args);
64511b41d2SMark Murray 	va_end(args);
65511b41d2SMark Murray }
66511b41d2SMark Murray 
67511b41d2SMark Murray /* Fatal cleanup */
68511b41d2SMark Murray 
69511b41d2SMark Murray struct fatal_cleanup {
70511b41d2SMark Murray 	struct fatal_cleanup *next;
71511b41d2SMark Murray 	void (*proc) (void *);
72511b41d2SMark Murray 	void *context;
73511b41d2SMark Murray };
74511b41d2SMark Murray 
75511b41d2SMark Murray static struct fatal_cleanup *fatal_cleanups = NULL;
76511b41d2SMark Murray 
77511b41d2SMark Murray /* Registers a cleanup function to be called by fatal() before exiting. */
78511b41d2SMark Murray 
79511b41d2SMark Murray void
80511b41d2SMark Murray fatal_add_cleanup(void (*proc) (void *), void *context)
81511b41d2SMark Murray {
82511b41d2SMark Murray 	struct fatal_cleanup *cu;
83511b41d2SMark Murray 
84511b41d2SMark Murray 	cu = xmalloc(sizeof(*cu));
85511b41d2SMark Murray 	cu->proc = proc;
86511b41d2SMark Murray 	cu->context = context;
87511b41d2SMark Murray 	cu->next = fatal_cleanups;
88511b41d2SMark Murray 	fatal_cleanups = cu;
89511b41d2SMark Murray }
90511b41d2SMark Murray 
91511b41d2SMark Murray /* Removes a cleanup frunction to be called at fatal(). */
92511b41d2SMark Murray 
93511b41d2SMark Murray void
94511b41d2SMark Murray fatal_remove_cleanup(void (*proc) (void *context), void *context)
95511b41d2SMark Murray {
96511b41d2SMark Murray 	struct fatal_cleanup **cup, *cu;
97511b41d2SMark Murray 
98511b41d2SMark Murray 	for (cup = &fatal_cleanups; *cup; cup = &cu->next) {
99511b41d2SMark Murray 		cu = *cup;
100511b41d2SMark Murray 		if (cu->proc == proc && cu->context == context) {
101511b41d2SMark Murray 			*cup = cu->next;
102511b41d2SMark Murray 			xfree(cu);
103511b41d2SMark Murray 			return;
104511b41d2SMark Murray 		}
105511b41d2SMark Murray 	}
106511b41d2SMark Murray 	fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx\n",
107511b41d2SMark Murray 	      (unsigned long) proc, (unsigned long) context);
108511b41d2SMark Murray }
109511b41d2SMark Murray 
110511b41d2SMark Murray /* Cleanup and exit */
111511b41d2SMark Murray void
112511b41d2SMark Murray fatal_cleanup(void)
113511b41d2SMark Murray {
114511b41d2SMark Murray 	struct fatal_cleanup *cu, *next_cu;
115511b41d2SMark Murray 	static int called = 0;
116511b41d2SMark Murray 
117511b41d2SMark Murray 	if (called)
118511b41d2SMark Murray 		exit(255);
119511b41d2SMark Murray 	called = 1;
120511b41d2SMark Murray 	/* Call cleanup functions. */
121511b41d2SMark Murray 	for (cu = fatal_cleanups; cu; cu = next_cu) {
122511b41d2SMark Murray 		next_cu = cu->next;
123511b41d2SMark Murray 		debug("Calling cleanup 0x%lx(0x%lx)",
124511b41d2SMark Murray 		      (unsigned long) cu->proc, (unsigned long) cu->context);
125511b41d2SMark Murray 		(*cu->proc) (cu->context);
126511b41d2SMark Murray 	}
127511b41d2SMark Murray 	exit(255);
128511b41d2SMark Murray }
129511b41d2SMark Murray 
130511b41d2SMark Murray /* textual representation of log-facilities/levels */
131511b41d2SMark Murray 
132511b41d2SMark Murray static struct {
133511b41d2SMark Murray 	const char *name;
134511b41d2SMark Murray 	SyslogFacility val;
135511b41d2SMark Murray } log_facilities[] = {
136511b41d2SMark Murray 	{ "DAEMON",	SYSLOG_FACILITY_DAEMON },
137511b41d2SMark Murray 	{ "USER",	SYSLOG_FACILITY_USER },
138511b41d2SMark Murray 	{ "AUTH",	SYSLOG_FACILITY_AUTH },
139511b41d2SMark Murray 	{ "LOCAL0",	SYSLOG_FACILITY_LOCAL0 },
140511b41d2SMark Murray 	{ "LOCAL1",	SYSLOG_FACILITY_LOCAL1 },
141511b41d2SMark Murray 	{ "LOCAL2",	SYSLOG_FACILITY_LOCAL2 },
142511b41d2SMark Murray 	{ "LOCAL3",	SYSLOG_FACILITY_LOCAL3 },
143511b41d2SMark Murray 	{ "LOCAL4",	SYSLOG_FACILITY_LOCAL4 },
144511b41d2SMark Murray 	{ "LOCAL5",	SYSLOG_FACILITY_LOCAL5 },
145511b41d2SMark Murray 	{ "LOCAL6",	SYSLOG_FACILITY_LOCAL6 },
146511b41d2SMark Murray 	{ "LOCAL7",	SYSLOG_FACILITY_LOCAL7 },
147511b41d2SMark Murray 	{ NULL, 0 }
148511b41d2SMark Murray };
149511b41d2SMark Murray 
150511b41d2SMark Murray static struct {
151511b41d2SMark Murray 	const char *name;
152511b41d2SMark Murray 	LogLevel val;
153511b41d2SMark Murray } log_levels[] =
154511b41d2SMark Murray {
155511b41d2SMark Murray 	{ "QUIET",	SYSLOG_LEVEL_QUIET },
156511b41d2SMark Murray 	{ "FATAL",	SYSLOG_LEVEL_FATAL },
157511b41d2SMark Murray 	{ "ERROR",	SYSLOG_LEVEL_ERROR },
158511b41d2SMark Murray 	{ "INFO",	SYSLOG_LEVEL_INFO },
159511b41d2SMark Murray 	{ "VERBOSE",	SYSLOG_LEVEL_VERBOSE },
160511b41d2SMark Murray 	{ "DEBUG",	SYSLOG_LEVEL_DEBUG },
161511b41d2SMark Murray 	{ NULL, 0 }
162511b41d2SMark Murray };
163511b41d2SMark Murray 
164511b41d2SMark Murray SyslogFacility
165511b41d2SMark Murray log_facility_number(char *name)
166511b41d2SMark Murray {
167511b41d2SMark Murray 	int i;
168511b41d2SMark Murray 	if (name != NULL)
169511b41d2SMark Murray 		for (i = 0; log_facilities[i].name; i++)
170511b41d2SMark Murray 			if (strcasecmp(log_facilities[i].name, name) == 0)
171511b41d2SMark Murray 				return log_facilities[i].val;
172511b41d2SMark Murray 	return (SyslogFacility) - 1;
173511b41d2SMark Murray }
174511b41d2SMark Murray 
175511b41d2SMark Murray LogLevel
176511b41d2SMark Murray log_level_number(char *name)
177511b41d2SMark Murray {
178511b41d2SMark Murray 	int i;
179511b41d2SMark Murray 	if (name != NULL)
180511b41d2SMark Murray 		for (i = 0; log_levels[i].name; i++)
181511b41d2SMark Murray 			if (strcasecmp(log_levels[i].name, name) == 0)
182511b41d2SMark Murray 				return log_levels[i].val;
183511b41d2SMark Murray 	return (LogLevel) - 1;
184511b41d2SMark Murray }
185