xref: /openbsd/usr.sbin/ldpd/log.c (revision af2666a1)
1 /*	$OpenBSD: log.c,v 1.10 2013/06/01 18:26:40 claudio 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 USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
23 
24 #include <errno.h>
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <syslog.h>
30 #include <unistd.h>
31 
32 #include "ldpd.h"
33 #include "log.h"
34 
35 static const char * const procnames[] = {
36 	"parent",
37 	"ldpe",
38 	"lde"
39 };
40 
41 int	debug;
42 int	verbose;
43 
44 void	 logit(int, const char *, ...);
45 
46 void
47 log_init(int n_debug)
48 {
49 	extern char	*__progname;
50 
51 	debug = n_debug;
52 
53 	if (!debug)
54 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
55 
56 	tzset();
57 }
58 
59 void
60 log_verbose(int v)
61 {
62 	verbose = v;
63 }
64 
65 void
66 logit(int pri, const char *fmt, ...)
67 {
68 	va_list	ap;
69 
70 	va_start(ap, fmt);
71 	vlog(pri, fmt, ap);
72 	va_end(ap);
73 }
74 
75 void
76 vlog(int pri, const char *fmt, va_list ap)
77 {
78 	char	*nfmt;
79 
80 	if (debug) {
81 		/* best effort in out of mem situations */
82 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
83 			vfprintf(stderr, fmt, ap);
84 			fprintf(stderr, "\n");
85 		} else {
86 			vfprintf(stderr, nfmt, ap);
87 			free(nfmt);
88 		}
89 		fflush(stderr);
90 	} else
91 		vsyslog(pri, fmt, ap);
92 }
93 
94 void
95 log_warn(const char *emsg, ...)
96 {
97 	char	*nfmt;
98 	va_list	 ap;
99 
100 	/* best effort to even work in out of memory situations */
101 	if (emsg == NULL)
102 		logit(LOG_CRIT, "%s", strerror(errno));
103 	else {
104 		va_start(ap, emsg);
105 
106 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
107 			/* we tried it... */
108 			vlog(LOG_CRIT, emsg, ap);
109 			logit(LOG_CRIT, "%s", strerror(errno));
110 		} else {
111 			vlog(LOG_CRIT, nfmt, ap);
112 			free(nfmt);
113 		}
114 		va_end(ap);
115 	}
116 }
117 
118 void
119 log_warnx(const char *emsg, ...)
120 {
121 	va_list	 ap;
122 
123 	va_start(ap, emsg);
124 	vlog(LOG_CRIT, emsg, ap);
125 	va_end(ap);
126 }
127 
128 void
129 log_info(const char *emsg, ...)
130 {
131 	va_list	 ap;
132 
133 	va_start(ap, emsg);
134 	vlog(LOG_INFO, emsg, ap);
135 	va_end(ap);
136 }
137 
138 void
139 log_debug(const char *emsg, ...)
140 {
141 	va_list	 ap;
142 
143 	if (verbose) {
144 		va_start(ap, emsg);
145 		vlog(LOG_DEBUG, emsg, ap);
146 		va_end(ap);
147 	}
148 }
149 
150 void
151 fatal(const char *emsg)
152 {
153 	if (emsg == NULL)
154 		logit(LOG_CRIT, "fatal in %s: %s", procnames[ldpd_process],
155 		    strerror(errno));
156 	else
157 		if (errno)
158 			logit(LOG_CRIT, "fatal in %s: %s: %s",
159 			    procnames[ldpd_process], emsg, strerror(errno));
160 		else
161 			logit(LOG_CRIT, "fatal in %s: %s",
162 			    procnames[ldpd_process], emsg);
163 
164 	if (ldpd_process == PROC_MAIN)
165 		exit(1);
166 	else				/* parent copes via SIGCHLD */
167 		_exit(1);
168 }
169 
170 void
171 fatalx(const char *emsg)
172 {
173 	errno = 0;
174 	fatal(emsg);
175 }
176 
177 /* names */
178 const char *
179 nbr_state_name(int state)
180 {
181 	switch (state) {
182 	case NBR_STA_DOWN:
183 		return ("DOWN");
184 	case NBR_STA_PRESENT:
185 		return ("PRESENT");
186 	case NBR_STA_INITIAL:
187 		return ("INITIALIZED");
188 	case NBR_STA_OPENREC:
189 		return ("OPENREC");
190 	case NBR_STA_OPENSENT:
191 		return ("OPENSENT");
192 	case NBR_STA_OPER:
193 		return ("OPERATIONAL");
194 	default:
195 		return ("UNKNW");
196 	}
197 }
198 
199 const char *
200 if_state_name(int state)
201 {
202 	switch (state) {
203 	case IF_STA_DOWN:
204 		return ("DOWN");
205 	case IF_STA_ACTIVE:
206 		return ("ACTIVE");
207 	default:
208 		return ("UNKNW");
209 	}
210 }
211 
212 const char *
213 if_type_name(enum iface_type type)
214 {
215 	switch (type) {
216 	case IF_TYPE_POINTOPOINT:
217 		return ("POINTOPOINT");
218 	case IF_TYPE_BROADCAST:
219 		return ("BROADCAST");
220 	}
221 	/* NOTREACHED */
222 	return ("UNKNOWN");
223 }
224 
225 const char *
226 notification_name(u_int32_t status)
227 {
228 	static char buf[16];
229 
230 	switch (status) {
231 	case S_SUCCESS:
232 		return ("Success");
233 	case S_BAD_LDP_ID:
234 		return ("Bad LDP Identifier");
235 	case S_BAD_PROTO_VER:
236 		return ("Bad Protocol Version");
237 	case S_BAD_PDU_LEN:
238 		return ("Bad PDU Length");
239 	case S_UNKNOWN_MSG:
240 		return ("Unknown Message Type");
241 	case S_BAD_MSG_LEN:
242 		return ("Bad Message Length");
243 	case S_UNKNOWN_TLV:
244 		return ("Unknown TLV");
245 	case S_BAD_TLV_LEN:
246 		return ("Bad TLV Length");
247 	case S_BAD_TLV_VAL:
248 		return ("Malformed TLV Value");
249 	case S_HOLDTIME_EXP:
250 		return ("Hold Timer Expired");
251 	case S_SHUTDOWN:
252 		return ("Shutdown");
253 	case S_LOOP_DETECTED:
254 		return ("Loop Detected");
255 	case S_UNKNOWN_FEC:
256 		return ("Unknown FEC");
257 	case S_NO_ROUTE:
258 		return ("No Route");
259 	case S_NO_LABEL_RES:
260 		return ("No Label Resources");
261 	case S_AVAILABLE:
262 		return ("Label Resources Available");
263 	case S_NO_HELLO:
264 		return ("Session Rejected, No Hello");
265 	case S_PARM_ADV_MODE:
266 		return ("Rejected Advertisement Mode Parameter");
267 	case S_MAX_PDU_LEN:
268 		return ("Rejected Max PDU Length Parameter");
269 	case S_PARM_L_RANGE:
270 		return ("Rejected Label Range Parameter");
271 	case S_KEEPALIVE_TMR:
272 		return ("KeepAlive Timer Expired");
273 	case S_LAB_REQ_ABRT:
274 		return ("Label Request Aborted");
275 	case S_MISS_MSG:
276 		return ("Missing Message Parameters");
277 	case S_UNSUP_ADDR:
278 		return ("Unsupported Address Family");
279 	case S_KEEPALIVE_BAD:
280 		return ("Bad KeepAlive Time");
281 	case S_INTERN_ERR:
282 		return ("Internal Error");
283 	default:
284 		snprintf(buf, sizeof(buf), "[%08x]", status);
285 		return (buf);
286 	}
287 }
288 
289 const char *
290 log_fec(struct map *map)
291 {
292 	static char	buf[32];
293 	char		pstr[32];
294 
295 	if (snprintf(buf, sizeof(buf), "%s/%u",
296 	    inet_ntop(AF_INET, &map->prefix, pstr, sizeof(pstr)),
297 	    map->prefixlen) == -1)
298 		return ("???");
299 
300 	return (buf);
301 }
302