summaryrefslogtreecommitdiffstats
path: root/usr.sbin/afs/src/util/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/afs/src/util/log.c')
-rw-r--r--usr.sbin/afs/src/util/log.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/usr.sbin/afs/src/util/log.c b/usr.sbin/afs/src/util/log.c
new file mode 100644
index 00000000000..0ad4414c401
--- /dev/null
+++ b/usr.sbin/afs/src/util/log.c
@@ -0,0 +1,261 @@
+/* $OpenBSD: log.c,v 1.1.1.1 1998/09/14 21:53:23 art Exp $ */
+/*
+ * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Kungliga Tekniska
+ * Högskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Logging functions
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+RCSID("$KTH: log.c,v 1.12 1998/07/09 19:57:26 art Exp $");
+#endif
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <roken.h>
+#include "log.h"
+
+/*
+ * The structure for each logging method.
+ */
+
+struct log_method {
+ char *name;
+ void (*open)(Log_method *, char *progname, char *fname);
+ void (*vprint)(Log_method *, char *, va_list);
+ void (*print)(Log_method *, char *);
+ void (*close)(Log_method *);
+ union {
+ void *v;
+ int i;
+ } data;
+ unsigned mask;
+};
+
+#if HAVE_SYSLOG
+static void log_open_syslog (Log_method *lm, char *progname, char *fname);
+
+static void log_close_syslog (Log_method *lm);
+#if HAVE_VSYSLOG
+static void log_vprint_syslog (Log_method *lm, char *, va_list);
+#else
+static void log_print_syslog (Log_method *lm, char *);
+#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_SYSLOG */
+
+static void
+log_open_stderr (Log_method *lm, char *progname, char *fname);
+
+static void
+log_open_file (Log_method *lm, char *progname, char *fname);
+
+static void
+log_close_file (Log_method *lm);
+
+static void
+log_vprint_file (Log_method *lm, char *, va_list);
+
+/*
+ * The names for which we do special handling in the logging routines.
+ */
+
+static
+Log_method special_names[] = {
+#if HAVE_SYSLOG
+{"syslog", log_open_syslog,
+#if HAVE_VSYSLOG
+ log_vprint_syslog, NULL
+#else
+ NULL, log_print_syslog
+#endif /* HAVE_VSYSLOG */
+ , log_close_syslog},
+#endif /* HAVE_SYSLOG */
+{"/dev/stderr", log_open_stderr, log_vprint_file, NULL, NULL},
+{NULL, log_open_file, log_vprint_file, NULL, log_close_file}
+/* Should be last */
+};
+
+#if HAVE_SYSLOG
+static void
+log_open_syslog (Log_method *lm, char *progname, char *fname)
+{
+ openlog (progname, LOG_PID, LOG_DAEMON);
+}
+
+#if HAVE_VSYSLOG
+
+static void
+log_vprint_syslog (Log_method *lm, char *fmt, va_list args)
+{
+ vsyslog (LOG_INFO, fmt, args);
+}
+#else
+
+static void
+log_print_syslog (Log_method *lm, char *str)
+{
+ syslog (LOG_INFO, str);
+}
+#endif /* HAVE_VSYSLOG */
+
+static void
+log_close_syslog (Log_method *lm)
+{
+ closelog ();
+}
+
+#endif /* HAVE_SYSLOG */
+
+static void
+log_open_stderr (Log_method *lm, char *progname, char *fname)
+{
+#if 0
+ lm = &special_names[sizeof(special_names) /
+ sizeof(*special_names) - 1];
+#endif
+ lm->data.v = stderr;
+}
+
+static void
+log_open_file (Log_method *lm, char *progname, char *fname)
+{
+ lm->data.v = (void *)fopen (fname, "a");
+ if (lm->data.v == NULL)
+ lm->data.v = stderr;
+}
+
+static void
+log_vprint_file (Log_method *lm, char *fmt, va_list args)
+{
+ struct timeval tv = { 0, 0 };
+ char *time;
+ time_t t;
+
+ gettimeofday(&tv, NULL);
+ t = tv.tv_sec;
+ time = strdup(ctime(&t));
+ if (time) {
+ time[strlen(time)-1] = '\0';
+ fprintf ((FILE *)lm->data.v, "%s: ", time);
+ free(time);
+ } else
+ fprintf ((FILE *)lm->data.v, "unknown time:");
+
+ fprintf ((FILE *)lm->data.v, "%s: ", __progname);
+ vfprintf ((FILE *)lm->data.v, fmt, args);
+ putc ('\n', (FILE *)lm->data.v);
+}
+
+static void
+log_close_file (Log_method *lm)
+{
+ fclose ((FILE *)lm->data.v);
+}
+
+Log_method *
+log_open (char *progname, char *fname)
+{
+ int i;
+ Log_method *log;
+
+ log = (Log_method *)malloc (sizeof(Log_method));
+ if (log == NULL)
+ return log;
+ for (i = 0; i < sizeof(special_names) / sizeof(*special_names);
+ ++i)
+ if (special_names[i].name == NULL
+ || strcmp (special_names[i].name, fname) == 0) {
+ *log = special_names[i];
+ break;
+ }
+ (*log->open)(log, progname, fname);
+ return log;
+}
+
+void
+log_set_mask (Log_method *log, unsigned m)
+{
+ log->mask = m;
+}
+
+unsigned
+log_get_mask (Log_method *log)
+{
+ return log->mask;
+}
+
+void
+log_vlog(Log_method *log, unsigned level, const char *fmt, va_list args)
+{
+ if (level & log->mask) {
+ if (log->vprint)
+ (*log->vprint)(log, (char *) fmt, args);
+ else {
+ char *buf;
+
+ vasprintf (&buf, fmt, args);
+ (*log->print)(log, buf);
+
+ free(buf);
+ }
+ }
+}
+
+
+void
+log_log (Log_method *log, unsigned level, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start (args, fmt);
+ log_vlog(log, level, fmt, args);
+ va_end (args);
+}
+
+void
+log_close (Log_method *log)
+{
+ (*log->close)(log);
+ free (log);
+}