1*9b2c1562Sbluhm /* $OpenBSD: log.c,v 1.4 2017/03/21 12:06:56 bluhm Exp $ */
2f6242408Spyr
3f6242408Spyr /*
4f6242408Spyr * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5f6242408Spyr *
6f6242408Spyr * Permission to use, copy, modify, and distribute this software for any
7f6242408Spyr * purpose with or without fee is hereby granted, provided that the above
8f6242408Spyr * copyright notice and this permission notice appear in all copies.
9f6242408Spyr *
10f6242408Spyr * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11f6242408Spyr * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12f6242408Spyr * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13f6242408Spyr * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
140be9c890Sbenno * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
150be9c890Sbenno * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
160be9c890Sbenno * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f6242408Spyr */
18f6242408Spyr
19f6242408Spyr #include <errno.h>
20f6242408Spyr #include <stdarg.h>
21f6242408Spyr #include <stdio.h>
22f6242408Spyr #include <stdlib.h>
23f6242408Spyr #include <string.h>
24f6242408Spyr #include <syslog.h>
25e83a889dSderaadt #include <time.h>
260be9c890Sbenno #include <unistd.h>
27f6242408Spyr
280be9c890Sbenno #include "log.h"
29f6242408Spyr
30f6242408Spyr int debug;
310be9c890Sbenno int verbose;
320be9c890Sbenno const char *log_procname;
33f6242408Spyr
34f6242408Spyr void
log_init(int n_debug)35f6242408Spyr log_init(int n_debug)
36f6242408Spyr {
37f6242408Spyr extern char *__progname;
38f6242408Spyr
39f6242408Spyr debug = n_debug;
40f6242408Spyr
41f6242408Spyr if (!debug)
42f6242408Spyr openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
43f6242408Spyr
44f6242408Spyr tzset();
45f6242408Spyr }
46f6242408Spyr
47f6242408Spyr void
log_verbose(int v)480be9c890Sbenno log_verbose(int v)
490be9c890Sbenno {
500be9c890Sbenno verbose = v;
510be9c890Sbenno }
520be9c890Sbenno
530be9c890Sbenno void
logit(int pri,const char * fmt,...)54f6242408Spyr logit(int pri, const char *fmt, ...)
55f6242408Spyr {
56f6242408Spyr va_list ap;
57f6242408Spyr
58f6242408Spyr va_start(ap, fmt);
59f6242408Spyr vlog(pri, fmt, ap);
60f6242408Spyr va_end(ap);
61f6242408Spyr }
62f6242408Spyr
63f6242408Spyr void
vlog(int pri,const char * fmt,va_list ap)64f6242408Spyr vlog(int pri, const char *fmt, va_list ap)
65f6242408Spyr {
66f6242408Spyr char *nfmt;
67f6242408Spyr
68f6242408Spyr if (debug) {
69f6242408Spyr /* best effort in out of mem situations */
70f6242408Spyr if (asprintf(&nfmt, "%s\n", fmt) == -1) {
71f6242408Spyr vfprintf(stderr, fmt, ap);
72f6242408Spyr fprintf(stderr, "\n");
73f6242408Spyr } else {
74f6242408Spyr vfprintf(stderr, nfmt, ap);
75f6242408Spyr free(nfmt);
76f6242408Spyr }
77f6242408Spyr fflush(stderr);
78f6242408Spyr } else
79f6242408Spyr vsyslog(pri, fmt, ap);
80f6242408Spyr }
81f6242408Spyr
82f6242408Spyr void
log_warn(const char * emsg,...)83f6242408Spyr log_warn(const char *emsg, ...)
84f6242408Spyr {
85f6242408Spyr char *nfmt;
86f6242408Spyr va_list ap;
87f6242408Spyr
88f6242408Spyr /* best effort to even work in out of memory situations */
89f6242408Spyr if (emsg == NULL)
90*9b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
91f6242408Spyr else {
92f6242408Spyr va_start(ap, emsg);
93f6242408Spyr
94f6242408Spyr if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
95f6242408Spyr /* we tried it... */
96*9b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
97*9b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
98f6242408Spyr } else {
99*9b2c1562Sbluhm vlog(LOG_ERR, nfmt, ap);
100f6242408Spyr free(nfmt);
101f6242408Spyr }
102f6242408Spyr va_end(ap);
103f6242408Spyr }
104f6242408Spyr }
105f6242408Spyr
106f6242408Spyr void
log_warnx(const char * emsg,...)107f6242408Spyr log_warnx(const char *emsg, ...)
108f6242408Spyr {
109f6242408Spyr va_list ap;
110f6242408Spyr
111f6242408Spyr va_start(ap, emsg);
112*9b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
113f6242408Spyr va_end(ap);
114f6242408Spyr }
115f6242408Spyr
116f6242408Spyr void
log_info(const char * emsg,...)117f6242408Spyr log_info(const char *emsg, ...)
118f6242408Spyr {
119f6242408Spyr va_list ap;
120f6242408Spyr
121f6242408Spyr va_start(ap, emsg);
122f6242408Spyr vlog(LOG_INFO, emsg, ap);
123f6242408Spyr va_end(ap);
124f6242408Spyr }
125f6242408Spyr
126f6242408Spyr void
log_debug(const char * emsg,...)127f6242408Spyr log_debug(const char *emsg, ...)
128f6242408Spyr {
129f6242408Spyr va_list ap;
130f6242408Spyr
1310be9c890Sbenno if (verbose) {
132f6242408Spyr va_start(ap, emsg);
133f6242408Spyr vlog(LOG_DEBUG, emsg, ap);
134f6242408Spyr va_end(ap);
135f6242408Spyr }
136f6242408Spyr }
137f6242408Spyr
138f6242408Spyr void
fatal(const char * emsg)139f6242408Spyr fatal(const char *emsg)
140f6242408Spyr {
141f6242408Spyr if (emsg == NULL)
1420be9c890Sbenno logit(LOG_CRIT, "fatal in %s: %s", log_procname,
1430be9c890Sbenno strerror(errno));
144f6242408Spyr else
145f6242408Spyr if (errno)
1460be9c890Sbenno logit(LOG_CRIT, "fatal in %s: %s: %s",
1470be9c890Sbenno log_procname, emsg, strerror(errno));
148f6242408Spyr else
1490be9c890Sbenno logit(LOG_CRIT, "fatal in %s: %s",
1500be9c890Sbenno log_procname, emsg);
151f6242408Spyr
152f6242408Spyr exit(1);
153f6242408Spyr }
154f6242408Spyr
155f6242408Spyr void
fatalx(const char * emsg)156f6242408Spyr fatalx(const char *emsg)
157f6242408Spyr {
158f6242408Spyr errno = 0;
159f6242408Spyr fatal(emsg);
160f6242408Spyr }
161