[BACK]Return to log-server.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/log-server.c, Revision 1.2

1.1       deraadt     1: /*
                      2:
                      3: log-server.c
                      4:
                      5: Author: Tatu Ylonen <ylo@cs.hut.fi>
                      6:
                      7: Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
                      8:                    All rights reserved
                      9:
                     10: Created: Mon Mar 20 21:19:30 1995 ylo
                     11:
                     12: Server-side versions of debug(), log(), etc.  These normally send the output
                     13: to the system log.
                     14:
                     15: */
                     16:
                     17: #include "includes.h"
1.2     ! dugsong    18: RCSID("$Id: log-server.c,v 1.1 1999/09/26 20:53:36 deraadt Exp $");
1.1       deraadt    19:
                     20: #include <syslog.h>
                     21: #ifdef NEED_SYS_SYSLOG_H
                     22: #include <sys/syslog.h>
                     23: #endif /* NEED_SYS_SYSLOG_H */
                     24: #include "packet.h"
                     25: #include "xmalloc.h"
                     26: #include "ssh.h"
                     27:
                     28: static int log_debug = 0;
                     29: static int log_quiet = 0;
                     30: static int log_on_stderr = 0;
                     31:
                     32: /* Initialize the log.
                     33:      av0       program name (should be argv[0])
                     34:      on_stderr print also on stderr
                     35:      debug     send debugging messages to system log
                     36:      quiet     don\'t log anything
                     37:      */
                     38:
                     39: void log_init(char *av0, int on_stderr, int debug, int quiet,
                     40:              SyslogFacility facility)
                     41: {
                     42:   int log_facility;
                     43:
                     44:   switch (facility)
                     45:     {
                     46:     case SYSLOG_FACILITY_DAEMON:
                     47:       log_facility = LOG_DAEMON;
                     48:       break;
                     49:     case SYSLOG_FACILITY_USER:
                     50:       log_facility = LOG_USER;
                     51:       break;
                     52:     case SYSLOG_FACILITY_AUTH:
                     53:       log_facility = LOG_AUTH;
                     54:       break;
                     55:     case SYSLOG_FACILITY_LOCAL0:
                     56:       log_facility = LOG_LOCAL0;
                     57:       break;
                     58:     case SYSLOG_FACILITY_LOCAL1:
                     59:       log_facility = LOG_LOCAL1;
                     60:       break;
                     61:     case SYSLOG_FACILITY_LOCAL2:
                     62:       log_facility = LOG_LOCAL2;
                     63:       break;
                     64:     case SYSLOG_FACILITY_LOCAL3:
                     65:       log_facility = LOG_LOCAL3;
                     66:       break;
                     67:     case SYSLOG_FACILITY_LOCAL4:
                     68:       log_facility = LOG_LOCAL4;
                     69:       break;
                     70:     case SYSLOG_FACILITY_LOCAL5:
                     71:       log_facility = LOG_LOCAL5;
                     72:       break;
                     73:     case SYSLOG_FACILITY_LOCAL6:
                     74:       log_facility = LOG_LOCAL6;
                     75:       break;
                     76:     case SYSLOG_FACILITY_LOCAL7:
                     77:       log_facility = LOG_LOCAL7;
                     78:       break;
                     79:     default:
                     80:       fprintf(stderr, "Unrecognized internal syslog facility code %d\n",
                     81:              (int)facility);
                     82:       exit(1);
                     83:     }
                     84:
                     85:   log_debug = debug;
                     86:   log_quiet = quiet;
                     87:   log_on_stderr = on_stderr;
                     88:   closelog(); /* Close any previous log. */
                     89:   openlog(av0, LOG_PID, log_facility);
                     90: }
                     91:
                     92: #define MSGBUFSIZE 1024
                     93:
                     94: #ifdef HAVE_VSNPRINTF
                     95: #define DECL_MSGBUF char msgbuf[MSGBUFSIZE]
                     96: #else
                     97: static char msgbuf[MSGBUFSIZE];
                     98: #define DECL_MSGBUF
                     99: #endif
                    100:
                    101: /* Log this message (information that usually should go to the log). */
                    102:
                    103: void log(const char *fmt, ...)
                    104: {
                    105:   va_list args;
                    106:   DECL_MSGBUF;
                    107:   if (log_quiet)
                    108:     return;
                    109:   va_start(args, fmt);
                    110:   vsnprintf(msgbuf, MSGBUFSIZE, fmt, args);
                    111:   va_end(args);
                    112:   if (log_on_stderr)
                    113:     fprintf(stderr, "log: %s\n", msgbuf);
                    114:   syslog(LOG_INFO, "log: %.500s", msgbuf);
                    115: }
                    116:
                    117: /* Debugging messages that should not be logged during normal operation. */
                    118:
                    119: void debug(const char *fmt, ...)
                    120: {
                    121:   va_list args;
                    122:   DECL_MSGBUF;
                    123:   if (!log_debug || log_quiet)
                    124:     return;
                    125:   va_start(args, fmt);
                    126:   vsnprintf(msgbuf, MSGBUFSIZE, fmt, args);
                    127:   va_end(args);
                    128:   if (log_on_stderr)
                    129:     fprintf(stderr, "debug: %s\n", msgbuf);
                    130:   syslog(LOG_DEBUG, "debug: %.500s", msgbuf);
                    131: }
                    132:
                    133: /* Error messages that should be logged. */
                    134:
                    135: void error(const char *fmt, ...)
                    136: {
                    137:   va_list args;
                    138:   DECL_MSGBUF;
                    139:   if (log_quiet)
                    140:     return;
                    141:   va_start(args, fmt);
                    142:   vsnprintf(msgbuf, MSGBUFSIZE, fmt, args);
                    143:   va_end(args);
                    144:   if (log_on_stderr)
                    145:     fprintf(stderr, "error: %s\n", msgbuf);
                    146:   syslog(LOG_ERR, "error: %.500s", msgbuf);
                    147: }
                    148:
                    149: struct fatal_cleanup
                    150: {
                    151:   struct fatal_cleanup *next;
                    152:   void (*proc)(void *);
                    153:   void *context;
                    154: };
                    155:
                    156: static struct fatal_cleanup *fatal_cleanups = NULL;
                    157:
                    158: /* Registers a cleanup function to be called by fatal() before exiting. */
                    159:
                    160: void fatal_add_cleanup(void (*proc)(void *), void *context)
                    161: {
                    162:   struct fatal_cleanup *cu;
                    163:
                    164:   cu = xmalloc(sizeof(*cu));
                    165:   cu->proc = proc;
                    166:   cu->context = context;
                    167:   cu->next = fatal_cleanups;
                    168:   fatal_cleanups = cu;
                    169: }
                    170:
                    171: /* Removes a cleanup frunction to be called at fatal(). */
                    172:
                    173: void fatal_remove_cleanup(void (*proc)(void *context), void *context)
                    174: {
                    175:   struct fatal_cleanup **cup, *cu;
                    176:
                    177:   for (cup = &fatal_cleanups; *cup; cup = &cu->next)
                    178:     {
                    179:       cu = *cup;
                    180:       if (cu->proc == proc && cu->context == context)
                    181:        {
                    182:          *cup = cu->next;
                    183:          xfree(cu);
                    184:          return;
                    185:        }
                    186:     }
                    187:   fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx\n",
                    188:        (unsigned long)proc, (unsigned long)context);
                    189: }
                    190:
                    191: /* Fatal messages.  This function never returns. */
                    192:
                    193: void fatal(const char *fmt, ...)
                    194: {
                    195:   va_list args;
                    196:   struct fatal_cleanup *cu, *next_cu;
                    197:   static int fatal_called = 0;
                    198: #if defined(KRB4)
                    199:   extern char *ticket;
                    200: #endif /* KRB4 */
                    201:   DECL_MSGBUF;
                    202:
                    203:   if (log_quiet)
                    204:     exit(1);
                    205:   va_start(args, fmt);
                    206:   vsnprintf(msgbuf, MSGBUFSIZE, fmt, args);
                    207:   va_end(args);
                    208:   if (log_on_stderr)
                    209:     fprintf(stderr, "fatal: %s\n", msgbuf);
                    210:   syslog(LOG_ERR, "fatal: %.500s", msgbuf);
                    211:
                    212:   if (fatal_called)
                    213:     exit(1);
                    214:   fatal_called = 1;
                    215:
                    216:   /* Call cleanup functions. */
                    217:   for (cu = fatal_cleanups; cu; cu = next_cu)
                    218:     {
                    219:       next_cu = cu->next;
                    220:       debug("Calling cleanup 0x%lx(0x%lx)",
                    221:            (unsigned long)cu->proc, (unsigned long)cu->context);
                    222:       (*cu->proc)(cu->context);
                    223:     }
                    224: #if defined(KRB4)
                    225:   /* If you forwarded a ticket you get one shot for proper
                    226:      authentication. */
                    227:   /* If tgt was passed unlink file */
                    228:   if (ticket)
                    229:     {
                    230:       if (strcmp(ticket,"none"))
1.2     ! dugsong   231:        unlink(ticket);
1.1       deraadt   232:       else
                    233:        ticket = NULL;
                    234:     }
                    235: #endif /* KRB4 */
                    236:
                    237:   /* If local XAUTHORITY was created, remove it. */
                    238:   if (xauthfile) unlink(xauthfile);
                    239:
                    240:   exit(1);
                    241: }