1*9b2c1562Sbluhm /* $OpenBSD: log.c,v 1.2 2017/03/21 12:06:55 bluhm Exp $ */
2986dbb4cSkrw
3986dbb4cSkrw /*
4986dbb4cSkrw * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5986dbb4cSkrw *
6986dbb4cSkrw * Permission to use, copy, modify, and distribute this software for any
7986dbb4cSkrw * purpose with or without fee is hereby granted, provided that the above
8986dbb4cSkrw * copyright notice and this permission notice appear in all copies.
9986dbb4cSkrw *
10986dbb4cSkrw * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11986dbb4cSkrw * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12986dbb4cSkrw * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13986dbb4cSkrw * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14986dbb4cSkrw * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15986dbb4cSkrw * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16986dbb4cSkrw * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17986dbb4cSkrw */
18986dbb4cSkrw
19986dbb4cSkrw #include <stdio.h>
20986dbb4cSkrw #include <stdlib.h>
21986dbb4cSkrw #include <stdarg.h>
22986dbb4cSkrw #include <string.h>
23986dbb4cSkrw #include <syslog.h>
24986dbb4cSkrw #include <errno.h>
25986dbb4cSkrw #include <time.h>
26986dbb4cSkrw
27986dbb4cSkrw #include "log.h"
28986dbb4cSkrw
29986dbb4cSkrw static int debug;
30986dbb4cSkrw static int verbose;
31986dbb4cSkrw static const char *log_procname;
32986dbb4cSkrw
33986dbb4cSkrw void
log_init(int n_debug,int facility)34986dbb4cSkrw log_init(int n_debug, int facility)
35986dbb4cSkrw {
36986dbb4cSkrw extern char *__progname;
37986dbb4cSkrw
38986dbb4cSkrw debug = n_debug;
39986dbb4cSkrw verbose = n_debug;
40986dbb4cSkrw log_procinit(__progname);
41986dbb4cSkrw
42986dbb4cSkrw if (!debug)
43986dbb4cSkrw openlog(__progname, LOG_PID | LOG_NDELAY, facility);
44986dbb4cSkrw
45986dbb4cSkrw tzset();
46986dbb4cSkrw }
47986dbb4cSkrw
48986dbb4cSkrw void
log_procinit(const char * procname)49986dbb4cSkrw log_procinit(const char *procname)
50986dbb4cSkrw {
51986dbb4cSkrw if (procname != NULL)
52986dbb4cSkrw log_procname = procname;
53986dbb4cSkrw }
54986dbb4cSkrw
55986dbb4cSkrw void
log_setverbose(int v)56986dbb4cSkrw log_setverbose(int v)
57986dbb4cSkrw {
58986dbb4cSkrw verbose = v;
59986dbb4cSkrw }
60986dbb4cSkrw
61986dbb4cSkrw int
log_getverbose(void)62986dbb4cSkrw log_getverbose(void)
63986dbb4cSkrw {
64986dbb4cSkrw return (verbose);
65986dbb4cSkrw }
66986dbb4cSkrw
67986dbb4cSkrw void
logit(int pri,const char * fmt,...)68986dbb4cSkrw logit(int pri, const char *fmt, ...)
69986dbb4cSkrw {
70986dbb4cSkrw va_list ap;
71986dbb4cSkrw
72986dbb4cSkrw va_start(ap, fmt);
73986dbb4cSkrw vlog(pri, fmt, ap);
74986dbb4cSkrw va_end(ap);
75986dbb4cSkrw }
76986dbb4cSkrw
77986dbb4cSkrw void
vlog(int pri,const char * fmt,va_list ap)78986dbb4cSkrw vlog(int pri, const char *fmt, va_list ap)
79986dbb4cSkrw {
80986dbb4cSkrw char *nfmt;
81986dbb4cSkrw int saved_errno = errno;
82986dbb4cSkrw
83986dbb4cSkrw if (debug) {
84986dbb4cSkrw /* best effort in out of mem situations */
85986dbb4cSkrw if (asprintf(&nfmt, "%s\n", fmt) == -1) {
86986dbb4cSkrw vfprintf(stderr, fmt, ap);
87986dbb4cSkrw fprintf(stderr, "\n");
88986dbb4cSkrw } else {
89986dbb4cSkrw vfprintf(stderr, nfmt, ap);
90986dbb4cSkrw free(nfmt);
91986dbb4cSkrw }
92986dbb4cSkrw fflush(stderr);
93986dbb4cSkrw } else
94986dbb4cSkrw vsyslog(pri, fmt, ap);
95986dbb4cSkrw
96986dbb4cSkrw errno = saved_errno;
97986dbb4cSkrw }
98986dbb4cSkrw
99986dbb4cSkrw void
log_warn(const char * emsg,...)100986dbb4cSkrw log_warn(const char *emsg, ...)
101986dbb4cSkrw {
102986dbb4cSkrw char *nfmt;
103986dbb4cSkrw va_list ap;
104986dbb4cSkrw int saved_errno = errno;
105986dbb4cSkrw
106986dbb4cSkrw /* best effort to even work in out of memory situations */
107986dbb4cSkrw if (emsg == NULL)
108*9b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
109986dbb4cSkrw else {
110986dbb4cSkrw va_start(ap, emsg);
111986dbb4cSkrw
112986dbb4cSkrw if (asprintf(&nfmt, "%s: %s", emsg,
113986dbb4cSkrw strerror(saved_errno)) == -1) {
114986dbb4cSkrw /* we tried it... */
115*9b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
116*9b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(saved_errno));
117986dbb4cSkrw } else {
118*9b2c1562Sbluhm vlog(LOG_ERR, nfmt, ap);
119986dbb4cSkrw free(nfmt);
120986dbb4cSkrw }
121986dbb4cSkrw va_end(ap);
122986dbb4cSkrw }
123986dbb4cSkrw
124986dbb4cSkrw errno = saved_errno;
125986dbb4cSkrw }
126986dbb4cSkrw
127986dbb4cSkrw void
log_warnx(const char * emsg,...)128986dbb4cSkrw log_warnx(const char *emsg, ...)
129986dbb4cSkrw {
130986dbb4cSkrw va_list ap;
131986dbb4cSkrw
132986dbb4cSkrw va_start(ap, emsg);
133*9b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
134986dbb4cSkrw va_end(ap);
135986dbb4cSkrw }
136986dbb4cSkrw
137986dbb4cSkrw void
log_info(const char * emsg,...)138986dbb4cSkrw log_info(const char *emsg, ...)
139986dbb4cSkrw {
140986dbb4cSkrw va_list ap;
141986dbb4cSkrw
142986dbb4cSkrw va_start(ap, emsg);
143986dbb4cSkrw vlog(LOG_INFO, emsg, ap);
144986dbb4cSkrw va_end(ap);
145986dbb4cSkrw }
146986dbb4cSkrw
147986dbb4cSkrw void
log_debug(const char * emsg,...)148986dbb4cSkrw log_debug(const char *emsg, ...)
149986dbb4cSkrw {
150986dbb4cSkrw va_list ap;
151986dbb4cSkrw
152986dbb4cSkrw if (verbose) {
153986dbb4cSkrw va_start(ap, emsg);
154986dbb4cSkrw vlog(LOG_DEBUG, emsg, ap);
155986dbb4cSkrw va_end(ap);
156986dbb4cSkrw }
157986dbb4cSkrw }
158986dbb4cSkrw
159986dbb4cSkrw static void
vfatalc(int code,const char * emsg,va_list ap)160986dbb4cSkrw vfatalc(int code, const char *emsg, va_list ap)
161986dbb4cSkrw {
162986dbb4cSkrw static char s[BUFSIZ];
163986dbb4cSkrw const char *sep;
164986dbb4cSkrw
165986dbb4cSkrw if (emsg != NULL) {
166986dbb4cSkrw (void)vsnprintf(s, sizeof(s), emsg, ap);
167986dbb4cSkrw sep = ": ";
168986dbb4cSkrw } else {
169986dbb4cSkrw s[0] = '\0';
170986dbb4cSkrw sep = "";
171986dbb4cSkrw }
172986dbb4cSkrw if (code)
173986dbb4cSkrw logit(LOG_CRIT, "fatal in %s: %s%s%s",
174986dbb4cSkrw log_procname, s, sep, strerror(code));
175986dbb4cSkrw else
176986dbb4cSkrw logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
177986dbb4cSkrw }
178986dbb4cSkrw
179986dbb4cSkrw void
fatal(const char * emsg,...)180986dbb4cSkrw fatal(const char *emsg, ...)
181986dbb4cSkrw {
182986dbb4cSkrw va_list ap;
183986dbb4cSkrw
184986dbb4cSkrw va_start(ap, emsg);
185986dbb4cSkrw vfatalc(errno, emsg, ap);
186986dbb4cSkrw va_end(ap);
187986dbb4cSkrw exit(1);
188986dbb4cSkrw }
189986dbb4cSkrw
190986dbb4cSkrw void
fatalx(const char * emsg,...)191986dbb4cSkrw fatalx(const char *emsg, ...)
192986dbb4cSkrw {
193986dbb4cSkrw va_list ap;
194986dbb4cSkrw
195986dbb4cSkrw va_start(ap, emsg);
196986dbb4cSkrw vfatalc(0, emsg, ap);
197986dbb4cSkrw va_end(ap);
198986dbb4cSkrw exit(1);
199986dbb4cSkrw }
200