1 /* $OpenBSD: log.c,v 1.4 2014/11/03 16:55:59 bluhm 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 USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * 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 <unistd.h> 26 27 #include "igmp.h" 28 #include "dvmrpd.h" 29 #include "log.h" 30 31 static const char * const procnames[] = { 32 "parent", 33 "dvmrpe", 34 "rde" 35 }; 36 37 int debug; 38 int verbose; 39 40 void 41 log_init(int n_debug) 42 { 43 extern char *__progname; 44 45 debug = n_debug; 46 47 if (!debug) 48 openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON); 49 50 tzset(); 51 } 52 53 void 54 log_verbose(int v) 55 { 56 verbose = v; 57 } 58 59 void 60 logit(int pri, const char *fmt, ...) 61 { 62 va_list ap; 63 64 va_start(ap, fmt); 65 vlog(pri, fmt, ap); 66 va_end(ap); 67 } 68 69 void 70 vlog(int pri, const char *fmt, va_list ap) 71 { 72 char *nfmt; 73 74 if (debug) { 75 /* best effort in out of mem situations */ 76 if (asprintf(&nfmt, "%s\n", fmt) == -1) { 77 vfprintf(stderr, fmt, ap); 78 fprintf(stderr, "\n"); 79 } else { 80 vfprintf(stderr, nfmt, ap); 81 free(nfmt); 82 } 83 fflush(stderr); 84 } else 85 vsyslog(pri, fmt, ap); 86 } 87 88 void 89 log_warn(const char *emsg, ...) 90 { 91 char *nfmt; 92 va_list ap; 93 94 /* best effort to even work in out of memory situations */ 95 if (emsg == NULL) 96 logit(LOG_CRIT, "%s", strerror(errno)); 97 else { 98 va_start(ap, emsg); 99 100 if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) { 101 /* we tried it... */ 102 vlog(LOG_CRIT, emsg, ap); 103 logit(LOG_CRIT, "%s", strerror(errno)); 104 } else { 105 vlog(LOG_CRIT, nfmt, ap); 106 free(nfmt); 107 } 108 va_end(ap); 109 } 110 } 111 112 void 113 log_warnx(const char *emsg, ...) 114 { 115 va_list ap; 116 117 va_start(ap, emsg); 118 vlog(LOG_CRIT, emsg, ap); 119 va_end(ap); 120 } 121 122 void 123 log_info(const char *emsg, ...) 124 { 125 va_list ap; 126 127 va_start(ap, emsg); 128 vlog(LOG_INFO, emsg, ap); 129 va_end(ap); 130 } 131 132 void 133 log_debug(const char *emsg, ...) 134 { 135 va_list ap; 136 137 if (verbose) { 138 va_start(ap, emsg); 139 vlog(LOG_DEBUG, emsg, ap); 140 va_end(ap); 141 } 142 } 143 144 void 145 fatal(const char *emsg) 146 { 147 if (emsg == NULL) 148 logit(LOG_CRIT, "fatal in %s: %s", procnames[dvmrpd_process], 149 strerror(errno)); 150 else 151 if (errno) 152 logit(LOG_CRIT, "fatal in %s: %s: %s", 153 procnames[dvmrpd_process], emsg, strerror(errno)); 154 else 155 logit(LOG_CRIT, "fatal in %s: %s", 156 procnames[dvmrpd_process], emsg); 157 158 if (dvmrpd_process == PROC_MAIN) 159 exit(1); 160 else /* parent copes via SIGCHLD */ 161 _exit(1); 162 } 163 164 void 165 fatalx(const char *emsg) 166 { 167 errno = 0; 168 fatal(emsg); 169 } 170 171 /* names */ 172 const char * 173 nbr_state_name(int state) 174 { 175 switch (state) { 176 case NBR_STA_DOWN: 177 return ("DOWN"); 178 case NBR_STA_1_WAY: 179 return ("1-WAY"); 180 case NBR_STA_2_WAY: 181 return ("2-WAY"); 182 default: 183 return ("UNKNOWN"); 184 } 185 } 186 187 const char * 188 if_state_name(int state) 189 { 190 switch (state) { 191 case IF_STA_DOWN: 192 return ("DOWN"); 193 case IF_STA_QUERIER: 194 return ("QUERIER"); 195 case IF_STA_NONQUERIER: 196 return ("NONQUERIER"); 197 default: 198 return ("UNKNOWN"); 199 } 200 } 201 202 const char * 203 group_state_name(int state) 204 { 205 switch (state) { 206 case GRP_STA_NO_MEMB_PRSNT: 207 return ("NO MEMBER"); 208 case GRP_STA_MEMB_PRSNT: 209 return ("MEMBER"); 210 case GRP_STA_V1_MEMB_PRSNT: 211 return ("V1 MEMBER"); 212 case GRP_STA_CHECK_MEMB: 213 return ("CHECKING"); 214 default: 215 return ("UNKNOWN"); 216 } 217 } 218 219 const char * 220 if_type_name(enum iface_type type) 221 { 222 switch (type) { 223 case IF_TYPE_POINTOPOINT: 224 return ("POINTOPOINT"); 225 case IF_TYPE_BROADCAST: 226 return ("BROADCAST"); 227 } 228 /* NOTREACHED */ 229 return ("UNKNOWN"); 230 } 231