1*c12a113bSclaudio /* $OpenBSD: log.c,v 1.7 2021/01/19 11:39:13 claudio Exp $ */
2978e5cffSnorby
3978e5cffSnorby /*
4978e5cffSnorby * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5978e5cffSnorby *
6978e5cffSnorby * Permission to use, copy, modify, and distribute this software for any
7978e5cffSnorby * purpose with or without fee is hereby granted, provided that the above
8978e5cffSnorby * copyright notice and this permission notice appear in all copies.
9978e5cffSnorby *
10978e5cffSnorby * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11978e5cffSnorby * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12978e5cffSnorby * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13978e5cffSnorby * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14978e5cffSnorby * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15978e5cffSnorby * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16978e5cffSnorby * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17978e5cffSnorby */
18978e5cffSnorby
19978e5cffSnorby #include <errno.h>
20978e5cffSnorby #include <stdarg.h>
21978e5cffSnorby #include <stdio.h>
22978e5cffSnorby #include <stdlib.h>
23978e5cffSnorby #include <string.h>
24978e5cffSnorby #include <syslog.h>
252e743b2fSbenno #include <time.h>
26978e5cffSnorby #include <unistd.h>
27978e5cffSnorby
282e743b2fSbenno #include "log.h"
29978e5cffSnorby #include "igmp.h"
30978e5cffSnorby #include "dvmrpd.h"
31978e5cffSnorby
32978e5cffSnorby int debug;
3320d80477Sclaudio int verbose;
342e743b2fSbenno const char *log_procname;
35978e5cffSnorby
36978e5cffSnorby void
log_init(int n_debug)37978e5cffSnorby log_init(int n_debug)
38978e5cffSnorby {
39978e5cffSnorby extern char *__progname;
40978e5cffSnorby
41978e5cffSnorby debug = n_debug;
42978e5cffSnorby
43978e5cffSnorby if (!debug)
44978e5cffSnorby openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
45978e5cffSnorby
46978e5cffSnorby tzset();
47978e5cffSnorby }
48978e5cffSnorby
49978e5cffSnorby void
log_verbose(int v)5020d80477Sclaudio log_verbose(int v)
5120d80477Sclaudio {
5220d80477Sclaudio verbose = v;
5320d80477Sclaudio }
5420d80477Sclaudio
5520d80477Sclaudio void
logit(int pri,const char * fmt,...)56978e5cffSnorby logit(int pri, const char *fmt, ...)
57978e5cffSnorby {
58978e5cffSnorby va_list ap;
59978e5cffSnorby
60978e5cffSnorby va_start(ap, fmt);
61978e5cffSnorby vlog(pri, fmt, ap);
62978e5cffSnorby va_end(ap);
63978e5cffSnorby }
64978e5cffSnorby
65978e5cffSnorby void
vlog(int pri,const char * fmt,va_list ap)66978e5cffSnorby vlog(int pri, const char *fmt, va_list ap)
67978e5cffSnorby {
68978e5cffSnorby char *nfmt;
69978e5cffSnorby
70978e5cffSnorby if (debug) {
71978e5cffSnorby /* best effort in out of mem situations */
72978e5cffSnorby if (asprintf(&nfmt, "%s\n", fmt) == -1) {
73978e5cffSnorby vfprintf(stderr, fmt, ap);
74978e5cffSnorby fprintf(stderr, "\n");
75978e5cffSnorby } else {
76978e5cffSnorby vfprintf(stderr, nfmt, ap);
77978e5cffSnorby free(nfmt);
78978e5cffSnorby }
79978e5cffSnorby fflush(stderr);
80978e5cffSnorby } else
81978e5cffSnorby vsyslog(pri, fmt, ap);
82978e5cffSnorby }
83978e5cffSnorby
84978e5cffSnorby void
log_warn(const char * emsg,...)85978e5cffSnorby log_warn(const char *emsg, ...)
86978e5cffSnorby {
87978e5cffSnorby char *nfmt;
88978e5cffSnorby va_list ap;
89978e5cffSnorby
90978e5cffSnorby /* best effort to even work in out of memory situations */
91978e5cffSnorby if (emsg == NULL)
929b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
93978e5cffSnorby else {
94978e5cffSnorby va_start(ap, emsg);
95978e5cffSnorby
96978e5cffSnorby if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
97978e5cffSnorby /* we tried it... */
989b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
999b2c1562Sbluhm logit(LOG_ERR, "%s", strerror(errno));
100978e5cffSnorby } else {
1019b2c1562Sbluhm vlog(LOG_ERR, nfmt, ap);
102978e5cffSnorby free(nfmt);
103978e5cffSnorby }
104978e5cffSnorby va_end(ap);
105978e5cffSnorby }
106978e5cffSnorby }
107978e5cffSnorby
108978e5cffSnorby void
log_warnx(const char * emsg,...)109978e5cffSnorby log_warnx(const char *emsg, ...)
110978e5cffSnorby {
111978e5cffSnorby va_list ap;
112978e5cffSnorby
113978e5cffSnorby va_start(ap, emsg);
1149b2c1562Sbluhm vlog(LOG_ERR, emsg, ap);
115978e5cffSnorby va_end(ap);
116978e5cffSnorby }
117978e5cffSnorby
118978e5cffSnorby void
log_info(const char * emsg,...)119978e5cffSnorby log_info(const char *emsg, ...)
120978e5cffSnorby {
121978e5cffSnorby va_list ap;
122978e5cffSnorby
123978e5cffSnorby va_start(ap, emsg);
124978e5cffSnorby vlog(LOG_INFO, emsg, ap);
125978e5cffSnorby va_end(ap);
126978e5cffSnorby }
127978e5cffSnorby
128978e5cffSnorby void
log_debug(const char * emsg,...)129978e5cffSnorby log_debug(const char *emsg, ...)
130978e5cffSnorby {
131978e5cffSnorby va_list ap;
132978e5cffSnorby
13320d80477Sclaudio if (verbose) {
134978e5cffSnorby va_start(ap, emsg);
135978e5cffSnorby vlog(LOG_DEBUG, emsg, ap);
136978e5cffSnorby va_end(ap);
137978e5cffSnorby }
138978e5cffSnorby }
139978e5cffSnorby
140978e5cffSnorby void
fatal(const char * emsg)141978e5cffSnorby fatal(const char *emsg)
142978e5cffSnorby {
143978e5cffSnorby if (emsg == NULL)
1442e743b2fSbenno logit(LOG_CRIT, "fatal in %s: %s", log_procname,
145978e5cffSnorby strerror(errno));
146978e5cffSnorby else
147978e5cffSnorby if (errno)
148978e5cffSnorby logit(LOG_CRIT, "fatal in %s: %s: %s",
1492e743b2fSbenno log_procname, emsg, strerror(errno));
150978e5cffSnorby else
151978e5cffSnorby logit(LOG_CRIT, "fatal in %s: %s",
1522e743b2fSbenno log_procname, emsg);
153978e5cffSnorby
154978e5cffSnorby exit(1);
155978e5cffSnorby }
156978e5cffSnorby
157978e5cffSnorby void
fatalx(const char * emsg)158978e5cffSnorby fatalx(const char *emsg)
159978e5cffSnorby {
160978e5cffSnorby errno = 0;
161978e5cffSnorby fatal(emsg);
162978e5cffSnorby }
163