1*89044269Sbluhm /* $OpenBSD: log.c,v 1.2 2017/03/21 12:38:23 bluhm Exp $ */
29cbab583Srzalamena
39cbab583Srzalamena /*
49cbab583Srzalamena * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
59cbab583Srzalamena *
69cbab583Srzalamena * Permission to use, copy, modify, and distribute this software for any
79cbab583Srzalamena * purpose with or without fee is hereby granted, provided that the above
89cbab583Srzalamena * copyright notice and this permission notice appear in all copies.
99cbab583Srzalamena *
109cbab583Srzalamena * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
119cbab583Srzalamena * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
129cbab583Srzalamena * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
139cbab583Srzalamena * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
149cbab583Srzalamena * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
159cbab583Srzalamena * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
169cbab583Srzalamena * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
179cbab583Srzalamena */
189cbab583Srzalamena
199cbab583Srzalamena #include <stdio.h>
209cbab583Srzalamena #include <stdlib.h>
219cbab583Srzalamena #include <stdarg.h>
229cbab583Srzalamena #include <string.h>
239cbab583Srzalamena #include <syslog.h>
249cbab583Srzalamena #include <errno.h>
259cbab583Srzalamena #include <time.h>
269cbab583Srzalamena
279cbab583Srzalamena #include "log.h"
289cbab583Srzalamena
299cbab583Srzalamena static int debug;
309cbab583Srzalamena static int verbose;
319cbab583Srzalamena static const char *log_procname;
329cbab583Srzalamena
339cbab583Srzalamena void
log_init(int n_debug,int facility)349cbab583Srzalamena log_init(int n_debug, int facility)
359cbab583Srzalamena {
369cbab583Srzalamena extern char *__progname;
379cbab583Srzalamena
389cbab583Srzalamena debug = n_debug;
399cbab583Srzalamena verbose = n_debug;
409cbab583Srzalamena log_procinit(__progname);
419cbab583Srzalamena
429cbab583Srzalamena if (!debug)
439cbab583Srzalamena openlog(__progname, LOG_PID | LOG_NDELAY, facility);
449cbab583Srzalamena
459cbab583Srzalamena tzset();
469cbab583Srzalamena }
479cbab583Srzalamena
489cbab583Srzalamena void
log_procinit(const char * procname)499cbab583Srzalamena log_procinit(const char *procname)
509cbab583Srzalamena {
519cbab583Srzalamena if (procname != NULL)
529cbab583Srzalamena log_procname = procname;
539cbab583Srzalamena }
549cbab583Srzalamena
559cbab583Srzalamena void
log_setverbose(int v)569cbab583Srzalamena log_setverbose(int v)
579cbab583Srzalamena {
589cbab583Srzalamena verbose = v;
599cbab583Srzalamena }
609cbab583Srzalamena
619cbab583Srzalamena int
log_getverbose(void)629cbab583Srzalamena log_getverbose(void)
639cbab583Srzalamena {
649cbab583Srzalamena return (verbose);
659cbab583Srzalamena }
669cbab583Srzalamena
679cbab583Srzalamena void
logit(int pri,const char * fmt,...)689cbab583Srzalamena logit(int pri, const char *fmt, ...)
699cbab583Srzalamena {
709cbab583Srzalamena va_list ap;
719cbab583Srzalamena
729cbab583Srzalamena va_start(ap, fmt);
739cbab583Srzalamena vlog(pri, fmt, ap);
749cbab583Srzalamena va_end(ap);
759cbab583Srzalamena }
769cbab583Srzalamena
779cbab583Srzalamena void
vlog(int pri,const char * fmt,va_list ap)789cbab583Srzalamena vlog(int pri, const char *fmt, va_list ap)
799cbab583Srzalamena {
809cbab583Srzalamena char *nfmt;
819cbab583Srzalamena int saved_errno = errno;
829cbab583Srzalamena
839cbab583Srzalamena if (debug) {
849cbab583Srzalamena /* best effort in out of mem situations */
859cbab583Srzalamena if (asprintf(&nfmt, "%s\n", fmt) == -1) {
869cbab583Srzalamena vfprintf(stderr, fmt, ap);
879cbab583Srzalamena fprintf(stderr, "\n");
889cbab583Srzalamena } else {
899cbab583Srzalamena vfprintf(stderr, nfmt, ap);
909cbab583Srzalamena free(nfmt);
919cbab583Srzalamena }
929cbab583Srzalamena fflush(stderr);
939cbab583Srzalamena } else
949cbab583Srzalamena vsyslog(pri, fmt, ap);
959cbab583Srzalamena
969cbab583Srzalamena errno = saved_errno;
979cbab583Srzalamena }
989cbab583Srzalamena
999cbab583Srzalamena void
log_warn(const char * emsg,...)1009cbab583Srzalamena log_warn(const char *emsg, ...)
1019cbab583Srzalamena {
1029cbab583Srzalamena char *nfmt;
1039cbab583Srzalamena va_list ap;
1049cbab583Srzalamena int saved_errno = errno;
1059cbab583Srzalamena
1069cbab583Srzalamena /* best effort to even work in out of memory situations */
1079cbab583Srzalamena if (emsg == NULL)
108*89044269Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
1099cbab583Srzalamena else {
1109cbab583Srzalamena va_start(ap, emsg);
1119cbab583Srzalamena
1129cbab583Srzalamena if (asprintf(&nfmt, "%s: %s", emsg,
1139cbab583Srzalamena strerror(saved_errno)) == -1) {
1149cbab583Srzalamena /* we tried it... */
115*89044269Sbluhm vlog(LOG_ERR, emsg, ap);
116*89044269Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
1179cbab583Srzalamena } else {
118*89044269Sbluhm vlog(LOG_ERR, nfmt, ap);
1199cbab583Srzalamena free(nfmt);
1209cbab583Srzalamena }
1219cbab583Srzalamena va_end(ap);
1229cbab583Srzalamena }
1239cbab583Srzalamena
1249cbab583Srzalamena errno = saved_errno;
1259cbab583Srzalamena }
1269cbab583Srzalamena
1279cbab583Srzalamena void
log_warnx(const char * emsg,...)1289cbab583Srzalamena log_warnx(const char *emsg, ...)
1299cbab583Srzalamena {
1309cbab583Srzalamena va_list ap;
1319cbab583Srzalamena
1329cbab583Srzalamena va_start(ap, emsg);
133*89044269Sbluhm vlog(LOG_ERR, emsg, ap);
1349cbab583Srzalamena va_end(ap);
1359cbab583Srzalamena }
1369cbab583Srzalamena
1379cbab583Srzalamena void
log_info(const char * emsg,...)1389cbab583Srzalamena log_info(const char *emsg, ...)
1399cbab583Srzalamena {
1409cbab583Srzalamena va_list ap;
1419cbab583Srzalamena
1429cbab583Srzalamena va_start(ap, emsg);
1439cbab583Srzalamena vlog(LOG_INFO, emsg, ap);
1449cbab583Srzalamena va_end(ap);
1459cbab583Srzalamena }
1469cbab583Srzalamena
1479cbab583Srzalamena void
log_debug(const char * emsg,...)1489cbab583Srzalamena log_debug(const char *emsg, ...)
1499cbab583Srzalamena {
1509cbab583Srzalamena va_list ap;
1519cbab583Srzalamena
1529cbab583Srzalamena if (verbose) {
1539cbab583Srzalamena va_start(ap, emsg);
1549cbab583Srzalamena vlog(LOG_DEBUG, emsg, ap);
1559cbab583Srzalamena va_end(ap);
1569cbab583Srzalamena }
1579cbab583Srzalamena }
1589cbab583Srzalamena
1599cbab583Srzalamena static void
vfatalc(int code,const char * emsg,va_list ap)1609cbab583Srzalamena vfatalc(int code, const char *emsg, va_list ap)
1619cbab583Srzalamena {
1629cbab583Srzalamena static char s[BUFSIZ];
1639cbab583Srzalamena const char *sep;
1649cbab583Srzalamena
1659cbab583Srzalamena if (emsg != NULL) {
1669cbab583Srzalamena (void)vsnprintf(s, sizeof(s), emsg, ap);
1679cbab583Srzalamena sep = ": ";
1689cbab583Srzalamena } else {
1699cbab583Srzalamena s[0] = '\0';
1709cbab583Srzalamena sep = "";
1719cbab583Srzalamena }
1729cbab583Srzalamena if (code)
1739cbab583Srzalamena logit(LOG_CRIT, "fatal in %s: %s%s%s",
1749cbab583Srzalamena log_procname, s, sep, strerror(code));
1759cbab583Srzalamena else
1769cbab583Srzalamena logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
1779cbab583Srzalamena }
1789cbab583Srzalamena
1799cbab583Srzalamena void
fatal(const char * emsg,...)1809cbab583Srzalamena fatal(const char *emsg, ...)
1819cbab583Srzalamena {
1829cbab583Srzalamena va_list ap;
1839cbab583Srzalamena
1849cbab583Srzalamena va_start(ap, emsg);
1859cbab583Srzalamena vfatalc(errno, emsg, ap);
1869cbab583Srzalamena va_end(ap);
1879cbab583Srzalamena exit(1);
1889cbab583Srzalamena }
1899cbab583Srzalamena
1909cbab583Srzalamena void
fatalx(const char * emsg,...)1919cbab583Srzalamena fatalx(const char *emsg, ...)
1929cbab583Srzalamena {
1939cbab583Srzalamena va_list ap;
1949cbab583Srzalamena
1959cbab583Srzalamena va_start(ap, emsg);
1969cbab583Srzalamena vfatalc(0, emsg, ap);
1979cbab583Srzalamena va_end(ap);
1989cbab583Srzalamena exit(1);
1999cbab583Srzalamena }
200