1*08d0da61Sdv /* $OpenBSD: log.c,v 1.9 2023/09/26 01:53:54 dv Exp $ */
27da934edSreyk
37da934edSreyk /*
47da934edSreyk * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
57da934edSreyk *
67da934edSreyk * Permission to use, copy, modify, and distribute this software for any
77da934edSreyk * purpose with or without fee is hereby granted, provided that the above
87da934edSreyk * copyright notice and this permission notice appear in all copies.
97da934edSreyk *
107da934edSreyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
117da934edSreyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
127da934edSreyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
137da934edSreyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
147da934edSreyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
157da934edSreyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
167da934edSreyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
177da934edSreyk */
187da934edSreyk
197da934edSreyk #include <stdio.h>
207da934edSreyk #include <stdlib.h>
217da934edSreyk #include <stdarg.h>
227da934edSreyk #include <string.h>
237da934edSreyk #include <syslog.h>
247da934edSreyk #include <errno.h>
257da934edSreyk #include <time.h>
267da934edSreyk
27*08d0da61Sdv #include "proc.h"
28*08d0da61Sdv
29871fc12cSreyk static int debug;
30871fc12cSreyk static int verbose;
31*08d0da61Sdv static char log_procname[2048];
327da934edSreyk
337da934edSreyk void
log_init(int n_debug,int facility)347da934edSreyk log_init(int n_debug, int facility)
357da934edSreyk {
367da934edSreyk extern char *__progname;
377da934edSreyk
387da934edSreyk debug = n_debug;
397da934edSreyk verbose = n_debug;
40*08d0da61Sdv log_procinit("%s", __progname);
417da934edSreyk
427da934edSreyk if (!debug)
437da934edSreyk openlog(__progname, LOG_PID | LOG_NDELAY, facility);
447da934edSreyk
457da934edSreyk tzset();
467da934edSreyk }
477da934edSreyk
487da934edSreyk void
log_procinit(const char * fmt,...)49*08d0da61Sdv log_procinit(const char *fmt, ...)
507da934edSreyk {
51*08d0da61Sdv va_list ap;
52*08d0da61Sdv va_start(ap, fmt);
53*08d0da61Sdv vsnprintf(log_procname, sizeof(log_procname), fmt, ap);
54*08d0da61Sdv va_end(ap);
557da934edSreyk }
567da934edSreyk
577da934edSreyk void
log_setverbose(int v)58871fc12cSreyk log_setverbose(int v)
597da934edSreyk {
607da934edSreyk verbose = v;
617da934edSreyk }
627da934edSreyk
63871fc12cSreyk int
log_getverbose(void)64871fc12cSreyk log_getverbose(void)
65871fc12cSreyk {
66871fc12cSreyk return (verbose);
67871fc12cSreyk }
68871fc12cSreyk
697da934edSreyk void
logit(int pri,const char * fmt,...)707da934edSreyk logit(int pri, const char *fmt, ...)
717da934edSreyk {
727da934edSreyk va_list ap;
737da934edSreyk
747da934edSreyk va_start(ap, fmt);
757da934edSreyk vlog(pri, fmt, ap);
767da934edSreyk va_end(ap);
777da934edSreyk }
787da934edSreyk
797da934edSreyk void
vlog(int pri,const char * fmt,va_list ap)807da934edSreyk vlog(int pri, const char *fmt, va_list ap)
817da934edSreyk {
827da934edSreyk char *nfmt;
83db8420cbSreyk int saved_errno = errno;
847da934edSreyk
857da934edSreyk if (debug) {
867da934edSreyk /* best effort in out of mem situations */
87*08d0da61Sdv if (asprintf(&nfmt, "%s: %s\n", log_procname, fmt) == -1) {
887da934edSreyk vfprintf(stderr, fmt, ap);
897da934edSreyk fprintf(stderr, "\n");
907da934edSreyk } else {
917da934edSreyk vfprintf(stderr, nfmt, ap);
927da934edSreyk free(nfmt);
937da934edSreyk }
947da934edSreyk fflush(stderr);
957da934edSreyk } else
967da934edSreyk vsyslog(pri, fmt, ap);
977da934edSreyk
98db8420cbSreyk errno = saved_errno;
99db8420cbSreyk }
1007da934edSreyk
1017da934edSreyk void
log_warn(const char * emsg,...)1027da934edSreyk log_warn(const char *emsg, ...)
1037da934edSreyk {
1047da934edSreyk char *nfmt;
1057da934edSreyk va_list ap;
106cadeec72Sreyk int saved_errno = errno;
1077da934edSreyk
1087da934edSreyk /* best effort to even work in out of memory situations */
1097da934edSreyk if (emsg == NULL)
1109b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
1117da934edSreyk else {
1127da934edSreyk va_start(ap, emsg);
1137da934edSreyk
114cadeec72Sreyk if (asprintf(&nfmt, "%s: %s", emsg,
115cadeec72Sreyk strerror(saved_errno)) == -1) {
1167da934edSreyk /* we tried it... */
1179b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
1189b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
1197da934edSreyk } else {
1209b2c1562Sbluhm vlog(LOG_ERR, nfmt, ap);
1217da934edSreyk free(nfmt);
1227da934edSreyk }
1237da934edSreyk va_end(ap);
1247da934edSreyk }
125a4f3ffb8Sreyk
126a4f3ffb8Sreyk errno = saved_errno;
1277da934edSreyk }
1287da934edSreyk
1297da934edSreyk void
log_warnx(const char * emsg,...)1307da934edSreyk log_warnx(const char *emsg, ...)
1317da934edSreyk {
1327da934edSreyk va_list ap;
1337da934edSreyk
1347da934edSreyk va_start(ap, emsg);
1359b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
1367da934edSreyk va_end(ap);
1377da934edSreyk }
1387da934edSreyk
1397da934edSreyk void
log_info(const char * emsg,...)1407da934edSreyk log_info(const char *emsg, ...)
1417da934edSreyk {
1427da934edSreyk va_list ap;
1437da934edSreyk
1447da934edSreyk va_start(ap, emsg);
1457da934edSreyk vlog(LOG_INFO, emsg, ap);
1467da934edSreyk va_end(ap);
1477da934edSreyk }
1487da934edSreyk
1497da934edSreyk void
log_debug(const char * emsg,...)1507da934edSreyk log_debug(const char *emsg, ...)
1517da934edSreyk {
1527da934edSreyk va_list ap;
1537da934edSreyk
1547da934edSreyk if (verbose > 1) {
1557da934edSreyk va_start(ap, emsg);
1567da934edSreyk vlog(LOG_DEBUG, emsg, ap);
1577da934edSreyk va_end(ap);
1587da934edSreyk }
1597da934edSreyk }
1607da934edSreyk
1617da934edSreyk static void
vfatalc(int code,const char * emsg,va_list ap)162b7af0f14Sguenther vfatalc(int code, const char *emsg, va_list ap)
1637da934edSreyk {
1647da934edSreyk static char s[BUFSIZ];
1657da934edSreyk const char *sep;
1667da934edSreyk
1677da934edSreyk if (emsg != NULL) {
1687da934edSreyk (void)vsnprintf(s, sizeof(s), emsg, ap);
1697da934edSreyk sep = ": ";
1707da934edSreyk } else {
1717da934edSreyk s[0] = '\0';
1727da934edSreyk sep = "";
1737da934edSreyk }
174b7af0f14Sguenther if (code)
1752eb38aa0Sreyk logit(LOG_CRIT, "%s: %s%s%s",
176b7af0f14Sguenther log_procname, s, sep, strerror(code));
1777da934edSreyk else
1782eb38aa0Sreyk logit(LOG_CRIT, "%s%s%s", log_procname, sep, s);
1797da934edSreyk }
1807da934edSreyk
1817da934edSreyk void
fatal(const char * emsg,...)1827da934edSreyk fatal(const char *emsg, ...)
1837da934edSreyk {
1847da934edSreyk va_list ap;
1857da934edSreyk
1867da934edSreyk va_start(ap, emsg);
187b7af0f14Sguenther vfatalc(errno, emsg, ap);
1887da934edSreyk va_end(ap);
1897da934edSreyk exit(1);
1907da934edSreyk }
1917da934edSreyk
1927da934edSreyk void
fatalx(const char * emsg,...)1937da934edSreyk fatalx(const char *emsg, ...)
1947da934edSreyk {
1957da934edSreyk va_list ap;
1967da934edSreyk
1977da934edSreyk va_start(ap, emsg);
198b7af0f14Sguenther vfatalc(0, emsg, ap);
1997da934edSreyk va_end(ap);
2007da934edSreyk exit(1);
2017da934edSreyk }
202