1*3e2a4faaSbenno /* $OpenBSD: log.c,v 1.33 2017/01/20 12:19:18 benno Exp $ */ 2ab0c2486Smichele 3ab0c2486Smichele /* 4ab0c2486Smichele * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 5ab0c2486Smichele * 6ab0c2486Smichele * Permission to use, copy, modify, and distribute this software for any 7ab0c2486Smichele * purpose with or without fee is hereby granted, provided that the above 8ab0c2486Smichele * copyright notice and this permission notice appear in all copies. 9ab0c2486Smichele * 10ab0c2486Smichele * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11ab0c2486Smichele * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12ab0c2486Smichele * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13ab0c2486Smichele * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14ab0c2486Smichele * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15ab0c2486Smichele * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16ab0c2486Smichele * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17ab0c2486Smichele */ 18ab0c2486Smichele 19ab0c2486Smichele #include <errno.h> 20ab0c2486Smichele #include <stdio.h> 21ab0c2486Smichele #include <stdlib.h> 22ab0c2486Smichele #include <string.h> 23ab0c2486Smichele #include <syslog.h> 24ab0c2486Smichele #include <unistd.h> 25a8c39dc0Srenato #include <netdb.h> 264dcd314eSrenato #include <limits.h> 27ab0c2486Smichele 28ab0c2486Smichele #include "log.h" 29*3e2a4faaSbenno #include "ldpd.h" 30ab0c2486Smichele 31*3e2a4faaSbenno int debug; 32*3e2a4faaSbenno int verbose; 33*3e2a4faaSbenno const char *log_procname; 34ab0c2486Smichele 35ab0c2486Smichele void 36ab0c2486Smichele log_init(int n_debug) 37ab0c2486Smichele { 38ab0c2486Smichele extern char *__progname; 39ab0c2486Smichele 40ab0c2486Smichele debug = n_debug; 41ab0c2486Smichele 42ab0c2486Smichele if (!debug) 43ab0c2486Smichele openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON); 44ab0c2486Smichele 45ab0c2486Smichele tzset(); 46ab0c2486Smichele } 47ab0c2486Smichele 48ab0c2486Smichele void 497dc5fe12Sclaudio log_verbose(int v) 507dc5fe12Sclaudio { 517dc5fe12Sclaudio verbose = v; 527dc5fe12Sclaudio } 537dc5fe12Sclaudio 547dc5fe12Sclaudio void 55ab0c2486Smichele logit(int pri, const char *fmt, ...) 56ab0c2486Smichele { 57ab0c2486Smichele va_list ap; 58ab0c2486Smichele 59ab0c2486Smichele va_start(ap, fmt); 60ab0c2486Smichele vlog(pri, fmt, ap); 61ab0c2486Smichele va_end(ap); 62ab0c2486Smichele } 63ab0c2486Smichele 64*3e2a4faaSbenno void 65ab0c2486Smichele vlog(int pri, const char *fmt, va_list ap) 66ab0c2486Smichele { 67ab0c2486Smichele char *nfmt; 68ab0c2486Smichele 69ab0c2486Smichele if (debug) { 70ab0c2486Smichele /* best effort in out of mem situations */ 71ab0c2486Smichele if (asprintf(&nfmt, "%s\n", fmt) == -1) { 72ab0c2486Smichele vfprintf(stderr, fmt, ap); 73ab0c2486Smichele fprintf(stderr, "\n"); 74ab0c2486Smichele } else { 75ab0c2486Smichele vfprintf(stderr, nfmt, ap); 76ab0c2486Smichele free(nfmt); 77ab0c2486Smichele } 78ab0c2486Smichele fflush(stderr); 79ab0c2486Smichele } else 80ab0c2486Smichele vsyslog(pri, fmt, ap); 81ab0c2486Smichele } 82ab0c2486Smichele 83ab0c2486Smichele void 84ab0c2486Smichele log_warn(const char *emsg, ...) 85ab0c2486Smichele { 86ab0c2486Smichele char *nfmt; 87ab0c2486Smichele va_list ap; 88ab0c2486Smichele 89ab0c2486Smichele /* best effort to even work in out of memory situations */ 90ab0c2486Smichele if (emsg == NULL) 91ab0c2486Smichele logit(LOG_CRIT, "%s", strerror(errno)); 92ab0c2486Smichele else { 93ab0c2486Smichele va_start(ap, emsg); 94ab0c2486Smichele 95ab0c2486Smichele if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) { 96ab0c2486Smichele /* we tried it... */ 97ab0c2486Smichele vlog(LOG_CRIT, emsg, ap); 98ab0c2486Smichele logit(LOG_CRIT, "%s", strerror(errno)); 99ab0c2486Smichele } else { 100ab0c2486Smichele vlog(LOG_CRIT, nfmt, ap); 101ab0c2486Smichele free(nfmt); 102ab0c2486Smichele } 103ab0c2486Smichele va_end(ap); 104ab0c2486Smichele } 105ab0c2486Smichele } 106ab0c2486Smichele 107ab0c2486Smichele void 108ab0c2486Smichele log_warnx(const char *emsg, ...) 109ab0c2486Smichele { 110ab0c2486Smichele va_list ap; 111ab0c2486Smichele 112ab0c2486Smichele va_start(ap, emsg); 113ab0c2486Smichele vlog(LOG_CRIT, emsg, ap); 114ab0c2486Smichele va_end(ap); 115ab0c2486Smichele } 116ab0c2486Smichele 117ab0c2486Smichele void 118ab0c2486Smichele log_info(const char *emsg, ...) 119ab0c2486Smichele { 120ab0c2486Smichele va_list ap; 121ab0c2486Smichele 122ab0c2486Smichele va_start(ap, emsg); 123ab0c2486Smichele vlog(LOG_INFO, emsg, ap); 124ab0c2486Smichele va_end(ap); 125ab0c2486Smichele } 126ab0c2486Smichele 127ab0c2486Smichele void 128ab0c2486Smichele log_debug(const char *emsg, ...) 129ab0c2486Smichele { 130ab0c2486Smichele va_list ap; 131ab0c2486Smichele 13284f16a94Sclaudio if (verbose & LDPD_OPT_VERBOSE) { 133ab0c2486Smichele va_start(ap, emsg); 134ab0c2486Smichele vlog(LOG_DEBUG, emsg, ap); 135ab0c2486Smichele va_end(ap); 136ab0c2486Smichele } 137ab0c2486Smichele } 138ab0c2486Smichele 139ab0c2486Smichele void 140ab0c2486Smichele fatal(const char *emsg) 141ab0c2486Smichele { 142ab0c2486Smichele if (emsg == NULL) 143*3e2a4faaSbenno logit(LOG_CRIT, "fatal in %s: %s", log_procname, 144ab0c2486Smichele strerror(errno)); 145ab0c2486Smichele else 146ab0c2486Smichele if (errno) 147ab0c2486Smichele logit(LOG_CRIT, "fatal in %s: %s: %s", 148*3e2a4faaSbenno log_procname, emsg, strerror(errno)); 149ab0c2486Smichele else 150ab0c2486Smichele logit(LOG_CRIT, "fatal in %s: %s", 151*3e2a4faaSbenno log_procname, emsg); 152ab0c2486Smichele 153ab0c2486Smichele exit(1); 154ab0c2486Smichele } 155ab0c2486Smichele 156ab0c2486Smichele void 157ab0c2486Smichele fatalx(const char *emsg) 158ab0c2486Smichele { 159ab0c2486Smichele errno = 0; 160ab0c2486Smichele fatal(emsg); 161ab0c2486Smichele } 162