Annotation of src/usr.bin/ssh/log-server.c, Revision 1.16
1.1 deraadt 1: /*
1.11 deraadt 2: * Author: Tatu Ylonen <ylo@cs.hut.fi>
3: * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4: * All rights reserved
5: * Server-side versions of debug(), log(), etc. These normally send the output
6: * to the system log.
1.14 markus 7: *
1.16 ! deraadt 8: * As far as I am concerned, the code I have written for this software
! 9: * can be used freely for any purpose. Any derived versions of this
! 10: * software must be clearly marked as such, and if the derived work is
! 11: * incompatible with the protocol description in the RFC file, it must be
! 12: * called by a name other than "ssh" or "Secure Shell".
! 13: *
! 14: *
! 15: * Copyright (c) 2000 Markus Friedl. All rights reserved.
! 16: *
! 17: * Redistribution and use in source and binary forms, with or without
! 18: * modification, are permitted provided that the following conditions
! 19: * are met:
! 20: * 1. Redistributions of source code must retain the above copyright
! 21: * notice, this list of conditions and the following disclaimer.
! 22: * 2. Redistributions in binary form must reproduce the above copyright
! 23: * notice, this list of conditions and the following disclaimer in the
! 24: * documentation and/or other materials provided with the distribution.
! 25: *
! 26: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 27: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 28: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 29: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 30: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 31: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 32: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 33: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 34: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 35: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.11 deraadt 36: */
1.1 deraadt 37:
38: #include "includes.h"
1.16 ! deraadt 39: RCSID("$OpenBSD: log-server.c,v 1.15 2000/06/20 01:39:42 markus Exp $");
1.1 deraadt 40:
41: #include <syslog.h>
42: #include "packet.h"
43: #include "xmalloc.h"
44: #include "ssh.h"
45:
1.7 markus 46: static LogLevel log_level = SYSLOG_LEVEL_INFO;
1.1 deraadt 47: static int log_on_stderr = 0;
1.8 markus 48: static int log_facility = LOG_AUTH;
1.1 deraadt 49:
50: /* Initialize the log.
1.10 markus 51: * av0 program name (should be argv[0])
52: * on_stderr print also on stderr
53: * level logging level
54: */
1.1 deraadt 55:
1.14 markus 56: void
1.10 markus 57: log_init(char *av0, LogLevel level, SyslogFacility facility, int on_stderr)
1.1 deraadt 58: {
1.10 markus 59: switch (level) {
60: case SYSLOG_LEVEL_QUIET:
61: case SYSLOG_LEVEL_ERROR:
62: case SYSLOG_LEVEL_FATAL:
63: case SYSLOG_LEVEL_INFO:
64: case SYSLOG_LEVEL_VERBOSE:
65: case SYSLOG_LEVEL_DEBUG:
66: log_level = level;
67: break;
68: default:
69: fprintf(stderr, "Unrecognized internal syslog level code %d\n",
70: (int) level);
71: exit(1);
72: }
73: switch (facility) {
74: case SYSLOG_FACILITY_DAEMON:
75: log_facility = LOG_DAEMON;
76: break;
77: case SYSLOG_FACILITY_USER:
78: log_facility = LOG_USER;
79: break;
80: case SYSLOG_FACILITY_AUTH:
81: log_facility = LOG_AUTH;
82: break;
83: case SYSLOG_FACILITY_LOCAL0:
84: log_facility = LOG_LOCAL0;
85: break;
86: case SYSLOG_FACILITY_LOCAL1:
87: log_facility = LOG_LOCAL1;
88: break;
89: case SYSLOG_FACILITY_LOCAL2:
90: log_facility = LOG_LOCAL2;
91: break;
92: case SYSLOG_FACILITY_LOCAL3:
93: log_facility = LOG_LOCAL3;
94: break;
95: case SYSLOG_FACILITY_LOCAL4:
96: log_facility = LOG_LOCAL4;
97: break;
98: case SYSLOG_FACILITY_LOCAL5:
99: log_facility = LOG_LOCAL5;
100: break;
101: case SYSLOG_FACILITY_LOCAL6:
102: log_facility = LOG_LOCAL6;
103: break;
104: case SYSLOG_FACILITY_LOCAL7:
105: log_facility = LOG_LOCAL7;
106: break;
107: default:
108: fprintf(stderr, "Unrecognized internal syslog facility code %d\n",
109: (int) facility);
110: exit(1);
111: }
112: log_on_stderr = on_stderr;
1.1 deraadt 113: }
114:
1.12 deraadt 115: #define MSGBUFSIZ 1024
1.1 deraadt 116:
1.7 markus 117: void
118: do_log(LogLevel level, const char *fmt, va_list args)
1.1 deraadt 119: {
1.12 deraadt 120: char msgbuf[MSGBUFSIZ];
121: char fmtbuf[MSGBUFSIZ];
1.10 markus 122: char *txt = NULL;
123: int pri = LOG_INFO;
124: extern char *__progname;
125:
126: if (level > log_level)
127: return;
128: switch (level) {
129: case SYSLOG_LEVEL_ERROR:
130: txt = "error";
131: pri = LOG_ERR;
132: break;
133: case SYSLOG_LEVEL_FATAL:
134: txt = "fatal";
135: pri = LOG_ERR;
136: break;
137: case SYSLOG_LEVEL_INFO:
138: case SYSLOG_LEVEL_VERBOSE:
139: pri = LOG_INFO;
140: break;
141: case SYSLOG_LEVEL_DEBUG:
142: txt = "debug";
143: pri = LOG_DEBUG;
144: break;
145: default:
146: txt = "internal error";
147: pri = LOG_ERR;
148: break;
149: }
150: if (txt != NULL) {
151: snprintf(fmtbuf, sizeof(fmtbuf), "%s: %s", txt, fmt);
152: vsnprintf(msgbuf, sizeof(msgbuf), fmtbuf, args);
153: } else {
154: vsnprintf(msgbuf, sizeof(msgbuf), fmt, args);
155: }
1.13 markus 156: if (log_on_stderr) {
1.10 markus 157: fprintf(stderr, "%s\n", msgbuf);
1.13 markus 158: } else {
159: openlog(__progname, LOG_PID, log_facility);
160: syslog(pri, "%.500s", msgbuf);
161: closelog();
162: }
1.1 deraadt 163: }