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