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