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