xref: /netbsd-src/usr.sbin/ldpd/ldp_errors.c (revision 3e54e2f09f7c74cb0d40adfc68c3819036346a7b)
1*3e54e2f0Skefren /* $NetBSD: ldp_errors.c,v 1.4 2013/07/16 02:54:32 kefren Exp $ */
2e7341adaSkefren 
3269ea2d3Skefren /*
4e7341adaSkefren  * Copyright (c) 2010 The NetBSD Foundation, Inc.
5e7341adaSkefren  * All rights reserved.
6e7341adaSkefren  *
7e7341adaSkefren  * This code is derived from software contributed to The NetBSD Foundation
8e7341adaSkefren  * by Mihai Chelaru <kefren@NetBSD.org>
9e7341adaSkefren  *
10e7341adaSkefren  * Redistribution and use in source and binary forms, with or without
11e7341adaSkefren  * modification, are permitted provided that the following conditions
12e7341adaSkefren  * are met:
13e7341adaSkefren  * 1. Redistributions of source code must retain the above copyright
14e7341adaSkefren  *    notice, this list of conditions and the following disclaimer.
15e7341adaSkefren  * 2. Redistributions in binary form must reproduce the above copyright
16e7341adaSkefren  *    notice, this list of conditions and the following disclaimer in the
17e7341adaSkefren  *    documentation and/or other materials provided with the distribution.
18e7341adaSkefren  *
19e7341adaSkefren  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20e7341adaSkefren  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21e7341adaSkefren  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22e7341adaSkefren  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23e7341adaSkefren  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24e7341adaSkefren  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25e7341adaSkefren  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26e7341adaSkefren  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27e7341adaSkefren  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28e7341adaSkefren  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29e7341adaSkefren  * POSSIBILITY OF SUCH DAMAGE.
30e7341adaSkefren  */
31e7341adaSkefren 
32269ea2d3Skefren #include <arpa/inet.h>
33*3e54e2f0Skefren #include <netmpls/mpls.h>
34e7341adaSkefren #include <sys/stat.h>
35e7341adaSkefren #include <fcntl.h>
36e7341adaSkefren #include <stdio.h>
37e7341adaSkefren #include <stdarg.h>
38*3e54e2f0Skefren #include <string.h>
39e7341adaSkefren #include <syslog.h>
40e7341adaSkefren #include <unistd.h>
41e7341adaSkefren 
42e7341adaSkefren #include "ldp.h"
43e7341adaSkefren #include "ldp_errors.h"
44e7341adaSkefren 
45e7341adaSkefren int	debug_f = 0, warn_f = 0, syslog_f = 0;
46e7341adaSkefren 
4766dd2755Sjoerg static void do_syslog(int, const char*, va_list) __printflike(2, 0);
48269ea2d3Skefren static char satos_str[INET6_ADDRSTRLEN > INET_ADDRSTRLEN ? INET6_ADDRSTRLEN :
49269ea2d3Skefren 		INET_ADDRSTRLEN];
50*3e54e2f0Skefren static char *mpls_ntoa(const struct sockaddr_mpls *smpls);
51e7341adaSkefren 
52e7341adaSkefren void
debugp(const char * fmt,...)53e7341adaSkefren debugp(const char *fmt, ...)
54e7341adaSkefren {
55e7341adaSkefren 	va_list va;
56e7341adaSkefren 
57e7341adaSkefren 	if (!debug_f)
58e7341adaSkefren 		return;
59e7341adaSkefren 
60e7341adaSkefren 	va_start(va, fmt);
61e7341adaSkefren 	if (syslog_f)
62e7341adaSkefren 		do_syslog(LOG_DEBUG, fmt, va);
63e7341adaSkefren 	else
64e7341adaSkefren 		vprintf(fmt, va);
65e7341adaSkefren 	va_end(va);
66e7341adaSkefren }
67e7341adaSkefren 
68e7341adaSkefren void
warnp(const char * fmt,...)69e7341adaSkefren warnp(const char *fmt, ...)
70e7341adaSkefren {
71e7341adaSkefren 	va_list va;
72e7341adaSkefren 
73e7341adaSkefren 	if (!debug_f && !warn_f)
74e7341adaSkefren 		return;
75e7341adaSkefren 
76e7341adaSkefren 	va_start(va, fmt);
77e7341adaSkefren 	if (syslog_f)
78e7341adaSkefren 		do_syslog(LOG_WARNING, fmt, va);
79e7341adaSkefren 	else
80e7341adaSkefren 		vprintf(fmt, va);
81e7341adaSkefren 	va_end(va);
82e7341adaSkefren }
83e7341adaSkefren 
84e7341adaSkefren void
fatalp(const char * fmt,...)85e7341adaSkefren fatalp(const char *fmt, ...)
86e7341adaSkefren {
87e7341adaSkefren 	va_list va;
88e7341adaSkefren 
89e7341adaSkefren 	va_start(va, fmt);
90e7341adaSkefren 	if (syslog_f)
91e7341adaSkefren 		do_syslog(LOG_ERR, fmt, va);
92e7341adaSkefren 	else
93e7341adaSkefren 		vprintf(fmt, va);
94e7341adaSkefren 	va_end(va);
95e7341adaSkefren }
96e7341adaSkefren 
97e7341adaSkefren static void
do_syslog(int prio,const char * fmt,va_list va)98e7341adaSkefren do_syslog(int prio, const char *fmt, va_list va)
99e7341adaSkefren {
100e7341adaSkefren 	vsyslog(prio, fmt, va);
101e7341adaSkefren }
102e7341adaSkefren 
103e7341adaSkefren void
printtime()104e7341adaSkefren printtime()
105e7341adaSkefren {
106e7341adaSkefren 	time_t          t;
107e7341adaSkefren 	char            buf[26];
108e7341adaSkefren 	int             i;
109e7341adaSkefren 
110e7341adaSkefren 	time(&t);
111e7341adaSkefren 	ctime_r(&t, buf);
112e7341adaSkefren 	for (i = 0; (i < 26 && buf[i] != 0); i++)
113e7341adaSkefren 		if (buf[i] == '\n')
114e7341adaSkefren 			buf[i] = 0;
115e7341adaSkefren 	printf("%s ", buf);
116e7341adaSkefren }
117269ea2d3Skefren 
118269ea2d3Skefren const char *
satos(const struct sockaddr * sa)119269ea2d3Skefren satos(const struct sockaddr *sa)
120269ea2d3Skefren {
121269ea2d3Skefren 	switch (sa->sa_family) {
122269ea2d3Skefren 		case AF_INET:
123269ea2d3Skefren 		{
124269ea2d3Skefren 			const struct sockaddr_in *sin =
125269ea2d3Skefren 			    (const struct sockaddr_in *)sa;
126269ea2d3Skefren 			if (inet_ntop(AF_INET, &(sin->sin_addr), satos_str,
127269ea2d3Skefren 			    sizeof(satos_str)) == NULL)
128269ea2d3Skefren 				return "INET ERROR";
129269ea2d3Skefren 			break;
130269ea2d3Skefren 		}
131269ea2d3Skefren 		case AF_INET6:
132269ea2d3Skefren 		{
133269ea2d3Skefren 			const struct sockaddr_in6 *sin6 =
134269ea2d3Skefren 			    (const struct sockaddr_in6 *)sa;
135269ea2d3Skefren 			if (inet_ntop(AF_INET6, &(sin6->sin6_addr), satos_str,
136269ea2d3Skefren 			    sizeof(satos_str)) == NULL)
137269ea2d3Skefren 				return "INET6 ERROR";
138269ea2d3Skefren 			break;
139269ea2d3Skefren 		}
140*3e54e2f0Skefren 		case AF_LINK:
141*3e54e2f0Skefren 		{
142*3e54e2f0Skefren 			strlcpy(satos_str,
143*3e54e2f0Skefren 			    link_ntoa((const struct sockaddr_dl *)sa),
144*3e54e2f0Skefren 			    sizeof(satos_str));
145*3e54e2f0Skefren 			break;
146*3e54e2f0Skefren 		}
147*3e54e2f0Skefren 		case AF_MPLS:
148*3e54e2f0Skefren 		{
149*3e54e2f0Skefren 			strlcpy(satos_str,
150*3e54e2f0Skefren 			    mpls_ntoa((const struct sockaddr_mpls *)sa),
151*3e54e2f0Skefren 			    sizeof(satos_str));
152*3e54e2f0Skefren 			break;
153*3e54e2f0Skefren 		}
154269ea2d3Skefren 		default:
155269ea2d3Skefren 			return "UNKNOWN AF";
156269ea2d3Skefren 	}
157269ea2d3Skefren 	return satos_str;
158269ea2d3Skefren }
159*3e54e2f0Skefren 
160*3e54e2f0Skefren static char *
mpls_ntoa(const struct sockaddr_mpls * smpls)161*3e54e2f0Skefren mpls_ntoa(const struct sockaddr_mpls *smpls)
162*3e54e2f0Skefren {
163*3e54e2f0Skefren 	static char ret[10];
164*3e54e2f0Skefren 	union mpls_shim ms2;
165*3e54e2f0Skefren 
166*3e54e2f0Skefren 	ms2.s_addr = ntohl(smpls->smpls_addr.s_addr);
167*3e54e2f0Skefren 	snprintf(ret, sizeof(ret), "%d", ms2.shim.label);
168*3e54e2f0Skefren 	return ret;
169*3e54e2f0Skefren }
170