Annotation of src/usr.bin/ssh/log.c, Revision 1.4
1.1 markus 1: /*
2:
3: Shared versions of debug(), log(), etc.
4:
5: */
6:
7: #include "includes.h"
1.4 ! markus 8: RCSID("$OpenBSD: log.c,v 1.3 1999/11/22 21:02:38 markus Exp $");
1.1 markus 9:
10: #include "ssh.h"
11: #include "xmalloc.h"
12:
13: /* Fatal messages. This function never returns. */
14:
15: void
1.4 ! markus 16: fatal(const char *fmt,...)
1.1 markus 17: {
1.4 ! markus 18: va_list args;
! 19: va_start(args, fmt);
! 20: do_log(SYSLOG_LEVEL_FATAL, fmt, args);
! 21: va_end(args);
! 22: fatal_cleanup();
1.1 markus 23: }
24:
25: /* Error messages that should be logged. */
26:
27: void
1.4 ! markus 28: error(const char *fmt,...)
1.1 markus 29: {
1.4 ! markus 30: va_list args;
! 31: va_start(args, fmt);
! 32: do_log(SYSLOG_LEVEL_ERROR, fmt, args);
! 33: va_end(args);
1.1 markus 34: }
35:
36: /* Log this message (information that usually should go to the log). */
37:
38: void
1.4 ! markus 39: log(const char *fmt,...)
1.1 markus 40: {
1.4 ! markus 41: va_list args;
! 42: va_start(args, fmt);
! 43: do_log(SYSLOG_LEVEL_INFO, fmt, args);
! 44: va_end(args);
1.1 markus 45: }
46:
47: /* More detailed messages (information that does not need to go to the log). */
48:
49: void
1.4 ! markus 50: verbose(const char *fmt,...)
1.1 markus 51: {
1.4 ! markus 52: va_list args;
! 53: va_start(args, fmt);
! 54: do_log(SYSLOG_LEVEL_VERBOSE, fmt, args);
! 55: va_end(args);
1.1 markus 56: }
57:
58: /* Debugging messages that should not be logged during normal operation. */
59:
60: void
1.4 ! markus 61: debug(const char *fmt,...)
1.1 markus 62: {
1.4 ! markus 63: va_list args;
! 64: va_start(args, fmt);
! 65: do_log(SYSLOG_LEVEL_DEBUG, fmt, args);
! 66: va_end(args);
1.1 markus 67: }
68:
69: /* Fatal cleanup */
70:
1.4 ! markus 71: struct fatal_cleanup {
! 72: struct fatal_cleanup *next;
! 73: void (*proc) (void *);
! 74: void *context;
1.1 markus 75: };
76:
77: static struct fatal_cleanup *fatal_cleanups = NULL;
78:
79: /* Registers a cleanup function to be called by fatal() before exiting. */
80:
81: void
1.4 ! markus 82: fatal_add_cleanup(void (*proc) (void *), void *context)
1.1 markus 83: {
1.4 ! markus 84: struct fatal_cleanup *cu;
1.1 markus 85:
1.4 ! markus 86: cu = xmalloc(sizeof(*cu));
! 87: cu->proc = proc;
! 88: cu->context = context;
! 89: cu->next = fatal_cleanups;
! 90: fatal_cleanups = cu;
1.1 markus 91: }
92:
93: /* Removes a cleanup frunction to be called at fatal(). */
94:
95: void
1.4 ! markus 96: fatal_remove_cleanup(void (*proc) (void *context), void *context)
1.1 markus 97: {
1.4 ! markus 98: struct fatal_cleanup **cup, *cu;
! 99:
! 100: for (cup = &fatal_cleanups; *cup; cup = &cu->next) {
! 101: cu = *cup;
! 102: if (cu->proc == proc && cu->context == context) {
! 103: *cup = cu->next;
! 104: xfree(cu);
! 105: return;
! 106: }
1.1 markus 107: }
1.4 ! markus 108: fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx\n",
! 109: (unsigned long) proc, (unsigned long) context);
1.1 markus 110: }
111:
112: /* Cleanup and exit */
113: void
114: fatal_cleanup(void)
115: {
1.4 ! markus 116: struct fatal_cleanup *cu, *next_cu;
! 117: static int called = 0;
1.1 markus 118:
1.4 ! markus 119: if (called)
! 120: exit(255);
! 121: called = 1;
! 122: /* Call cleanup functions. */
! 123: for (cu = fatal_cleanups; cu; cu = next_cu) {
! 124: next_cu = cu->next;
! 125: debug("Calling cleanup 0x%lx(0x%lx)",
! 126: (unsigned long) cu->proc, (unsigned long) cu->context);
! 127: (*cu->proc) (cu->context);
! 128: }
! 129: exit(255);
1.2 markus 130: }
131:
132: /* textual representation of log-facilities/levels */
133:
1.4 ! markus 134: static struct {
! 135: const char *name;
! 136: SyslogFacility val;
! 137: } log_facilities[] = {
! 138: { "DAEMON", SYSLOG_FACILITY_DAEMON },
! 139: { "USER", SYSLOG_FACILITY_USER },
! 140: { "AUTH", SYSLOG_FACILITY_AUTH },
! 141: { "LOCAL0", SYSLOG_FACILITY_LOCAL0 },
! 142: { "LOCAL1", SYSLOG_FACILITY_LOCAL1 },
! 143: { "LOCAL2", SYSLOG_FACILITY_LOCAL2 },
! 144: { "LOCAL3", SYSLOG_FACILITY_LOCAL3 },
! 145: { "LOCAL4", SYSLOG_FACILITY_LOCAL4 },
! 146: { "LOCAL5", SYSLOG_FACILITY_LOCAL5 },
! 147: { "LOCAL6", SYSLOG_FACILITY_LOCAL6 },
! 148: { "LOCAL7", SYSLOG_FACILITY_LOCAL7 },
! 149: { NULL, 0 }
1.2 markus 150: };
151:
1.4 ! markus 152: static struct {
! 153: const char *name;
! 154: LogLevel val;
1.2 markus 155: } log_levels[] =
156: {
1.4 ! markus 157: { "QUIET", SYSLOG_LEVEL_QUIET },
! 158: { "FATAL", SYSLOG_LEVEL_FATAL },
! 159: { "ERROR", SYSLOG_LEVEL_ERROR },
! 160: { "INFO", SYSLOG_LEVEL_INFO },
! 161: { "VERBOSE", SYSLOG_LEVEL_VERBOSE },
! 162: { "DEBUG", SYSLOG_LEVEL_DEBUG },
! 163: { NULL, 0 }
1.2 markus 164: };
165:
166: SyslogFacility
167: log_facility_number(char *name)
168: {
1.4 ! markus 169: int i;
! 170: if (name != NULL)
! 171: for (i = 0; log_facilities[i].name; i++)
! 172: if (strcasecmp(log_facilities[i].name, name) == 0)
! 173: return log_facilities[i].val;
! 174: return (SyslogFacility) - 1;
1.2 markus 175: }
176:
177: LogLevel
178: log_level_number(char *name)
179: {
1.4 ! markus 180: int i;
! 181: if (name != NULL)
! 182: for (i = 0; log_levels[i].name; i++)
! 183: if (strcasecmp(log_levels[i].name, name) == 0)
! 184: return log_levels[i].val;
! 185: return (LogLevel) - 1;
1.1 markus 186: }