xref: /freebsd/usr.sbin/autofs/log.c (revision 3914ddf8a7b16925f50cc2e29e916aa2d56063fb)
1*3914ddf8SEdward Tomasz Napierala /*-
2*3914ddf8SEdward Tomasz Napierala  * Copyright (c) 2012 The FreeBSD Foundation
3*3914ddf8SEdward Tomasz Napierala  * All rights reserved.
4*3914ddf8SEdward Tomasz Napierala  *
5*3914ddf8SEdward Tomasz Napierala  * This software was developed by Edward Tomasz Napierala under sponsorship
6*3914ddf8SEdward Tomasz Napierala  * from the FreeBSD Foundation.
7*3914ddf8SEdward Tomasz Napierala  *
8*3914ddf8SEdward Tomasz Napierala  * Redistribution and use in source and binary forms, with or without
9*3914ddf8SEdward Tomasz Napierala  * modification, are permitted provided that the following conditions
10*3914ddf8SEdward Tomasz Napierala  * are met:
11*3914ddf8SEdward Tomasz Napierala  * 1. Redistributions of source code must retain the above copyright
12*3914ddf8SEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer.
13*3914ddf8SEdward Tomasz Napierala  * 2. Redistributions in binary form must reproduce the above copyright
14*3914ddf8SEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer in the
15*3914ddf8SEdward Tomasz Napierala  *    documentation and/or other materials provided with the distribution.
16*3914ddf8SEdward Tomasz Napierala  *
17*3914ddf8SEdward Tomasz Napierala  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18*3914ddf8SEdward Tomasz Napierala  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*3914ddf8SEdward Tomasz Napierala  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*3914ddf8SEdward Tomasz Napierala  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21*3914ddf8SEdward Tomasz Napierala  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*3914ddf8SEdward Tomasz Napierala  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*3914ddf8SEdward Tomasz Napierala  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*3914ddf8SEdward Tomasz Napierala  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*3914ddf8SEdward Tomasz Napierala  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*3914ddf8SEdward Tomasz Napierala  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*3914ddf8SEdward Tomasz Napierala  * SUCH DAMAGE.
28*3914ddf8SEdward Tomasz Napierala  *
29*3914ddf8SEdward Tomasz Napierala  * $FreeBSD$
30*3914ddf8SEdward Tomasz Napierala  */
31*3914ddf8SEdward Tomasz Napierala 
32*3914ddf8SEdward Tomasz Napierala #include <errno.h>
33*3914ddf8SEdward Tomasz Napierala #include <stdarg.h>
34*3914ddf8SEdward Tomasz Napierala #include <stdio.h>
35*3914ddf8SEdward Tomasz Napierala #include <stdlib.h>
36*3914ddf8SEdward Tomasz Napierala #include <string.h>
37*3914ddf8SEdward Tomasz Napierala #include <syslog.h>
38*3914ddf8SEdward Tomasz Napierala #include <vis.h>
39*3914ddf8SEdward Tomasz Napierala 
40*3914ddf8SEdward Tomasz Napierala #include "common.h"
41*3914ddf8SEdward Tomasz Napierala 
42*3914ddf8SEdward Tomasz Napierala static int log_level = 0;
43*3914ddf8SEdward Tomasz Napierala static char *peer_name = NULL;
44*3914ddf8SEdward Tomasz Napierala static char *peer_addr = NULL;
45*3914ddf8SEdward Tomasz Napierala 
46*3914ddf8SEdward Tomasz Napierala #define	MSGBUF_LEN	1024
47*3914ddf8SEdward Tomasz Napierala 
48*3914ddf8SEdward Tomasz Napierala void
49*3914ddf8SEdward Tomasz Napierala log_init(int level)
50*3914ddf8SEdward Tomasz Napierala {
51*3914ddf8SEdward Tomasz Napierala 
52*3914ddf8SEdward Tomasz Napierala 	log_level = level;
53*3914ddf8SEdward Tomasz Napierala 	openlog(getprogname(), LOG_NDELAY | LOG_PID, LOG_DAEMON);
54*3914ddf8SEdward Tomasz Napierala }
55*3914ddf8SEdward Tomasz Napierala 
56*3914ddf8SEdward Tomasz Napierala void
57*3914ddf8SEdward Tomasz Napierala log_set_peer_name(const char *name)
58*3914ddf8SEdward Tomasz Napierala {
59*3914ddf8SEdward Tomasz Napierala 
60*3914ddf8SEdward Tomasz Napierala 	/*
61*3914ddf8SEdward Tomasz Napierala 	 * XXX: Turn it into assertion?
62*3914ddf8SEdward Tomasz Napierala 	 */
63*3914ddf8SEdward Tomasz Napierala 	if (peer_name != NULL)
64*3914ddf8SEdward Tomasz Napierala 		log_errx(1, "%s called twice", __func__);
65*3914ddf8SEdward Tomasz Napierala 	if (peer_addr == NULL)
66*3914ddf8SEdward Tomasz Napierala 		log_errx(1, "%s called before log_set_peer_addr", __func__);
67*3914ddf8SEdward Tomasz Napierala 
68*3914ddf8SEdward Tomasz Napierala 	peer_name = checked_strdup(name);
69*3914ddf8SEdward Tomasz Napierala }
70*3914ddf8SEdward Tomasz Napierala 
71*3914ddf8SEdward Tomasz Napierala void
72*3914ddf8SEdward Tomasz Napierala log_set_peer_addr(const char *addr)
73*3914ddf8SEdward Tomasz Napierala {
74*3914ddf8SEdward Tomasz Napierala 
75*3914ddf8SEdward Tomasz Napierala 	/*
76*3914ddf8SEdward Tomasz Napierala 	 * XXX: Turn it into assertion?
77*3914ddf8SEdward Tomasz Napierala 	 */
78*3914ddf8SEdward Tomasz Napierala 	if (peer_addr != NULL)
79*3914ddf8SEdward Tomasz Napierala 		log_errx(1, "%s called twice", __func__);
80*3914ddf8SEdward Tomasz Napierala 
81*3914ddf8SEdward Tomasz Napierala 	peer_addr = checked_strdup(addr);
82*3914ddf8SEdward Tomasz Napierala }
83*3914ddf8SEdward Tomasz Napierala 
84*3914ddf8SEdward Tomasz Napierala static void
85*3914ddf8SEdward Tomasz Napierala log_common(int priority, int log_errno, const char *fmt, va_list ap)
86*3914ddf8SEdward Tomasz Napierala {
87*3914ddf8SEdward Tomasz Napierala 	static char msgbuf[MSGBUF_LEN];
88*3914ddf8SEdward Tomasz Napierala 	static char msgbuf_strvised[MSGBUF_LEN * 4 + 1];
89*3914ddf8SEdward Tomasz Napierala 	int ret;
90*3914ddf8SEdward Tomasz Napierala 
91*3914ddf8SEdward Tomasz Napierala 	ret = vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap);
92*3914ddf8SEdward Tomasz Napierala 	if (ret < 0) {
93*3914ddf8SEdward Tomasz Napierala 		fprintf(stderr, "%s: snprintf failed", getprogname());
94*3914ddf8SEdward Tomasz Napierala 		syslog(LOG_CRIT, "snprintf failed");
95*3914ddf8SEdward Tomasz Napierala 		exit(1);
96*3914ddf8SEdward Tomasz Napierala 	}
97*3914ddf8SEdward Tomasz Napierala 
98*3914ddf8SEdward Tomasz Napierala 	ret = strnvis(msgbuf_strvised, sizeof(msgbuf_strvised), msgbuf, VIS_NL);
99*3914ddf8SEdward Tomasz Napierala 	if (ret < 0) {
100*3914ddf8SEdward Tomasz Napierala 		fprintf(stderr, "%s: strnvis failed", getprogname());
101*3914ddf8SEdward Tomasz Napierala 		syslog(LOG_CRIT, "strnvis failed");
102*3914ddf8SEdward Tomasz Napierala 		exit(1);
103*3914ddf8SEdward Tomasz Napierala 	}
104*3914ddf8SEdward Tomasz Napierala 
105*3914ddf8SEdward Tomasz Napierala 	if (log_errno == -1) {
106*3914ddf8SEdward Tomasz Napierala 		if (peer_name != NULL) {
107*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s (%s): %s\n", getprogname(),
108*3914ddf8SEdward Tomasz Napierala 			    peer_addr, peer_name, msgbuf_strvised);
109*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s (%s): %s",
110*3914ddf8SEdward Tomasz Napierala 			    peer_addr, peer_name, msgbuf_strvised);
111*3914ddf8SEdward Tomasz Napierala 		} else if (peer_addr != NULL) {
112*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s: %s\n", getprogname(),
113*3914ddf8SEdward Tomasz Napierala 			    peer_addr, msgbuf_strvised);
114*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s: %s",
115*3914ddf8SEdward Tomasz Napierala 			    peer_addr, msgbuf_strvised);
116*3914ddf8SEdward Tomasz Napierala 		} else {
117*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s\n", getprogname(), msgbuf_strvised);
118*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s", msgbuf_strvised);
119*3914ddf8SEdward Tomasz Napierala 		}
120*3914ddf8SEdward Tomasz Napierala 
121*3914ddf8SEdward Tomasz Napierala 	} else {
122*3914ddf8SEdward Tomasz Napierala 		if (peer_name != NULL) {
123*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s (%s): %s: %s\n", getprogname(),
124*3914ddf8SEdward Tomasz Napierala 			    peer_addr, peer_name, msgbuf_strvised, strerror(errno));
125*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s (%s): %s: %s",
126*3914ddf8SEdward Tomasz Napierala 			    peer_addr, peer_name, msgbuf_strvised, strerror(errno));
127*3914ddf8SEdward Tomasz Napierala 		} else if (peer_addr != NULL) {
128*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s: %s: %s\n", getprogname(),
129*3914ddf8SEdward Tomasz Napierala 			    peer_addr, msgbuf_strvised, strerror(errno));
130*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s: %s: %s",
131*3914ddf8SEdward Tomasz Napierala 			    peer_addr, msgbuf_strvised, strerror(errno));
132*3914ddf8SEdward Tomasz Napierala 		} else {
133*3914ddf8SEdward Tomasz Napierala 			fprintf(stderr, "%s: %s: %s\n", getprogname(),
134*3914ddf8SEdward Tomasz Napierala 			    msgbuf_strvised, strerror(errno));
135*3914ddf8SEdward Tomasz Napierala 			syslog(priority, "%s: %s",
136*3914ddf8SEdward Tomasz Napierala 			    msgbuf_strvised, strerror(errno));
137*3914ddf8SEdward Tomasz Napierala 		}
138*3914ddf8SEdward Tomasz Napierala 	}
139*3914ddf8SEdward Tomasz Napierala }
140*3914ddf8SEdward Tomasz Napierala 
141*3914ddf8SEdward Tomasz Napierala void
142*3914ddf8SEdward Tomasz Napierala log_err(int eval, const char *fmt, ...)
143*3914ddf8SEdward Tomasz Napierala {
144*3914ddf8SEdward Tomasz Napierala 	va_list ap;
145*3914ddf8SEdward Tomasz Napierala 
146*3914ddf8SEdward Tomasz Napierala 	va_start(ap, fmt);
147*3914ddf8SEdward Tomasz Napierala 	log_common(LOG_CRIT, errno, fmt, ap);
148*3914ddf8SEdward Tomasz Napierala 	va_end(ap);
149*3914ddf8SEdward Tomasz Napierala 
150*3914ddf8SEdward Tomasz Napierala 	exit(eval);
151*3914ddf8SEdward Tomasz Napierala }
152*3914ddf8SEdward Tomasz Napierala 
153*3914ddf8SEdward Tomasz Napierala void
154*3914ddf8SEdward Tomasz Napierala log_errx(int eval, const char *fmt, ...)
155*3914ddf8SEdward Tomasz Napierala {
156*3914ddf8SEdward Tomasz Napierala 	va_list ap;
157*3914ddf8SEdward Tomasz Napierala 
158*3914ddf8SEdward Tomasz Napierala 	va_start(ap, fmt);
159*3914ddf8SEdward Tomasz Napierala 	log_common(LOG_CRIT, -1, fmt, ap);
160*3914ddf8SEdward Tomasz Napierala 	va_end(ap);
161*3914ddf8SEdward Tomasz Napierala 
162*3914ddf8SEdward Tomasz Napierala 	exit(eval);
163*3914ddf8SEdward Tomasz Napierala }
164*3914ddf8SEdward Tomasz Napierala 
165*3914ddf8SEdward Tomasz Napierala void
166*3914ddf8SEdward Tomasz Napierala log_warn(const char *fmt, ...)
167*3914ddf8SEdward Tomasz Napierala {
168*3914ddf8SEdward Tomasz Napierala 	va_list ap;
169*3914ddf8SEdward Tomasz Napierala 
170*3914ddf8SEdward Tomasz Napierala 	va_start(ap, fmt);
171*3914ddf8SEdward Tomasz Napierala 	log_common(LOG_WARNING, errno, fmt, ap);
172*3914ddf8SEdward Tomasz Napierala 	va_end(ap);
173*3914ddf8SEdward Tomasz Napierala }
174*3914ddf8SEdward Tomasz Napierala 
175*3914ddf8SEdward Tomasz Napierala void
176*3914ddf8SEdward Tomasz Napierala log_warnx(const char *fmt, ...)
177*3914ddf8SEdward Tomasz Napierala {
178*3914ddf8SEdward Tomasz Napierala 	va_list ap;
179*3914ddf8SEdward Tomasz Napierala 
180*3914ddf8SEdward Tomasz Napierala 	va_start(ap, fmt);
181*3914ddf8SEdward Tomasz Napierala 	log_common(LOG_WARNING, -1, fmt, ap);
182*3914ddf8SEdward Tomasz Napierala 	va_end(ap);
183*3914ddf8SEdward Tomasz Napierala }
184*3914ddf8SEdward Tomasz Napierala 
185*3914ddf8SEdward Tomasz Napierala void
186*3914ddf8SEdward Tomasz Napierala log_debugx(const char *fmt, ...)
187*3914ddf8SEdward Tomasz Napierala {
188*3914ddf8SEdward Tomasz Napierala 	va_list ap;
189*3914ddf8SEdward Tomasz Napierala 
190*3914ddf8SEdward Tomasz Napierala 	if (log_level == 0)
191*3914ddf8SEdward Tomasz Napierala 		return;
192*3914ddf8SEdward Tomasz Napierala 
193*3914ddf8SEdward Tomasz Napierala 	va_start(ap, fmt);
194*3914ddf8SEdward Tomasz Napierala 	log_common(LOG_DEBUG, -1, fmt, ap);
195*3914ddf8SEdward Tomasz Napierala 	va_end(ap);
196*3914ddf8SEdward Tomasz Napierala }
197