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