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