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