xref: /openbsd-src/usr.sbin/snmpd/log.c (revision 6f05df2d9be0954bec42d51d943d77bd250fb664)
1 /*	$OpenBSD: log.c,v 1.5 2014/10/25 03:23:49 lteo Exp $	*/
2 
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/param.h>
21 #include <sys/queue.h>
22 #include <sys/socket.h>
23 #include <sys/tree.h>
24 
25 #include <netinet/in.h>
26 #include <netinet/ip.h>
27 #include <net/if.h>
28 
29 #include <arpa/inet.h>
30 
31 #include <errno.h>
32 #include <stdarg.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <syslog.h>
37 #include <event.h>
38 #include <netdb.h>
39 
40 #include <openssl/ssl.h>
41 
42 #include "snmpd.h"
43 
44 int	 debug;
45 int	 verbose;
46 
47 void	 vlog(int, const char *, va_list);
48 void	 logit(int, const char *, ...);
49 
50 void
51 log_init(int n_debug)
52 {
53 	extern char	*__progname;
54 
55 	debug = n_debug;
56 	verbose = n_debug;
57 
58 	if (!debug)
59 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
60 
61 	tzset();
62 }
63 
64 void
65 log_verbose(int v)
66 {
67 	verbose = v;
68 }
69 
70 void
71 logit(int pri, const char *fmt, ...)
72 {
73 	va_list	ap;
74 
75 	va_start(ap, fmt);
76 	vlog(pri, fmt, ap);
77 	va_end(ap);
78 }
79 
80 void
81 vlog(int pri, const char *fmt, va_list ap)
82 {
83 	char	*nfmt;
84 
85 	if (debug) {
86 		/* best effort in out of mem situations */
87 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
88 			vfprintf(stderr, fmt, ap);
89 			fprintf(stderr, "\n");
90 		} else {
91 			vfprintf(stderr, nfmt, ap);
92 			free(nfmt);
93 		}
94 		fflush(stderr);
95 	} else
96 		vsyslog(pri, fmt, ap);
97 }
98 
99 
100 void
101 log_warn(const char *emsg, ...)
102 {
103 	char	*nfmt;
104 	va_list	 ap;
105 
106 	/* best effort to even work in out of memory situations */
107 	if (emsg == NULL)
108 		logit(LOG_CRIT, "%s", strerror(errno));
109 	else {
110 		va_start(ap, emsg);
111 
112 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
113 			/* we tried it... */
114 			vlog(LOG_CRIT, emsg, ap);
115 			logit(LOG_CRIT, "%s", strerror(errno));
116 		} else {
117 			vlog(LOG_CRIT, nfmt, ap);
118 			free(nfmt);
119 		}
120 		va_end(ap);
121 	}
122 }
123 
124 void
125 log_warnx(const char *emsg, ...)
126 {
127 	va_list	 ap;
128 
129 	va_start(ap, emsg);
130 	vlog(LOG_CRIT, emsg, ap);
131 	va_end(ap);
132 }
133 
134 void
135 log_info(const char *emsg, ...)
136 {
137 	va_list	 ap;
138 
139 	va_start(ap, emsg);
140 	vlog(LOG_INFO, emsg, ap);
141 	va_end(ap);
142 }
143 
144 void
145 log_debug(const char *emsg, ...)
146 {
147 	va_list	 ap;
148 
149 	if (verbose > 1) {
150 		va_start(ap, emsg);
151 		vlog(LOG_DEBUG, emsg, ap);
152 		va_end(ap);
153 	}
154 }
155 
156 void
157 print_debug(const char *emsg, ...)
158 {
159 	va_list	 ap;
160 
161 	if (debug && verbose > 2) {
162 		va_start(ap, emsg);
163 		vfprintf(stderr, emsg, ap);
164 		va_end(ap);
165 	}
166 }
167 
168 void
169 print_verbose(const char *emsg, ...)
170 {
171 	va_list	 ap;
172 
173 	if (verbose) {
174 		va_start(ap, emsg);
175 		vfprintf(stderr, emsg, ap);
176 		va_end(ap);
177 	}
178 }
179 
180 void
181 fatal(const char *emsg)
182 {
183 	if (emsg == NULL)
184 		logit(LOG_CRIT, "fatal: %s", strerror(errno));
185 	else {
186 		if (errno)
187 			logit(LOG_CRIT, "fatal: %s: %s",
188 			    emsg, strerror(errno));
189 		else
190 			logit(LOG_CRIT, "fatal: %s", emsg);
191 	}
192 
193 	exit(1);
194 }
195 
196 void
197 fatalx(const char *emsg)
198 {
199 	errno = 0;
200 	fatal(emsg);
201 }
202 
203 const char *
204 log_in6addr(const struct in6_addr *addr)
205 {
206 	static char		buf[NI_MAXHOST];
207 	struct sockaddr_in6	sa_in6;
208 	u_int16_t		tmp16;
209 
210 	bzero(&sa_in6, sizeof(sa_in6));
211 	sa_in6.sin6_len = sizeof(sa_in6);
212 	sa_in6.sin6_family = AF_INET6;
213 	memcpy(&sa_in6.sin6_addr, addr, sizeof(sa_in6.sin6_addr));
214 
215 	/* XXX thanks, KAME, for this ugliness... adopted from route/show.c */
216 	if (IN6_IS_ADDR_LINKLOCAL(&sa_in6.sin6_addr) ||
217 	    IN6_IS_ADDR_MC_LINKLOCAL(&sa_in6.sin6_addr)) {
218 		memcpy(&tmp16, &sa_in6.sin6_addr.s6_addr[2], sizeof(tmp16));
219 		sa_in6.sin6_scope_id = ntohs(tmp16);
220 		sa_in6.sin6_addr.s6_addr[2] = 0;
221 		sa_in6.sin6_addr.s6_addr[3] = 0;
222 	}
223 
224 	return (print_host((struct sockaddr_storage *)&sa_in6, buf,
225 	    NI_MAXHOST));
226 }
227 
228 const char *
229 print_host(struct sockaddr_storage *ss, char *buf, size_t len)
230 {
231 	if (getnameinfo((struct sockaddr *)ss, ss->ss_len,
232 	    buf, len, NULL, 0, NI_NUMERICHOST) != 0) {
233 		buf[0] = '\0';
234 		return (NULL);
235 	}
236 	return (buf);
237 }
238