17c478bd9Sstevel@tonic-gate /*
2*159d09a2SMark Phalan * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3*159d09a2SMark Phalan * Use is subject to license terms.
4*159d09a2SMark Phalan */
5*159d09a2SMark Phalan
6*159d09a2SMark Phalan /*
77c478bd9Sstevel@tonic-gate * lib/kadm/logger.c
87c478bd9Sstevel@tonic-gate *
97c478bd9Sstevel@tonic-gate * Copyright 1995 by the Massachusetts Institute of Technology.
107c478bd9Sstevel@tonic-gate * All Rights Reserved.
117c478bd9Sstevel@tonic-gate *
127c478bd9Sstevel@tonic-gate * Export of this software from the United States of America may
137c478bd9Sstevel@tonic-gate * require a specific license from the United States Government.
147c478bd9Sstevel@tonic-gate * It is the responsibility of any person or organization contemplating
157c478bd9Sstevel@tonic-gate * export to obtain such a license before exporting.
167c478bd9Sstevel@tonic-gate *
177c478bd9Sstevel@tonic-gate * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
187c478bd9Sstevel@tonic-gate * distribute this software and its documentation for any purpose and
197c478bd9Sstevel@tonic-gate * without fee is hereby granted, provided that the above copyright
207c478bd9Sstevel@tonic-gate * notice appear in all copies and that both that copyright notice and
217c478bd9Sstevel@tonic-gate * this permission notice appear in supporting documentation, and that
227c478bd9Sstevel@tonic-gate * the name of M.I.T. not be used in advertising or publicity pertaining
237c478bd9Sstevel@tonic-gate * to distribution of the software without specific, written prior
24*159d09a2SMark Phalan * permission. Furthermore if you modify this software you must label
25*159d09a2SMark Phalan * your software as modified software and not distribute it in such a
26*159d09a2SMark Phalan * fashion that it might be confused with the original M.I.T. software.
27*159d09a2SMark Phalan * M.I.T. makes no representations about the suitability of
287c478bd9Sstevel@tonic-gate * this software for any purpose. It is provided "as is" without express
297c478bd9Sstevel@tonic-gate * or implied warranty.
307c478bd9Sstevel@tonic-gate *
317c478bd9Sstevel@tonic-gate */
327c478bd9Sstevel@tonic-gate
337c478bd9Sstevel@tonic-gate /* KADM5 wants non-syslog log files to contain syslog-like entries */
347c478bd9Sstevel@tonic-gate #define VERBOSE_LOGS
357c478bd9Sstevel@tonic-gate
367c478bd9Sstevel@tonic-gate /*
377c478bd9Sstevel@tonic-gate * logger.c - Handle logging functions for those who want it.
387c478bd9Sstevel@tonic-gate */
397c478bd9Sstevel@tonic-gate #include "k5-int.h"
407c478bd9Sstevel@tonic-gate #include "adm_proto.h"
417c478bd9Sstevel@tonic-gate #include "com_err.h"
427c478bd9Sstevel@tonic-gate #include <stdio.h>
437c478bd9Sstevel@tonic-gate #include <ctype.h>
44*159d09a2SMark Phalan #include <ctype.h>
45*159d09a2SMark Phalan #ifdef HAVE_SYSLOG_H
467c478bd9Sstevel@tonic-gate #include <syslog.h>
47*159d09a2SMark Phalan #endif /* HAVE_SYSLOG_H */
48*159d09a2SMark Phalan #ifdef HAVE_STDARG_H
497c478bd9Sstevel@tonic-gate #include <stdarg.h>
50*159d09a2SMark Phalan #else /* HAVE_STDARG_H */
51*159d09a2SMark Phalan #include <varargs.h>
52*159d09a2SMark Phalan #endif /* HAVE_STDARG_H */
537c478bd9Sstevel@tonic-gate #include <libintl.h>
54*159d09a2SMark Phalan #include <sys/types.h>
55*159d09a2SMark Phalan #include <sys/stat.h>
567c478bd9Sstevel@tonic-gate
5746736d35Ssemery #define KRB5_KLOG_MAX_ERRMSG_SIZE 2048
587c478bd9Sstevel@tonic-gate #ifndef MAXHOSTNAMELEN
597c478bd9Sstevel@tonic-gate #define MAXHOSTNAMELEN 256
607c478bd9Sstevel@tonic-gate #endif /* MAXHOSTNAMELEN */
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate #define LSPEC_PARSE_ERR_1 1
637c478bd9Sstevel@tonic-gate #define LSPEC_PARSE_ERR_2 2
647c478bd9Sstevel@tonic-gate #define LOG_FILE_ERR 3
657c478bd9Sstevel@tonic-gate #define LOG_DEVICE_ERR 4
667c478bd9Sstevel@tonic-gate #define LOG_UFO_STRING 5
677c478bd9Sstevel@tonic-gate #define LOG_EMERG_STRING 6
687c478bd9Sstevel@tonic-gate #define LOG_ALERT_STRING 7
697c478bd9Sstevel@tonic-gate #define LOG_CRIT_STRING 8
707c478bd9Sstevel@tonic-gate #define LOG_ERR_STRING 9
717c478bd9Sstevel@tonic-gate #define LOG_WARNING_STRING 10
727c478bd9Sstevel@tonic-gate #define LOG_NOTICE_STRING 11
737c478bd9Sstevel@tonic-gate #define LOG_INFO_STRING 12
747c478bd9Sstevel@tonic-gate #define LOG_DEBUG_STRING 13
757c478bd9Sstevel@tonic-gate /* This is to assure that we have at least one match in the syslog stuff */
767c478bd9Sstevel@tonic-gate /*
777c478bd9Sstevel@tonic-gate static const char LSPEC_PARSE_ERR_1[] = "%s: cannot parse <%s>\n";
787c478bd9Sstevel@tonic-gate static const char LSPEC_PARSE_ERR_2[] = "%s: warning - logging entry syntax error\n";
797c478bd9Sstevel@tonic-gate static const char LOG_FILE_ERR[] = "%s: error writing to %s\n";
807c478bd9Sstevel@tonic-gate static const char LOG_DEVICE_ERR[] = "%s: error writing to %s device\n";
817c478bd9Sstevel@tonic-gate static const char LOG_UFO_STRING[] = "???";
827c478bd9Sstevel@tonic-gate static const char LOG_EMERG_STRING[] = "EMERGENCY";
837c478bd9Sstevel@tonic-gate static const char LOG_ALERT_STRING[] = "ALERT";
847c478bd9Sstevel@tonic-gate static const char LOG_CRIT_STRING[] = "CRITICAL";
857c478bd9Sstevel@tonic-gate static const char LOG_ERR_STRING[] = "Error";
867c478bd9Sstevel@tonic-gate static const char LOG_WARNING_STRING[] = "Warning";
877c478bd9Sstevel@tonic-gate static const char LOG_NOTICE_STRING[] = "Notice";
887c478bd9Sstevel@tonic-gate static const char LOG_INFO_STRING[] = "info";
897c478bd9Sstevel@tonic-gate static const char LOG_DEBUG_STRING[] = "debug";
907c478bd9Sstevel@tonic-gate */
917c478bd9Sstevel@tonic-gate
927c478bd9Sstevel@tonic-gate
937c478bd9Sstevel@tonic-gate const char *
krb5_log_error_table(long errorno)947c478bd9Sstevel@tonic-gate krb5_log_error_table(long errorno) {
957c478bd9Sstevel@tonic-gate switch (errorno) {
967c478bd9Sstevel@tonic-gate case LSPEC_PARSE_ERR_1:
977c478bd9Sstevel@tonic-gate return(gettext("%s: cannot parse <%s>\n"));
987c478bd9Sstevel@tonic-gate case LSPEC_PARSE_ERR_2:
997c478bd9Sstevel@tonic-gate return(gettext("%s: warning - logging entry syntax error\n"));
1007c478bd9Sstevel@tonic-gate case LOG_FILE_ERR:
1017c478bd9Sstevel@tonic-gate return(gettext("%s: error writing to %s\n"));
1027c478bd9Sstevel@tonic-gate case LOG_DEVICE_ERR:
1037c478bd9Sstevel@tonic-gate return(gettext("%s: error writing to %s device\n"));
1047c478bd9Sstevel@tonic-gate case LOG_UFO_STRING:
1057c478bd9Sstevel@tonic-gate return(gettext("???"));
1067c478bd9Sstevel@tonic-gate case LOG_EMERG_STRING:
1077c478bd9Sstevel@tonic-gate return(gettext("EMERGENCY"));
1087c478bd9Sstevel@tonic-gate case LOG_ALERT_STRING:
1097c478bd9Sstevel@tonic-gate return(gettext("ALERT"));
1107c478bd9Sstevel@tonic-gate case LOG_CRIT_STRING:
1117c478bd9Sstevel@tonic-gate return(gettext("CRITICAL"));
1127c478bd9Sstevel@tonic-gate case LOG_ERR_STRING:
1137c478bd9Sstevel@tonic-gate return(gettext("Error"));
1147c478bd9Sstevel@tonic-gate case LOG_WARNING_STRING:
1157c478bd9Sstevel@tonic-gate return(gettext("Warning"));
1167c478bd9Sstevel@tonic-gate case LOG_NOTICE_STRING:
1177c478bd9Sstevel@tonic-gate return(gettext("Notice"));
1187c478bd9Sstevel@tonic-gate case LOG_INFO_STRING:
1197c478bd9Sstevel@tonic-gate case LOG_DEBUG_STRING:
1207c478bd9Sstevel@tonic-gate default:
1217c478bd9Sstevel@tonic-gate return(gettext("info"));
1227c478bd9Sstevel@tonic-gate }
1237c478bd9Sstevel@tonic-gate }
1247c478bd9Sstevel@tonic-gate
1257c478bd9Sstevel@tonic-gate /*
1267c478bd9Sstevel@tonic-gate * Output logging.
1277c478bd9Sstevel@tonic-gate *
1287c478bd9Sstevel@tonic-gate * Output logging is now controlled by the configuration file. We can specify
1297c478bd9Sstevel@tonic-gate * the following syntaxes under the [logging]->entity specification.
1307c478bd9Sstevel@tonic-gate * FILE<opentype><pathname>
1317c478bd9Sstevel@tonic-gate * SYSLOG[=<severity>[:<facility>]]
1327c478bd9Sstevel@tonic-gate * STDERR
1337c478bd9Sstevel@tonic-gate * CONSOLE
1347c478bd9Sstevel@tonic-gate * DEVICE=<device-spec>
1357c478bd9Sstevel@tonic-gate *
1367c478bd9Sstevel@tonic-gate * Where:
1377c478bd9Sstevel@tonic-gate * <opentype> is ":" for open/append, "=" for open/create.
1387c478bd9Sstevel@tonic-gate * <pathname> is a valid path name.
1397c478bd9Sstevel@tonic-gate * <severity> is one of: (default = ERR)
1407c478bd9Sstevel@tonic-gate * EMERG
1417c478bd9Sstevel@tonic-gate * ALERT
1427c478bd9Sstevel@tonic-gate * CRIT
1437c478bd9Sstevel@tonic-gate * ERR
1447c478bd9Sstevel@tonic-gate * WARNING
1457c478bd9Sstevel@tonic-gate * NOTICE
1467c478bd9Sstevel@tonic-gate * INFO
1477c478bd9Sstevel@tonic-gate * DEBUG
1487c478bd9Sstevel@tonic-gate * <facility> is one of: (default = AUTH)
1497c478bd9Sstevel@tonic-gate * KERN
1507c478bd9Sstevel@tonic-gate * USER
1517c478bd9Sstevel@tonic-gate * MAIL
1527c478bd9Sstevel@tonic-gate * DAEMON
1537c478bd9Sstevel@tonic-gate * AUTH
1547c478bd9Sstevel@tonic-gate * LPR
1557c478bd9Sstevel@tonic-gate * NEWS
1567c478bd9Sstevel@tonic-gate * UUCP
1577c478bd9Sstevel@tonic-gate * AUDIT
1587c478bd9Sstevel@tonic-gate * CRON
1597c478bd9Sstevel@tonic-gate * LOCAL0..LOCAL7
1607c478bd9Sstevel@tonic-gate * <device-spec> is a valid device specification.
1617c478bd9Sstevel@tonic-gate */
1627c478bd9Sstevel@tonic-gate struct log_entry {
1637c478bd9Sstevel@tonic-gate enum log_type { K_LOG_FILE,
1647c478bd9Sstevel@tonic-gate K_LOG_SYSLOG,
1657c478bd9Sstevel@tonic-gate K_LOG_STDERR,
1667c478bd9Sstevel@tonic-gate K_LOG_CONSOLE,
1677c478bd9Sstevel@tonic-gate K_LOG_DEVICE,
1687c478bd9Sstevel@tonic-gate K_LOG_NONE } log_type;
1697c478bd9Sstevel@tonic-gate krb5_pointer log_2free;
1707c478bd9Sstevel@tonic-gate union log_union {
1717c478bd9Sstevel@tonic-gate struct log_file {
1727c478bd9Sstevel@tonic-gate FILE *lf_filep;
1737c478bd9Sstevel@tonic-gate char *lf_fname;
1747c478bd9Sstevel@tonic-gate char *lf_fopen_mode; /* "a+" or "w" */
1757c478bd9Sstevel@tonic-gate #define K_LOG_DEF_FILE_ROTATE_PERIOD -1 /* never */
1767c478bd9Sstevel@tonic-gate #define K_LOG_DEF_FILE_ROTATE_VERSIONS 0 /* no versions */
1777c478bd9Sstevel@tonic-gate time_t lf_rotate_period;
1787c478bd9Sstevel@tonic-gate time_t lf_last_rotated;
1797c478bd9Sstevel@tonic-gate int lf_rotate_versions;
1807c478bd9Sstevel@tonic-gate } log_file;
1817c478bd9Sstevel@tonic-gate struct log_syslog {
1827c478bd9Sstevel@tonic-gate int ls_facility;
1837c478bd9Sstevel@tonic-gate int ls_severity;
1847c478bd9Sstevel@tonic-gate } log_syslog;
1857c478bd9Sstevel@tonic-gate struct log_device {
1867c478bd9Sstevel@tonic-gate FILE *ld_filep;
1877c478bd9Sstevel@tonic-gate char *ld_devname;
1887c478bd9Sstevel@tonic-gate } log_device;
1897c478bd9Sstevel@tonic-gate } log_union;
1907c478bd9Sstevel@tonic-gate };
1917c478bd9Sstevel@tonic-gate #define lfu_filep log_union.log_file.lf_filep
1927c478bd9Sstevel@tonic-gate #define lfu_fname log_union.log_file.lf_fname
1937c478bd9Sstevel@tonic-gate #define lfu_fopen_mode log_union.log_file.lf_fopen_mode
1947c478bd9Sstevel@tonic-gate #define lfu_rotate_period log_union.log_file.lf_rotate_period
1957c478bd9Sstevel@tonic-gate #define lfu_last_rotated log_union.log_file.lf_last_rotated
1967c478bd9Sstevel@tonic-gate #define lfu_rotate_versions log_union.log_file.lf_rotate_versions
1977c478bd9Sstevel@tonic-gate #define lsu_facility log_union.log_syslog.ls_facility
1987c478bd9Sstevel@tonic-gate #define lsu_severity log_union.log_syslog.ls_severity
1997c478bd9Sstevel@tonic-gate #define ldu_filep log_union.log_device.ld_filep
2007c478bd9Sstevel@tonic-gate #define ldu_devname log_union.log_device.ld_devname
2017c478bd9Sstevel@tonic-gate
2027c478bd9Sstevel@tonic-gate struct log_control {
2037c478bd9Sstevel@tonic-gate struct log_entry *log_entries;
2047c478bd9Sstevel@tonic-gate int log_nentries;
2057c478bd9Sstevel@tonic-gate char *log_whoami;
2067c478bd9Sstevel@tonic-gate char *log_hostname;
2077c478bd9Sstevel@tonic-gate krb5_boolean log_opened;
2087c478bd9Sstevel@tonic-gate };
2097c478bd9Sstevel@tonic-gate
2107c478bd9Sstevel@tonic-gate static struct log_control log_control = {
2117c478bd9Sstevel@tonic-gate (struct log_entry *) NULL,
2127c478bd9Sstevel@tonic-gate 0,
2137c478bd9Sstevel@tonic-gate (char *) NULL,
2147c478bd9Sstevel@tonic-gate (char *) NULL,
2157c478bd9Sstevel@tonic-gate 0
2167c478bd9Sstevel@tonic-gate };
2177c478bd9Sstevel@tonic-gate static struct log_entry def_log_entry;
2187c478bd9Sstevel@tonic-gate
2197c478bd9Sstevel@tonic-gate /*
2207c478bd9Sstevel@tonic-gate * These macros define any special processing that needs to happen for
2217c478bd9Sstevel@tonic-gate * devices. For unix, of course, this is hardly anything.
2227c478bd9Sstevel@tonic-gate */
2237c478bd9Sstevel@tonic-gate #define DEVICE_OPEN(d, m) fopen(d, m)
2247c478bd9Sstevel@tonic-gate #define CONSOLE_OPEN(m) fopen("/dev/console", m)
225*159d09a2SMark Phalan #define DEVICE_PRINT(f, m) ((fprintf(f, "%s\r\n", m) >= 0) ? \
226*159d09a2SMark Phalan (fflush(f), 0) : \
2277c478bd9Sstevel@tonic-gate -1)
2287c478bd9Sstevel@tonic-gate #define DEVICE_CLOSE(d) fclose(d)
2297c478bd9Sstevel@tonic-gate
2307c478bd9Sstevel@tonic-gate
2317c478bd9Sstevel@tonic-gate /*
2327c478bd9Sstevel@tonic-gate * klog_rotate() - roate a log file if we have specified rotation
2337c478bd9Sstevel@tonic-gate * parameters in krb5.conf.
2347c478bd9Sstevel@tonic-gate */
2357c478bd9Sstevel@tonic-gate static void
klog_rotate(struct log_entry * le)2367c478bd9Sstevel@tonic-gate klog_rotate(struct log_entry *le)
2377c478bd9Sstevel@tonic-gate {
2387c478bd9Sstevel@tonic-gate time_t t;
2397c478bd9Sstevel@tonic-gate int i;
2407c478bd9Sstevel@tonic-gate char *name_buf1;
2417c478bd9Sstevel@tonic-gate char *name_buf2;
2427c478bd9Sstevel@tonic-gate char *old_name;
2437c478bd9Sstevel@tonic-gate char *new_name;
2447c478bd9Sstevel@tonic-gate char *tmp;
2457c478bd9Sstevel@tonic-gate FILE *fp;
2467c478bd9Sstevel@tonic-gate int num_vers;
247*159d09a2SMark Phalan mode_t old_umask;
248*159d09a2SMark Phalan
2497c478bd9Sstevel@tonic-gate
2507c478bd9Sstevel@tonic-gate /*
2517c478bd9Sstevel@tonic-gate * By default we don't rotate.
2527c478bd9Sstevel@tonic-gate */
2537c478bd9Sstevel@tonic-gate if (le->lfu_rotate_period == K_LOG_DEF_FILE_ROTATE_PERIOD)
2547c478bd9Sstevel@tonic-gate return;
2557c478bd9Sstevel@tonic-gate
2567c478bd9Sstevel@tonic-gate t = time(0);
2577c478bd9Sstevel@tonic-gate
2587c478bd9Sstevel@tonic-gate if (t >= le->lfu_last_rotated + le->lfu_rotate_period) {
2597c478bd9Sstevel@tonic-gate /*
2607c478bd9Sstevel@tonic-gate * The N log file versions will be renamed X.N-1 X.N-2, ... X.0.
2617c478bd9Sstevel@tonic-gate * So the allocate file name buffers that can the version
2627c478bd9Sstevel@tonic-gate * number extensions.
2637c478bd9Sstevel@tonic-gate * 32 extra bytes is plenty.
2647c478bd9Sstevel@tonic-gate */
2657c478bd9Sstevel@tonic-gate name_buf1 = malloc(strlen(le->lfu_fname) + 32);
2667c478bd9Sstevel@tonic-gate
2677c478bd9Sstevel@tonic-gate if (name_buf1 == NULL)
2687c478bd9Sstevel@tonic-gate return;
2697c478bd9Sstevel@tonic-gate
2707c478bd9Sstevel@tonic-gate name_buf2 = malloc(strlen(le->lfu_fname) + 32);
2717c478bd9Sstevel@tonic-gate
2727c478bd9Sstevel@tonic-gate if (name_buf2 == NULL) {
2737c478bd9Sstevel@tonic-gate free(name_buf1);
2747c478bd9Sstevel@tonic-gate return;
2757c478bd9Sstevel@tonic-gate }
2767c478bd9Sstevel@tonic-gate
2777c478bd9Sstevel@tonic-gate old_name = name_buf1;
2787c478bd9Sstevel@tonic-gate new_name = name_buf2;
2797c478bd9Sstevel@tonic-gate
2807c478bd9Sstevel@tonic-gate /*
2817c478bd9Sstevel@tonic-gate * If there N versions, then the first one has file extension
2827c478bd9Sstevel@tonic-gate * of N-1.
2837c478bd9Sstevel@tonic-gate */
2847c478bd9Sstevel@tonic-gate (void) sprintf(new_name, "%s.%d", le->lfu_fname,
2857c478bd9Sstevel@tonic-gate le->lfu_rotate_versions - 1);
2867c478bd9Sstevel@tonic-gate
2877c478bd9Sstevel@tonic-gate /*
2887c478bd9Sstevel@tonic-gate * Rename file.N-2 to file.N-1, file.N-3 to file.N-2, ...
2897c478bd9Sstevel@tonic-gate * file.0 to file.1
2907c478bd9Sstevel@tonic-gate */
2917c478bd9Sstevel@tonic-gate for (i = le->lfu_rotate_versions - 1; i > 0; i--) {
2927c478bd9Sstevel@tonic-gate (void) sprintf(old_name, "%s.%d", le->lfu_fname, i - 1);
2937c478bd9Sstevel@tonic-gate (void) rename(old_name, new_name);
2947c478bd9Sstevel@tonic-gate
2957c478bd9Sstevel@tonic-gate /*
2967c478bd9Sstevel@tonic-gate * swap old name and new name. This way,
2977c478bd9Sstevel@tonic-gate * on the next iteration, new_name.X
2987c478bd9Sstevel@tonic-gate * becomes new_name.X-1.
2997c478bd9Sstevel@tonic-gate */
3007c478bd9Sstevel@tonic-gate tmp = old_name;
3017c478bd9Sstevel@tonic-gate old_name = new_name;
3027c478bd9Sstevel@tonic-gate new_name = tmp;
3037c478bd9Sstevel@tonic-gate }
3047c478bd9Sstevel@tonic-gate old_name = le->lfu_fname;
3057c478bd9Sstevel@tonic-gate
3067c478bd9Sstevel@tonic-gate (void) rename(old_name, new_name);
3077c478bd9Sstevel@tonic-gate
3087c478bd9Sstevel@tonic-gate /*
3097c478bd9Sstevel@tonic-gate * Even though we don't know yet if the fopen()
3107c478bd9Sstevel@tonic-gate * of the log file will succeed, we mark the log
3117c478bd9Sstevel@tonic-gate * as rotated. This is so we don't repeatably
3127c478bd9Sstevel@tonic-gate * rotate file.N-2 to file.N-1 ... etc without
3137c478bd9Sstevel@tonic-gate * waiting for the rotate period to elapse.
3147c478bd9Sstevel@tonic-gate */
3157c478bd9Sstevel@tonic-gate le->lfu_last_rotated = t;
3167c478bd9Sstevel@tonic-gate
317*159d09a2SMark Phalan /*
318*159d09a2SMark Phalan * Default log file creation mode should be read-only
319*159d09a2SMark Phalan * by owner(root), but the admin can override with
320*159d09a2SMark Phalan * chmod(1) if desired.
321*159d09a2SMark Phalan */
322*159d09a2SMark Phalan
323*159d09a2SMark Phalan old_umask = umask(077);
3247c478bd9Sstevel@tonic-gate fp = fopen(old_name, le->lfu_fopen_mode);
3257c478bd9Sstevel@tonic-gate
326*159d09a2SMark Phalan umask(old_umask);
3277c478bd9Sstevel@tonic-gate
328*159d09a2SMark Phalan if (fp != NULL) {
3297c478bd9Sstevel@tonic-gate
3307c478bd9Sstevel@tonic-gate (void) fclose(le->lfu_filep);
3317c478bd9Sstevel@tonic-gate le->lfu_filep = fp;
3327c478bd9Sstevel@tonic-gate
3337c478bd9Sstevel@tonic-gate /*
3347c478bd9Sstevel@tonic-gate * If the version parameter in krb5.conf was
3357c478bd9Sstevel@tonic-gate * 0, then we take this to mean that rotating the
3367c478bd9Sstevel@tonic-gate * log file will cause us to dispose of the
3377c478bd9Sstevel@tonic-gate * old one, and created a new one. We have just
3387c478bd9Sstevel@tonic-gate * renamed the old one to file.-1, so remove it.
3397c478bd9Sstevel@tonic-gate */
3407c478bd9Sstevel@tonic-gate if (le->lfu_rotate_versions <= 0)
3417c478bd9Sstevel@tonic-gate (void) unlink(new_name);
3427c478bd9Sstevel@tonic-gate
3437c478bd9Sstevel@tonic-gate } else {
3447c478bd9Sstevel@tonic-gate fprintf(stderr,
3457c478bd9Sstevel@tonic-gate gettext("During rotate, couldn't open log file %s: %s\n"),
3467c478bd9Sstevel@tonic-gate old_name, error_message(errno));
3477c478bd9Sstevel@tonic-gate /*
3487c478bd9Sstevel@tonic-gate * Put it back.
3497c478bd9Sstevel@tonic-gate */
3507c478bd9Sstevel@tonic-gate (void) rename(new_name, old_name);
3517c478bd9Sstevel@tonic-gate }
3527c478bd9Sstevel@tonic-gate free(name_buf1);
3537c478bd9Sstevel@tonic-gate free(name_buf2);
3547c478bd9Sstevel@tonic-gate }
3557c478bd9Sstevel@tonic-gate }
3567c478bd9Sstevel@tonic-gate
3577c478bd9Sstevel@tonic-gate /*
3587c478bd9Sstevel@tonic-gate * klog_com_err_proc() - Handle com_err(3) messages as specified by the
3597c478bd9Sstevel@tonic-gate * profile.
3607c478bd9Sstevel@tonic-gate */
361*159d09a2SMark Phalan static krb5_context err_context;
3627c478bd9Sstevel@tonic-gate static void
klog_com_err_proc(const char * whoami,long code,const char * format,va_list ap)363*159d09a2SMark Phalan klog_com_err_proc(const char *whoami, long code, const char *format, va_list ap)
3647c478bd9Sstevel@tonic-gate {
3657c478bd9Sstevel@tonic-gate char outbuf[KRB5_KLOG_MAX_ERRMSG_SIZE];
3667c478bd9Sstevel@tonic-gate int lindex;
367*159d09a2SMark Phalan const char *actual_format;
368*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
3697c478bd9Sstevel@tonic-gate int log_pri = -1;
370*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
3717c478bd9Sstevel@tonic-gate char *cp;
3727c478bd9Sstevel@tonic-gate char *syslogp;
3737c478bd9Sstevel@tonic-gate
3747c478bd9Sstevel@tonic-gate /* Make the header */
3757c478bd9Sstevel@tonic-gate sprintf(outbuf, "%s: ", whoami);
3767c478bd9Sstevel@tonic-gate /*
3777c478bd9Sstevel@tonic-gate * Squirrel away address after header for syslog since syslog makes
3787c478bd9Sstevel@tonic-gate * a header
3797c478bd9Sstevel@tonic-gate */
3807c478bd9Sstevel@tonic-gate syslogp = &outbuf[strlen(outbuf)];
3817c478bd9Sstevel@tonic-gate
3827c478bd9Sstevel@tonic-gate /* If reporting an error message, separate it. */
3837c478bd9Sstevel@tonic-gate if (code) {
384*159d09a2SMark Phalan const char *emsg;
38546736d35Ssemery outbuf[sizeof(outbuf) - 1] = '\0';
38646736d35Ssemery
387*159d09a2SMark Phalan emsg = krb5_get_error_message (err_context, code);
388*159d09a2SMark Phalan strncat(outbuf, emsg, sizeof(outbuf) - 1 - strlen(outbuf));
38946736d35Ssemery strncat(outbuf, " - ", sizeof(outbuf) - 1 - strlen(outbuf));
390*159d09a2SMark Phalan krb5_free_error_message(err_context, emsg);
3917c478bd9Sstevel@tonic-gate }
3927c478bd9Sstevel@tonic-gate cp = &outbuf[strlen(outbuf)];
3937c478bd9Sstevel@tonic-gate
394*159d09a2SMark Phalan actual_format = format;
395*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
3967c478bd9Sstevel@tonic-gate /*
3977c478bd9Sstevel@tonic-gate * This is an unpleasant hack. If the first character is less than
3987c478bd9Sstevel@tonic-gate * 8, then we assume that it is a priority.
3997c478bd9Sstevel@tonic-gate *
4007c478bd9Sstevel@tonic-gate * Since it is not guaranteed that there is a direct mapping between
4017c478bd9Sstevel@tonic-gate * syslog priorities (e.g. Ultrix and old BSD), we resort to this
4027c478bd9Sstevel@tonic-gate * intermediate representation.
4037c478bd9Sstevel@tonic-gate */
4047c478bd9Sstevel@tonic-gate if ((((unsigned char) *format) > 0) && (((unsigned char) *format) <= 8)) {
405*159d09a2SMark Phalan actual_format = (format + 1);
4067c478bd9Sstevel@tonic-gate switch ((unsigned char) *format) {
407*159d09a2SMark Phalan #ifdef LOG_EMERG
4087c478bd9Sstevel@tonic-gate case 1:
4097c478bd9Sstevel@tonic-gate log_pri = LOG_EMERG;
4107c478bd9Sstevel@tonic-gate break;
411*159d09a2SMark Phalan #endif /* LOG_EMERG */
412*159d09a2SMark Phalan #ifdef LOG_ALERT
4137c478bd9Sstevel@tonic-gate case 2:
4147c478bd9Sstevel@tonic-gate log_pri = LOG_ALERT;
4157c478bd9Sstevel@tonic-gate break;
416*159d09a2SMark Phalan #endif /* LOG_ALERT */
417*159d09a2SMark Phalan #ifdef LOG_CRIT
4187c478bd9Sstevel@tonic-gate case 3:
4197c478bd9Sstevel@tonic-gate log_pri = LOG_CRIT;
4207c478bd9Sstevel@tonic-gate break;
421*159d09a2SMark Phalan #endif /* LOG_CRIT */
4227c478bd9Sstevel@tonic-gate default:
4237c478bd9Sstevel@tonic-gate case 4:
4247c478bd9Sstevel@tonic-gate log_pri = LOG_ERR;
4257c478bd9Sstevel@tonic-gate break;
426*159d09a2SMark Phalan #ifdef LOG_WARNING
4277c478bd9Sstevel@tonic-gate case 5:
4287c478bd9Sstevel@tonic-gate log_pri = LOG_WARNING;
4297c478bd9Sstevel@tonic-gate break;
430*159d09a2SMark Phalan #endif /* LOG_WARNING */
431*159d09a2SMark Phalan #ifdef LOG_NOTICE
4327c478bd9Sstevel@tonic-gate case 6:
4337c478bd9Sstevel@tonic-gate log_pri = LOG_NOTICE;
4347c478bd9Sstevel@tonic-gate break;
435*159d09a2SMark Phalan #endif /* LOG_NOTICE */
436*159d09a2SMark Phalan #ifdef LOG_INFO
4377c478bd9Sstevel@tonic-gate case 7:
4387c478bd9Sstevel@tonic-gate log_pri = LOG_INFO;
4397c478bd9Sstevel@tonic-gate break;
440*159d09a2SMark Phalan #endif /* LOG_INFO */
441*159d09a2SMark Phalan #ifdef LOG_DEBUG
4427c478bd9Sstevel@tonic-gate case 8:
4437c478bd9Sstevel@tonic-gate log_pri = LOG_DEBUG;
4447c478bd9Sstevel@tonic-gate break;
445*159d09a2SMark Phalan #endif /* LOG_DEBUG */
4467c478bd9Sstevel@tonic-gate }
4477c478bd9Sstevel@tonic-gate }
448*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
4497c478bd9Sstevel@tonic-gate
4507c478bd9Sstevel@tonic-gate /* Now format the actual message */
451*159d09a2SMark Phalan #if HAVE_VSNPRINTF
45246736d35Ssemery vsnprintf(cp, sizeof(outbuf) - (cp - outbuf), actual_format, ap);
453*159d09a2SMark Phalan #elif HAVE_VSPRINTF
454*159d09a2SMark Phalan vsprintf(cp, actual_format, ap);
455*159d09a2SMark Phalan #else /* HAVE_VSPRINTF */
456*159d09a2SMark Phalan sprintf(cp, actual_format, ((int *) ap)[0], ((int *) ap)[1],
457*159d09a2SMark Phalan ((int *) ap)[2], ((int *) ap)[3],
458*159d09a2SMark Phalan ((int *) ap)[4], ((int *) ap)[5]);
459*159d09a2SMark Phalan #endif /* HAVE_VSPRINTF */
4607c478bd9Sstevel@tonic-gate
4617c478bd9Sstevel@tonic-gate /*
4627c478bd9Sstevel@tonic-gate * Now that we have the message formatted, perform the output to each
4637c478bd9Sstevel@tonic-gate * logging specification.
4647c478bd9Sstevel@tonic-gate */
4657c478bd9Sstevel@tonic-gate for (lindex = 0; lindex < log_control.log_nentries; lindex++) {
4667c478bd9Sstevel@tonic-gate switch (log_control.log_entries[lindex].log_type) {
4677c478bd9Sstevel@tonic-gate case K_LOG_FILE:
4687c478bd9Sstevel@tonic-gate
4697c478bd9Sstevel@tonic-gate klog_rotate(&log_control.log_entries[lindex]);
4707c478bd9Sstevel@tonic-gate /*FALLTHRU*/
4717c478bd9Sstevel@tonic-gate case K_LOG_STDERR:
4727c478bd9Sstevel@tonic-gate /*
4737c478bd9Sstevel@tonic-gate * Files/standard error.
4747c478bd9Sstevel@tonic-gate */
475*159d09a2SMark Phalan if (fprintf(log_control.log_entries[lindex].lfu_filep, "%s\n",
4767c478bd9Sstevel@tonic-gate outbuf) < 0) {
4777c478bd9Sstevel@tonic-gate /* Attempt to report error */
4787c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LOG_FILE_ERR), whoami,
4797c478bd9Sstevel@tonic-gate log_control.log_entries[lindex].lfu_fname);
4807c478bd9Sstevel@tonic-gate }
4817c478bd9Sstevel@tonic-gate else {
4827c478bd9Sstevel@tonic-gate fflush(log_control.log_entries[lindex].lfu_filep);
4837c478bd9Sstevel@tonic-gate }
4847c478bd9Sstevel@tonic-gate break;
4857c478bd9Sstevel@tonic-gate case K_LOG_CONSOLE:
4867c478bd9Sstevel@tonic-gate case K_LOG_DEVICE:
4877c478bd9Sstevel@tonic-gate /*
4887c478bd9Sstevel@tonic-gate * Devices (may need special handling)
4897c478bd9Sstevel@tonic-gate */
4907c478bd9Sstevel@tonic-gate if (DEVICE_PRINT(log_control.log_entries[lindex].ldu_filep,
4917c478bd9Sstevel@tonic-gate outbuf) < 0) {
4927c478bd9Sstevel@tonic-gate /* Attempt to report error */
4937c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LOG_DEVICE_ERR), whoami,
4947c478bd9Sstevel@tonic-gate log_control.log_entries[lindex].ldu_devname);
4957c478bd9Sstevel@tonic-gate }
4967c478bd9Sstevel@tonic-gate break;
497*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
4987c478bd9Sstevel@tonic-gate case K_LOG_SYSLOG:
4997c478bd9Sstevel@tonic-gate /*
5007c478bd9Sstevel@tonic-gate * System log.
5017c478bd9Sstevel@tonic-gate */
5027c478bd9Sstevel@tonic-gate /*
5037c478bd9Sstevel@tonic-gate * If we have specified a priority through our hackery, then
5047c478bd9Sstevel@tonic-gate * use it, otherwise use the default.
5057c478bd9Sstevel@tonic-gate */
5067c478bd9Sstevel@tonic-gate if (log_pri >= 0)
5077c478bd9Sstevel@tonic-gate log_pri |= log_control.log_entries[lindex].lsu_facility;
5087c478bd9Sstevel@tonic-gate else
5097c478bd9Sstevel@tonic-gate log_pri = log_control.log_entries[lindex].lsu_facility |
5107c478bd9Sstevel@tonic-gate log_control.log_entries[lindex].lsu_severity;
5117c478bd9Sstevel@tonic-gate
5127c478bd9Sstevel@tonic-gate /* Log the message with our header trimmed off */
5137c478bd9Sstevel@tonic-gate syslog(log_pri, syslogp);
5147c478bd9Sstevel@tonic-gate break;
515*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
5167c478bd9Sstevel@tonic-gate default:
5177c478bd9Sstevel@tonic-gate break;
5187c478bd9Sstevel@tonic-gate }
5197c478bd9Sstevel@tonic-gate }
5207c478bd9Sstevel@tonic-gate }
5217c478bd9Sstevel@tonic-gate
5227c478bd9Sstevel@tonic-gate /*
5237c478bd9Sstevel@tonic-gate * krb5_klog_init() - Initialize logging.
5247c478bd9Sstevel@tonic-gate *
5257c478bd9Sstevel@tonic-gate * This routine parses the syntax described above to specify destinations for
5267c478bd9Sstevel@tonic-gate * com_err(3) or krb5_klog_syslog() messages generated by the caller.
5277c478bd9Sstevel@tonic-gate *
5287c478bd9Sstevel@tonic-gate * Parameters:
5297c478bd9Sstevel@tonic-gate * kcontext - Kerberos context.
5307c478bd9Sstevel@tonic-gate * ename - Entity name as it is to appear in the profile.
5317c478bd9Sstevel@tonic-gate * whoami - Entity name as it is to appear in error output.
5327c478bd9Sstevel@tonic-gate * do_com_err - Take over com_err(3) processing.
5337c478bd9Sstevel@tonic-gate *
5347c478bd9Sstevel@tonic-gate * Implicit inputs:
5357c478bd9Sstevel@tonic-gate * stderr - This is where STDERR output goes.
5367c478bd9Sstevel@tonic-gate *
5377c478bd9Sstevel@tonic-gate * Implicit outputs:
5387c478bd9Sstevel@tonic-gate * log_nentries - Number of log entries, both valid and invalid.
5397c478bd9Sstevel@tonic-gate * log_control - List of entries (log_nentries long) which contains
5407c478bd9Sstevel@tonic-gate * data for klog_com_err_proc() to use to determine
5417c478bd9Sstevel@tonic-gate * where/how to send output.
5427c478bd9Sstevel@tonic-gate */
5437c478bd9Sstevel@tonic-gate krb5_error_code
krb5_klog_init(krb5_context kcontext,char * ename,char * whoami,krb5_boolean do_com_err)544*159d09a2SMark Phalan krb5_klog_init(krb5_context kcontext, char *ename, char *whoami, krb5_boolean do_com_err)
5457c478bd9Sstevel@tonic-gate {
5467c478bd9Sstevel@tonic-gate const char *logging_profent[3];
5477c478bd9Sstevel@tonic-gate const char *logging_defent[3];
5487c478bd9Sstevel@tonic-gate char **logging_specs;
5497c478bd9Sstevel@tonic-gate int i, ngood;
5507c478bd9Sstevel@tonic-gate char *cp, *cp2;
551*159d09a2SMark Phalan char savec = '\0';
5527c478bd9Sstevel@tonic-gate int error;
5537c478bd9Sstevel@tonic-gate int do_openlog, log_facility;
5547c478bd9Sstevel@tonic-gate FILE *f;
555*159d09a2SMark Phalan mode_t old_umask;
5567c478bd9Sstevel@tonic-gate
5577c478bd9Sstevel@tonic-gate /* Initialize */
5587c478bd9Sstevel@tonic-gate do_openlog = 0;
5597c478bd9Sstevel@tonic-gate log_facility = 0;
5607c478bd9Sstevel@tonic-gate
561*159d09a2SMark Phalan err_context = kcontext;
562*159d09a2SMark Phalan
5637c478bd9Sstevel@tonic-gate /*
5647c478bd9Sstevel@tonic-gate * Look up [logging]-><ename> in the profile. If that doesn't
5657c478bd9Sstevel@tonic-gate * succeed, then look for [logging]->default.
5667c478bd9Sstevel@tonic-gate */
5677c478bd9Sstevel@tonic-gate logging_profent[0] = "logging";
5687c478bd9Sstevel@tonic-gate logging_profent[1] = ename;
5697c478bd9Sstevel@tonic-gate logging_profent[2] = (char *) NULL;
5707c478bd9Sstevel@tonic-gate logging_defent[0] = "logging";
5717c478bd9Sstevel@tonic-gate logging_defent[1] = "default";
5727c478bd9Sstevel@tonic-gate logging_defent[2] = (char *) NULL;
5737c478bd9Sstevel@tonic-gate logging_specs = (char **) NULL;
5747c478bd9Sstevel@tonic-gate ngood = 0;
5757c478bd9Sstevel@tonic-gate log_control.log_nentries = 0;
5767c478bd9Sstevel@tonic-gate if (!profile_get_values(kcontext->profile,
5777c478bd9Sstevel@tonic-gate logging_profent,
5787c478bd9Sstevel@tonic-gate &logging_specs) ||
5797c478bd9Sstevel@tonic-gate !profile_get_values(kcontext->profile,
5807c478bd9Sstevel@tonic-gate logging_defent,
5817c478bd9Sstevel@tonic-gate &logging_specs)) {
5827c478bd9Sstevel@tonic-gate /*
5837c478bd9Sstevel@tonic-gate * We have a match, so we first count the number of elements
5847c478bd9Sstevel@tonic-gate */
5857c478bd9Sstevel@tonic-gate for (log_control.log_nentries = 0;
5867c478bd9Sstevel@tonic-gate logging_specs[log_control.log_nentries];
5877c478bd9Sstevel@tonic-gate log_control.log_nentries++);
5887c478bd9Sstevel@tonic-gate
5897c478bd9Sstevel@tonic-gate /*
5907c478bd9Sstevel@tonic-gate * Now allocate our structure.
5917c478bd9Sstevel@tonic-gate */
5927c478bd9Sstevel@tonic-gate log_control.log_entries = (struct log_entry *)
5937c478bd9Sstevel@tonic-gate malloc(log_control.log_nentries * sizeof(struct log_entry));
5947c478bd9Sstevel@tonic-gate if (log_control.log_entries) {
5957c478bd9Sstevel@tonic-gate /*
5967c478bd9Sstevel@tonic-gate * Scan through the list.
5977c478bd9Sstevel@tonic-gate */
5987c478bd9Sstevel@tonic-gate for (i=0; i<log_control.log_nentries; i++) {
5997c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_NONE;
6007c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_2free = logging_specs[i];
6017c478bd9Sstevel@tonic-gate /*
6027c478bd9Sstevel@tonic-gate * The format is:
6037c478bd9Sstevel@tonic-gate * <whitespace><data><whitespace>
6047c478bd9Sstevel@tonic-gate * so, trim off the leading and trailing whitespace here.
6057c478bd9Sstevel@tonic-gate */
606*159d09a2SMark Phalan for (cp = logging_specs[i]; isspace((int) *cp); cp++);
6077c478bd9Sstevel@tonic-gate for (cp2 = &logging_specs[i][strlen(logging_specs[i])-1];
608*159d09a2SMark Phalan isspace((int) *cp2); cp2--);
6097c478bd9Sstevel@tonic-gate cp2++;
6107c478bd9Sstevel@tonic-gate *cp2 = '\0';
6117c478bd9Sstevel@tonic-gate /*
6127c478bd9Sstevel@tonic-gate * Is this a file?
6137c478bd9Sstevel@tonic-gate */
6147c478bd9Sstevel@tonic-gate if (!strncasecmp(cp, "FILE", 4)) {
6157c478bd9Sstevel@tonic-gate /*
6167c478bd9Sstevel@tonic-gate * Check for append/overwrite, then open the file.
6177c478bd9Sstevel@tonic-gate */
6187c478bd9Sstevel@tonic-gate if (cp[4] == ':' || cp[4] == '=') {
6197c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_fopen_mode =
620004388ebScasper (cp[4] == ':') ? "a+F" : "wF";
621*159d09a2SMark Phalan old_umask = umask(077);
6227c478bd9Sstevel@tonic-gate f = fopen(&cp[5],
6237c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_fopen_mode);
624*159d09a2SMark Phalan umask(old_umask);
6257c478bd9Sstevel@tonic-gate if (f) {
6267c478bd9Sstevel@tonic-gate char rotate_kw[128];
627*159d09a2SMark Phalan
6287c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_filep = f;
6297c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_FILE;
6307c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_fname = &cp[5];
6317c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_rotate_period =
6327c478bd9Sstevel@tonic-gate K_LOG_DEF_FILE_ROTATE_PERIOD;
6337c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_rotate_versions =
6347c478bd9Sstevel@tonic-gate K_LOG_DEF_FILE_ROTATE_VERSIONS;
6357c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_last_rotated =
6367c478bd9Sstevel@tonic-gate time(0);
6377c478bd9Sstevel@tonic-gate
6387c478bd9Sstevel@tonic-gate /*
6397c478bd9Sstevel@tonic-gate * Now parse for ename_"rotate" = {
6407c478bd9Sstevel@tonic-gate * period = XXX
6417c478bd9Sstevel@tonic-gate * versions = 10
6427c478bd9Sstevel@tonic-gate * }
6437c478bd9Sstevel@tonic-gate */
6447c478bd9Sstevel@tonic-gate if (strlen(ename) + strlen("_rotate") <
6457c478bd9Sstevel@tonic-gate sizeof (rotate_kw)) {
6467c478bd9Sstevel@tonic-gate
6477c478bd9Sstevel@tonic-gate char *time;
6487c478bd9Sstevel@tonic-gate krb5_deltat dt;
6497c478bd9Sstevel@tonic-gate int vers;
6507c478bd9Sstevel@tonic-gate
6517c478bd9Sstevel@tonic-gate strcpy(rotate_kw, ename);
6527c478bd9Sstevel@tonic-gate strcat(rotate_kw, "_rotate");
6537c478bd9Sstevel@tonic-gate
6547c478bd9Sstevel@tonic-gate if (!profile_get_string(kcontext->profile,
6557c478bd9Sstevel@tonic-gate "logging", rotate_kw, "period",
6567c478bd9Sstevel@tonic-gate NULL, &time)) {
6577c478bd9Sstevel@tonic-gate
6587c478bd9Sstevel@tonic-gate if (time != NULL) {
6597c478bd9Sstevel@tonic-gate if (!krb5_string_to_deltat(time,
6607c478bd9Sstevel@tonic-gate &dt)) {
6617c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_rotate_period =
6627c478bd9Sstevel@tonic-gate (time_t) dt;
6637c478bd9Sstevel@tonic-gate }
6647c478bd9Sstevel@tonic-gate free(time);
6657c478bd9Sstevel@tonic-gate }
6667c478bd9Sstevel@tonic-gate }
6677c478bd9Sstevel@tonic-gate
6687c478bd9Sstevel@tonic-gate if (!profile_get_integer(
6697c478bd9Sstevel@tonic-gate kcontext->profile, "logging",
6707c478bd9Sstevel@tonic-gate rotate_kw, "versions",
6717c478bd9Sstevel@tonic-gate K_LOG_DEF_FILE_ROTATE_VERSIONS,
6727c478bd9Sstevel@tonic-gate &vers)) {
6737c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_rotate_versions = vers;
6747c478bd9Sstevel@tonic-gate }
6757c478bd9Sstevel@tonic-gate
6767c478bd9Sstevel@tonic-gate }
6777c478bd9Sstevel@tonic-gate } else {
6787c478bd9Sstevel@tonic-gate fprintf(stderr, gettext("Couldn't open log file %s: %s\n"),
6797c478bd9Sstevel@tonic-gate &cp[5], error_message(errno));
6807c478bd9Sstevel@tonic-gate continue;
6817c478bd9Sstevel@tonic-gate }
6827c478bd9Sstevel@tonic-gate }
6837c478bd9Sstevel@tonic-gate }
684*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
6857c478bd9Sstevel@tonic-gate /*
6867c478bd9Sstevel@tonic-gate * Is this a syslog?
6877c478bd9Sstevel@tonic-gate */
6887c478bd9Sstevel@tonic-gate else if (!strncasecmp(cp, "SYSLOG", 6)) {
6897c478bd9Sstevel@tonic-gate error = 0;
6907c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_AUTH;
6917c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity = LOG_ERR;
6927c478bd9Sstevel@tonic-gate /*
6937c478bd9Sstevel@tonic-gate * Is there a severify specified?
6947c478bd9Sstevel@tonic-gate */
6957c478bd9Sstevel@tonic-gate if (cp[6] == ':') {
6967c478bd9Sstevel@tonic-gate /*
6977c478bd9Sstevel@tonic-gate * Find the end of the severity.
6987c478bd9Sstevel@tonic-gate */
699*159d09a2SMark Phalan cp2 = strchr(&cp[7], ':');
700*159d09a2SMark Phalan if (cp2) {
7017c478bd9Sstevel@tonic-gate savec = *cp2;
7027c478bd9Sstevel@tonic-gate *cp2 = '\0';
7037c478bd9Sstevel@tonic-gate cp2++;
7047c478bd9Sstevel@tonic-gate }
7057c478bd9Sstevel@tonic-gate
7067c478bd9Sstevel@tonic-gate /*
7077c478bd9Sstevel@tonic-gate * Match a severity.
7087c478bd9Sstevel@tonic-gate */
7097c478bd9Sstevel@tonic-gate if (!strcasecmp(&cp[7], "ERR")) {
7107c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity = LOG_ERR;
7117c478bd9Sstevel@tonic-gate }
712*159d09a2SMark Phalan #ifdef LOG_EMERG
7137c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "EMERG")) {
7147c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity =
7157c478bd9Sstevel@tonic-gate LOG_EMERG;
7167c478bd9Sstevel@tonic-gate }
717*159d09a2SMark Phalan #endif /* LOG_EMERG */
718*159d09a2SMark Phalan #ifdef LOG_ALERT
7197c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "ALERT")) {
7207c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity =
7217c478bd9Sstevel@tonic-gate LOG_ALERT;
7227c478bd9Sstevel@tonic-gate }
723*159d09a2SMark Phalan #endif /* LOG_ALERT */
724*159d09a2SMark Phalan #ifdef LOG_CRIT
7257c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "CRIT")) {
7267c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity = LOG_CRIT;
7277c478bd9Sstevel@tonic-gate }
728*159d09a2SMark Phalan #endif /* LOG_CRIT */
729*159d09a2SMark Phalan #ifdef LOG_WARNING
7307c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "WARNING")) {
7317c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity =
7327c478bd9Sstevel@tonic-gate LOG_WARNING;
7337c478bd9Sstevel@tonic-gate }
734*159d09a2SMark Phalan #endif /* LOG_WARNING */
735*159d09a2SMark Phalan #ifdef LOG_NOTICE
7367c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "NOTICE")) {
7377c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity =
7387c478bd9Sstevel@tonic-gate LOG_NOTICE;
7397c478bd9Sstevel@tonic-gate }
740*159d09a2SMark Phalan #endif /* LOG_NOTICE */
741*159d09a2SMark Phalan #ifdef LOG_INFO
7427c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "INFO")) {
7437c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity = LOG_INFO;
7447c478bd9Sstevel@tonic-gate }
745*159d09a2SMark Phalan #endif /* LOG_INFO */
746*159d09a2SMark Phalan #ifdef LOG_DEBUG
7477c478bd9Sstevel@tonic-gate else if (!strcasecmp(&cp[7], "DEBUG")) {
7487c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_severity =
7497c478bd9Sstevel@tonic-gate LOG_DEBUG;
7507c478bd9Sstevel@tonic-gate }
751*159d09a2SMark Phalan #endif /* LOG_DEBUG */
7527c478bd9Sstevel@tonic-gate else
7537c478bd9Sstevel@tonic-gate error = 1;
7547c478bd9Sstevel@tonic-gate
7557c478bd9Sstevel@tonic-gate /*
7567c478bd9Sstevel@tonic-gate * If there is a facility present, then parse that.
7577c478bd9Sstevel@tonic-gate */
7587c478bd9Sstevel@tonic-gate if (cp2) {
7597c478bd9Sstevel@tonic-gate if (!strcasecmp(cp2, "AUTH")) {
7607c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_AUTH;
7617c478bd9Sstevel@tonic-gate }
7627c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "KERN")) {
7637c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_KERN;
7647c478bd9Sstevel@tonic-gate }
7657c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "USER")) {
7667c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_USER;
7677c478bd9Sstevel@tonic-gate }
7687c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "MAIL")) {
7697c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_MAIL;
7707c478bd9Sstevel@tonic-gate }
7717c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "DAEMON")) {
7727c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_DAEMON;
7737c478bd9Sstevel@tonic-gate }
7747c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LPR")) {
7757c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LPR;
7767c478bd9Sstevel@tonic-gate }
7777c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "NEWS")) {
7787c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_NEWS;
7797c478bd9Sstevel@tonic-gate }
7807c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "UUCP")) {
7817c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_UUCP;
7827c478bd9Sstevel@tonic-gate }
7837c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "CRON")) {
7847c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_CRON;
7857c478bd9Sstevel@tonic-gate }
7867c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "AUDIT")) {
7877c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_AUDIT;
7887c478bd9Sstevel@tonic-gate }
7897c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL0")) {
7907c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL0;
7917c478bd9Sstevel@tonic-gate }
7927c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL1")) {
7937c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL1;
7947c478bd9Sstevel@tonic-gate }
7957c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL2")) {
7967c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL2;
7977c478bd9Sstevel@tonic-gate }
7987c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL3")) {
7997c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL3;
8007c478bd9Sstevel@tonic-gate }
8017c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL4")) {
8027c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL4;
8037c478bd9Sstevel@tonic-gate }
8047c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL5")) {
8057c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL5;
8067c478bd9Sstevel@tonic-gate }
8077c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL6")) {
8087c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL6;
8097c478bd9Sstevel@tonic-gate }
8107c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp2, "LOCAL7")) {
8117c478bd9Sstevel@tonic-gate log_control.log_entries[i].lsu_facility = LOG_LOCAL7;
8127c478bd9Sstevel@tonic-gate }
8137c478bd9Sstevel@tonic-gate cp2--;
8147c478bd9Sstevel@tonic-gate *cp2 = savec;
8157c478bd9Sstevel@tonic-gate }
8167c478bd9Sstevel@tonic-gate }
8177c478bd9Sstevel@tonic-gate if (!error) {
8187c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_SYSLOG;
8197c478bd9Sstevel@tonic-gate do_openlog = 1;
8207c478bd9Sstevel@tonic-gate log_facility = log_control.log_entries[i].lsu_facility;
8217c478bd9Sstevel@tonic-gate }
8227c478bd9Sstevel@tonic-gate }
823*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
8247c478bd9Sstevel@tonic-gate /*
8257c478bd9Sstevel@tonic-gate * Is this a standard error specification?
8267c478bd9Sstevel@tonic-gate */
8277c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp, "STDERR")) {
828*159d09a2SMark Phalan log_control.log_entries[i].lfu_filep =
829*159d09a2SMark Phalan fdopen(fileno(stderr), "a+F");
830*159d09a2SMark Phalan if (log_control.log_entries[i].lfu_filep) {
8317c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_STDERR;
8327c478bd9Sstevel@tonic-gate log_control.log_entries[i].lfu_fname =
8337c478bd9Sstevel@tonic-gate "standard error";
8347c478bd9Sstevel@tonic-gate }
8357c478bd9Sstevel@tonic-gate }
8367c478bd9Sstevel@tonic-gate /*
8377c478bd9Sstevel@tonic-gate * Is this a specification of the console?
8387c478bd9Sstevel@tonic-gate */
8397c478bd9Sstevel@tonic-gate else if (!strcasecmp(cp, "CONSOLE")) {
840*159d09a2SMark Phalan log_control.log_entries[i].ldu_filep =
841*159d09a2SMark Phalan CONSOLE_OPEN("a+F");
842*159d09a2SMark Phalan if (log_control.log_entries[i].ldu_filep) {
8437c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_CONSOLE;
8447c478bd9Sstevel@tonic-gate log_control.log_entries[i].ldu_devname = "console";
8457c478bd9Sstevel@tonic-gate }
8467c478bd9Sstevel@tonic-gate }
8477c478bd9Sstevel@tonic-gate /*
8487c478bd9Sstevel@tonic-gate * Is this a specification of a device?
8497c478bd9Sstevel@tonic-gate */
8507c478bd9Sstevel@tonic-gate else if (!strncasecmp(cp, "DEVICE", 6)) {
8517c478bd9Sstevel@tonic-gate /*
8527c478bd9Sstevel@tonic-gate * We handle devices very similarly to files.
8537c478bd9Sstevel@tonic-gate */
8547c478bd9Sstevel@tonic-gate if (cp[6] == '=') {
855*159d09a2SMark Phalan log_control.log_entries[i].ldu_filep =
856*159d09a2SMark Phalan DEVICE_OPEN(&cp[7], "wF");
857*159d09a2SMark Phalan if (log_control.log_entries[i].ldu_filep) {
8587c478bd9Sstevel@tonic-gate log_control.log_entries[i].log_type = K_LOG_DEVICE;
8597c478bd9Sstevel@tonic-gate log_control.log_entries[i].ldu_devname = &cp[7];
8607c478bd9Sstevel@tonic-gate }
8617c478bd9Sstevel@tonic-gate }
8627c478bd9Sstevel@tonic-gate }
8637c478bd9Sstevel@tonic-gate /*
8647c478bd9Sstevel@tonic-gate * See if we successfully parsed this specification.
8657c478bd9Sstevel@tonic-gate */
8667c478bd9Sstevel@tonic-gate if (log_control.log_entries[i].log_type == K_LOG_NONE) {
8677c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LSPEC_PARSE_ERR_1), whoami, cp);
8687c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LSPEC_PARSE_ERR_2), whoami);
8697c478bd9Sstevel@tonic-gate }
8707c478bd9Sstevel@tonic-gate else
8717c478bd9Sstevel@tonic-gate ngood++;
8727c478bd9Sstevel@tonic-gate }
8737c478bd9Sstevel@tonic-gate }
8747c478bd9Sstevel@tonic-gate /*
8757c478bd9Sstevel@tonic-gate * If we didn't find anything, then free our lists.
8767c478bd9Sstevel@tonic-gate */
8777c478bd9Sstevel@tonic-gate if (ngood == 0) {
8787c478bd9Sstevel@tonic-gate for (i=0; i<log_control.log_nentries; i++)
8797c478bd9Sstevel@tonic-gate free(logging_specs[i]);
8807c478bd9Sstevel@tonic-gate }
8817c478bd9Sstevel@tonic-gate free(logging_specs);
8827c478bd9Sstevel@tonic-gate }
8837c478bd9Sstevel@tonic-gate /*
8847c478bd9Sstevel@tonic-gate * If we didn't find anything, go for the default which is to log to
8857c478bd9Sstevel@tonic-gate * the system log.
8867c478bd9Sstevel@tonic-gate */
8877c478bd9Sstevel@tonic-gate if (ngood == 0) {
8887c478bd9Sstevel@tonic-gate if (log_control.log_entries)
8897c478bd9Sstevel@tonic-gate free(log_control.log_entries);
8907c478bd9Sstevel@tonic-gate log_control.log_entries = &def_log_entry;
8917c478bd9Sstevel@tonic-gate log_control.log_entries->log_type = K_LOG_SYSLOG;
8927c478bd9Sstevel@tonic-gate log_control.log_entries->log_2free = (krb5_pointer) NULL;
8937c478bd9Sstevel@tonic-gate log_facility = log_control.log_entries->lsu_facility = LOG_AUTH;
8947c478bd9Sstevel@tonic-gate log_control.log_entries->lsu_severity = LOG_ERR;
8957c478bd9Sstevel@tonic-gate do_openlog = 1;
8967c478bd9Sstevel@tonic-gate log_control.log_nentries = 1;
8977c478bd9Sstevel@tonic-gate }
8987c478bd9Sstevel@tonic-gate if (log_control.log_nentries) {
899*159d09a2SMark Phalan log_control.log_whoami = (char *) malloc(strlen(whoami)+1);
900*159d09a2SMark Phalan if (log_control.log_whoami)
9017c478bd9Sstevel@tonic-gate strcpy(log_control.log_whoami, whoami);
902*159d09a2SMark Phalan
903*159d09a2SMark Phalan log_control.log_hostname = (char *) malloc(MAXHOSTNAMELEN + 1);
904*159d09a2SMark Phalan if (log_control.log_hostname) {
9057c478bd9Sstevel@tonic-gate gethostname(log_control.log_hostname, MAXHOSTNAMELEN);
906*159d09a2SMark Phalan log_control.log_hostname[MAXHOSTNAMELEN] = '\0';
907*159d09a2SMark Phalan }
908*159d09a2SMark Phalan #ifdef HAVE_OPENLOG
9097c478bd9Sstevel@tonic-gate if (do_openlog) {
9107c478bd9Sstevel@tonic-gate openlog(whoami, LOG_NDELAY|LOG_PID, log_facility);
9117c478bd9Sstevel@tonic-gate log_control.log_opened = 1;
9127c478bd9Sstevel@tonic-gate }
913*159d09a2SMark Phalan #endif /* HAVE_OPENLOG */
9147c478bd9Sstevel@tonic-gate if (do_com_err)
9157c478bd9Sstevel@tonic-gate (void) set_com_err_hook(klog_com_err_proc);
9167c478bd9Sstevel@tonic-gate }
9177c478bd9Sstevel@tonic-gate return((log_control.log_nentries) ? 0 : ENOENT);
9187c478bd9Sstevel@tonic-gate }
9197c478bd9Sstevel@tonic-gate
9207c478bd9Sstevel@tonic-gate /*
9217c478bd9Sstevel@tonic-gate * krb5_klog_close() - Close the logging context and free all data.
9227c478bd9Sstevel@tonic-gate */
9237c478bd9Sstevel@tonic-gate void
krb5_klog_close(krb5_context kcontext)924*159d09a2SMark Phalan krb5_klog_close(krb5_context kcontext)
9257c478bd9Sstevel@tonic-gate {
9267c478bd9Sstevel@tonic-gate int lindex;
9277c478bd9Sstevel@tonic-gate (void) reset_com_err_hook();
9287c478bd9Sstevel@tonic-gate for (lindex = 0; lindex < log_control.log_nentries; lindex++) {
9297c478bd9Sstevel@tonic-gate switch (log_control.log_entries[lindex].log_type) {
9307c478bd9Sstevel@tonic-gate case K_LOG_FILE:
9317c478bd9Sstevel@tonic-gate case K_LOG_STDERR:
9327c478bd9Sstevel@tonic-gate /*
9337c478bd9Sstevel@tonic-gate * Files/standard error.
9347c478bd9Sstevel@tonic-gate */
9357c478bd9Sstevel@tonic-gate fclose(log_control.log_entries[lindex].lfu_filep);
9367c478bd9Sstevel@tonic-gate break;
9377c478bd9Sstevel@tonic-gate case K_LOG_CONSOLE:
9387c478bd9Sstevel@tonic-gate case K_LOG_DEVICE:
9397c478bd9Sstevel@tonic-gate /*
9407c478bd9Sstevel@tonic-gate * Devices (may need special handling)
9417c478bd9Sstevel@tonic-gate */
9427c478bd9Sstevel@tonic-gate DEVICE_CLOSE(log_control.log_entries[lindex].ldu_filep);
9437c478bd9Sstevel@tonic-gate break;
944*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
9457c478bd9Sstevel@tonic-gate case K_LOG_SYSLOG:
9467c478bd9Sstevel@tonic-gate /*
9477c478bd9Sstevel@tonic-gate * System log.
9487c478bd9Sstevel@tonic-gate */
9497c478bd9Sstevel@tonic-gate break;
950*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
9517c478bd9Sstevel@tonic-gate default:
9527c478bd9Sstevel@tonic-gate break;
9537c478bd9Sstevel@tonic-gate }
9547c478bd9Sstevel@tonic-gate if (log_control.log_entries[lindex].log_2free)
9557c478bd9Sstevel@tonic-gate free(log_control.log_entries[lindex].log_2free);
9567c478bd9Sstevel@tonic-gate }
9577c478bd9Sstevel@tonic-gate if (log_control.log_entries != &def_log_entry)
9587c478bd9Sstevel@tonic-gate free(log_control.log_entries);
9597c478bd9Sstevel@tonic-gate log_control.log_entries = (struct log_entry *) NULL;
9607c478bd9Sstevel@tonic-gate log_control.log_nentries = 0;
9617c478bd9Sstevel@tonic-gate if (log_control.log_whoami)
9627c478bd9Sstevel@tonic-gate free(log_control.log_whoami);
9637c478bd9Sstevel@tonic-gate log_control.log_whoami = (char *) NULL;
9647c478bd9Sstevel@tonic-gate if (log_control.log_hostname)
9657c478bd9Sstevel@tonic-gate free(log_control.log_hostname);
9667c478bd9Sstevel@tonic-gate log_control.log_hostname = (char *) NULL;
967*159d09a2SMark Phalan #ifdef HAVE_CLOSELOG
9687c478bd9Sstevel@tonic-gate if (log_control.log_opened)
9697c478bd9Sstevel@tonic-gate closelog();
970*159d09a2SMark Phalan #endif /* HAVE_CLOSELOG */
9717c478bd9Sstevel@tonic-gate }
9727c478bd9Sstevel@tonic-gate
9737c478bd9Sstevel@tonic-gate /*
9747c478bd9Sstevel@tonic-gate * severity2string() - Convert a severity to a string.
9757c478bd9Sstevel@tonic-gate */
976*159d09a2SMark Phalan static const char *
severity2string(int severity)977*159d09a2SMark Phalan severity2string(int severity)
9787c478bd9Sstevel@tonic-gate {
9797c478bd9Sstevel@tonic-gate int s;
9807c478bd9Sstevel@tonic-gate const char *ss;
9817c478bd9Sstevel@tonic-gate
9827c478bd9Sstevel@tonic-gate s = severity & LOG_PRIMASK;
9837c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_UFO_STRING);
9847c478bd9Sstevel@tonic-gate switch (s) {
985*159d09a2SMark Phalan #ifdef LOG_EMERG
9867c478bd9Sstevel@tonic-gate case LOG_EMERG:
9877c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_EMERG_STRING);
9887c478bd9Sstevel@tonic-gate break;
989*159d09a2SMark Phalan #endif /* LOG_EMERG */
990*159d09a2SMark Phalan #ifdef LOG_ALERT
9917c478bd9Sstevel@tonic-gate case LOG_ALERT:
9927c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_ALERT_STRING);
9937c478bd9Sstevel@tonic-gate break;
994*159d09a2SMark Phalan #endif /* LOG_ALERT */
995*159d09a2SMark Phalan #ifdef LOG_CRIT
9967c478bd9Sstevel@tonic-gate case LOG_CRIT:
9977c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_CRIT_STRING);
9987c478bd9Sstevel@tonic-gate break;
999*159d09a2SMark Phalan #endif /* LOG_CRIT */
10007c478bd9Sstevel@tonic-gate case LOG_ERR:
10017c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_ERR_STRING);
10027c478bd9Sstevel@tonic-gate break;
1003*159d09a2SMark Phalan #ifdef LOG_WARNING
10047c478bd9Sstevel@tonic-gate case LOG_WARNING:
10057c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_WARNING_STRING);
10067c478bd9Sstevel@tonic-gate break;
1007*159d09a2SMark Phalan #endif /* LOG_WARNING */
1008*159d09a2SMark Phalan #ifdef LOG_NOTICE
10097c478bd9Sstevel@tonic-gate case LOG_NOTICE:
10107c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_NOTICE_STRING);
10117c478bd9Sstevel@tonic-gate break;
1012*159d09a2SMark Phalan #endif /* LOG_NOTICE */
1013*159d09a2SMark Phalan #ifdef LOG_INFO
10147c478bd9Sstevel@tonic-gate case LOG_INFO:
10157c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_INFO_STRING);
10167c478bd9Sstevel@tonic-gate break;
1017*159d09a2SMark Phalan #endif /* LOG_INFO */
1018*159d09a2SMark Phalan #ifdef LOG_DEBUG
10197c478bd9Sstevel@tonic-gate case LOG_DEBUG:
10207c478bd9Sstevel@tonic-gate ss = krb5_log_error_table(LOG_DEBUG_STRING);
10217c478bd9Sstevel@tonic-gate break;
1022*159d09a2SMark Phalan #endif /* LOG_DEBUG */
10237c478bd9Sstevel@tonic-gate }
10247c478bd9Sstevel@tonic-gate return((char *) ss);
10257c478bd9Sstevel@tonic-gate }
10267c478bd9Sstevel@tonic-gate
10277c478bd9Sstevel@tonic-gate /*
10287c478bd9Sstevel@tonic-gate * krb5_klog_syslog() - Simulate the calling sequence of syslog(3), while
10297c478bd9Sstevel@tonic-gate * also performing the logging redirection as specified
10307c478bd9Sstevel@tonic-gate * by krb5_klog_init().
10317c478bd9Sstevel@tonic-gate */
10327c478bd9Sstevel@tonic-gate static int
klog_vsyslog(int priority,const char * format,va_list arglist)1033*159d09a2SMark Phalan klog_vsyslog(int priority, const char *format, va_list arglist)
10347c478bd9Sstevel@tonic-gate {
10357c478bd9Sstevel@tonic-gate char outbuf[KRB5_KLOG_MAX_ERRMSG_SIZE];
10367c478bd9Sstevel@tonic-gate int lindex;
10377c478bd9Sstevel@tonic-gate char *syslogp;
10387c478bd9Sstevel@tonic-gate char *cp;
10397c478bd9Sstevel@tonic-gate time_t now;
1040*159d09a2SMark Phalan #ifdef HAVE_STRFTIME
10417c478bd9Sstevel@tonic-gate size_t soff;
1042*159d09a2SMark Phalan #endif /* HAVE_STRFTIME */
10437c478bd9Sstevel@tonic-gate
10447c478bd9Sstevel@tonic-gate /*
10457c478bd9Sstevel@tonic-gate * Format a syslog-esque message of the format:
10467c478bd9Sstevel@tonic-gate *
10477c478bd9Sstevel@tonic-gate * (verbose form)
10487c478bd9Sstevel@tonic-gate * <date> <hostname> <id>[<pid>](<priority>): <message>
10497c478bd9Sstevel@tonic-gate *
10507c478bd9Sstevel@tonic-gate * (short form)
10517c478bd9Sstevel@tonic-gate * <date> <message>
10527c478bd9Sstevel@tonic-gate */
10537c478bd9Sstevel@tonic-gate cp = outbuf;
10547c478bd9Sstevel@tonic-gate (void) time(&now);
1055*159d09a2SMark Phalan #ifdef HAVE_STRFTIME
10567c478bd9Sstevel@tonic-gate /*
10577c478bd9Sstevel@tonic-gate * Format the date: mon dd hh:mm:ss
10587c478bd9Sstevel@tonic-gate */
10597c478bd9Sstevel@tonic-gate soff = strftime(outbuf, sizeof(outbuf), "%b %d %H:%M:%S", localtime(&now));
10607c478bd9Sstevel@tonic-gate if (soff > 0)
10617c478bd9Sstevel@tonic-gate cp += soff;
10627c478bd9Sstevel@tonic-gate else
10637c478bd9Sstevel@tonic-gate return(-1);
1064*159d09a2SMark Phalan #else /* HAVE_STRFTIME */
1065*159d09a2SMark Phalan /*
1066*159d09a2SMark Phalan * Format the date:
1067*159d09a2SMark Phalan * We ASSUME here that the output of ctime is of the format:
1068*159d09a2SMark Phalan * dow mon dd hh:mm:ss tzs yyyy\n
1069*159d09a2SMark Phalan * 012345678901234567890123456789
1070*159d09a2SMark Phalan */
1071*159d09a2SMark Phalan strncpy(outbuf, ctime(&now) + 4, 15);
1072*159d09a2SMark Phalan cp += 15;
1073*159d09a2SMark Phalan #endif /* HAVE_STRFTIME */
10747c478bd9Sstevel@tonic-gate #ifdef VERBOSE_LOGS
1075*159d09a2SMark Phalan sprintf(cp, " %s %s[%ld](%s): ",
1076*159d09a2SMark Phalan log_control.log_hostname, log_control.log_whoami, (long) getpid(),
10777c478bd9Sstevel@tonic-gate severity2string(priority));
10787c478bd9Sstevel@tonic-gate #else
10797c478bd9Sstevel@tonic-gate sprintf(cp, " ");
10807c478bd9Sstevel@tonic-gate #endif
10817c478bd9Sstevel@tonic-gate syslogp = &outbuf[strlen(outbuf)];
10827c478bd9Sstevel@tonic-gate
10837c478bd9Sstevel@tonic-gate /* Now format the actual message */
1084*159d09a2SMark Phalan #ifdef HAVE_VSNPRINTF
108546736d35Ssemery vsnprintf(syslogp, sizeof(outbuf) - (syslogp - outbuf), format, arglist);
1086*159d09a2SMark Phalan #elif HAVE_VSPRINTF
1087*159d09a2SMark Phalan vsprintf(syslogp, format, arglist);
1088*159d09a2SMark Phalan #else /* HAVE_VSPRINTF */
1089*159d09a2SMark Phalan sprintf(syslogp, format, ((int *) arglist)[0], ((int *) arglist)[1],
1090*159d09a2SMark Phalan ((int *) arglist)[2], ((int *) arglist)[3],
1091*159d09a2SMark Phalan ((int *) arglist)[4], ((int *) arglist)[5]);
1092*159d09a2SMark Phalan #endif /* HAVE_VSPRINTF */
1093*159d09a2SMark Phalan
1094*159d09a2SMark Phalan /*
1095*159d09a2SMark Phalan * If the user did not use krb5_klog_init() instead of dropping
1096*159d09a2SMark Phalan * the request on the floor, syslog it - if it exists
1097*159d09a2SMark Phalan */
1098*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
1099*159d09a2SMark Phalan if (log_control.log_nentries == 0) {
1100*159d09a2SMark Phalan /* Log the message with our header trimmed off */
1101*159d09a2SMark Phalan syslog(priority, "%s", syslogp);
1102*159d09a2SMark Phalan }
1103*159d09a2SMark Phalan #endif
11047c478bd9Sstevel@tonic-gate
11057c478bd9Sstevel@tonic-gate /*
11067c478bd9Sstevel@tonic-gate * Now that we have the message formatted, perform the output to each
11077c478bd9Sstevel@tonic-gate * logging specification.
11087c478bd9Sstevel@tonic-gate */
11097c478bd9Sstevel@tonic-gate for (lindex = 0; lindex < log_control.log_nentries; lindex++) {
11107c478bd9Sstevel@tonic-gate switch (log_control.log_entries[lindex].log_type) {
11117c478bd9Sstevel@tonic-gate case K_LOG_FILE:
11127c478bd9Sstevel@tonic-gate
11137c478bd9Sstevel@tonic-gate klog_rotate(&log_control.log_entries[lindex]);
11147c478bd9Sstevel@tonic-gate /*FALLTHRU*/
11157c478bd9Sstevel@tonic-gate case K_LOG_STDERR:
11167c478bd9Sstevel@tonic-gate /*
11177c478bd9Sstevel@tonic-gate * Files/standard error.
11187c478bd9Sstevel@tonic-gate */
1119*159d09a2SMark Phalan if (fprintf(log_control.log_entries[lindex].lfu_filep, "%s\n",
11207c478bd9Sstevel@tonic-gate outbuf) < 0) {
11217c478bd9Sstevel@tonic-gate /* Attempt to report error */
11227c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LOG_FILE_ERR),
1123*159d09a2SMark Phalan log_control.log_whoami,
11247c478bd9Sstevel@tonic-gate log_control.log_entries[lindex].lfu_fname);
11257c478bd9Sstevel@tonic-gate }
11267c478bd9Sstevel@tonic-gate else {
11277c478bd9Sstevel@tonic-gate fflush(log_control.log_entries[lindex].lfu_filep);
11287c478bd9Sstevel@tonic-gate }
11297c478bd9Sstevel@tonic-gate break;
11307c478bd9Sstevel@tonic-gate case K_LOG_CONSOLE:
11317c478bd9Sstevel@tonic-gate case K_LOG_DEVICE:
11327c478bd9Sstevel@tonic-gate /*
11337c478bd9Sstevel@tonic-gate * Devices (may need special handling)
11347c478bd9Sstevel@tonic-gate */
11357c478bd9Sstevel@tonic-gate if (DEVICE_PRINT(log_control.log_entries[lindex].ldu_filep,
11367c478bd9Sstevel@tonic-gate outbuf) < 0) {
11377c478bd9Sstevel@tonic-gate /* Attempt to report error */
11387c478bd9Sstevel@tonic-gate fprintf(stderr, krb5_log_error_table(LOG_DEVICE_ERR),
1139*159d09a2SMark Phalan log_control.log_whoami,
11407c478bd9Sstevel@tonic-gate log_control.log_entries[lindex].ldu_devname);
11417c478bd9Sstevel@tonic-gate }
11427c478bd9Sstevel@tonic-gate break;
1143*159d09a2SMark Phalan #ifdef HAVE_SYSLOG
11447c478bd9Sstevel@tonic-gate case K_LOG_SYSLOG:
11457c478bd9Sstevel@tonic-gate /*
11467c478bd9Sstevel@tonic-gate * System log.
11477c478bd9Sstevel@tonic-gate */
11487c478bd9Sstevel@tonic-gate
11497c478bd9Sstevel@tonic-gate /* Log the message with our header trimmed off */
1150*159d09a2SMark Phalan syslog(priority, "%s", syslogp);
11517c478bd9Sstevel@tonic-gate break;
1152*159d09a2SMark Phalan #endif /* HAVE_SYSLOG */
11537c478bd9Sstevel@tonic-gate default:
11547c478bd9Sstevel@tonic-gate break;
11557c478bd9Sstevel@tonic-gate }
11567c478bd9Sstevel@tonic-gate }
11577c478bd9Sstevel@tonic-gate return(0);
11587c478bd9Sstevel@tonic-gate }
11597c478bd9Sstevel@tonic-gate
11607c478bd9Sstevel@tonic-gate int
krb5_klog_syslog(int priority,const char * format,...)11617c478bd9Sstevel@tonic-gate krb5_klog_syslog(int priority, const char *format, ...)
11627c478bd9Sstevel@tonic-gate {
11637c478bd9Sstevel@tonic-gate int retval;
11647c478bd9Sstevel@tonic-gate va_list pvar;
11657c478bd9Sstevel@tonic-gate
11667c478bd9Sstevel@tonic-gate va_start(pvar, format);
11677c478bd9Sstevel@tonic-gate retval = klog_vsyslog(priority, format, pvar);
11687c478bd9Sstevel@tonic-gate va_end(pvar);
11697c478bd9Sstevel@tonic-gate return(retval);
11707c478bd9Sstevel@tonic-gate }
1171