errwarn.c revision 147072
1/* $OpenBSD: errwarn.c,v 1.7 2004/05/04 22:23:01 mickey Exp $ */ 2 3/* Errors and warnings... */ 4 5/* 6 * Copyright (c) 1996 The Internet Software Consortium. 7 * All Rights Reserved. 8 * Copyright (c) 1995 RadioMail Corporation. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of RadioMail Corporation, the Internet Software 20 * Consortium nor the names of its contributors may be used to endorse 21 * or promote products derived from this software without specific 22 * prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY RADIOMAIL CORPORATION, THE INTERNET 25 * SOFTWARE CONSORTIUM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR 26 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL RADIOMAIL CORPORATION OR CONTRIBUTORS 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 35 * OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * This software was written for RadioMail Corporation by Ted Lemon 38 * under a contract with Vixie Enterprises. Further modifications have 39 * been made for the Internet Software Consortium under a contract 40 * with Vixie Laboratories. 41 */ 42 43#include <errno.h> 44 45#include "dhcpd.h" 46 47static void do_percentm(char *obuf, size_t size, char *ibuf); 48 49static char mbuf[1024]; 50static char fbuf[1024]; 51 52int warnings_occurred; 53 54/* 55 * Log an error message, then exit. 56 */ 57void 58error(char *fmt, ...) 59{ 60 va_list list; 61 62 do_percentm(fbuf, sizeof(fbuf), fmt); 63 64 va_start(list, fmt); 65 vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 66 va_end(list); 67 68#ifndef DEBUG 69 syslog(log_priority | LOG_ERR, "%s", mbuf); 70#endif 71 72 /* Also log it to stderr? */ 73 if (log_perror) { 74 write(2, mbuf, strlen(mbuf)); 75 write(2, "\n", 1); 76 } 77 78 syslog(LOG_CRIT, "exiting."); 79 if (log_perror) { 80 fprintf(stderr, "exiting.\n"); 81 fflush(stderr); 82 } 83 exit(1); 84} 85 86/* 87 * Log a warning message... 88 */ 89int 90warning(char *fmt, ...) 91{ 92 va_list list; 93 94 do_percentm(fbuf, sizeof(fbuf), fmt); 95 96 va_start(list, fmt); 97 vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 98 va_end(list); 99 100#ifndef DEBUG 101 syslog(log_priority | LOG_ERR, "%s", mbuf); 102#endif 103 104 if (log_perror) { 105 write(2, mbuf, strlen(mbuf)); 106 write(2, "\n", 1); 107 } 108 109 return (0); 110} 111 112/* 113 * Log a note... 114 */ 115int 116note(char *fmt, ...) 117{ 118 va_list list; 119 120 do_percentm(fbuf, sizeof(fbuf), fmt); 121 122 va_start(list, fmt); 123 vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 124 va_end(list); 125 126#ifndef DEBUG 127 syslog(log_priority | LOG_INFO, "%s", mbuf); 128#endif 129 130 if (log_perror) { 131 write(2, mbuf, strlen(mbuf)); 132 write(2, "\n", 1); 133 } 134 135 return (0); 136} 137 138/* 139 * Log a debug message... 140 */ 141int 142debug(char *fmt, ...) 143{ 144 va_list list; 145 146 do_percentm(fbuf, sizeof(fbuf), fmt); 147 148 va_start(list, fmt); 149 vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 150 va_end(list); 151 152#ifndef DEBUG 153 syslog(log_priority | LOG_DEBUG, "%s", mbuf); 154#endif 155 156 if (log_perror) { 157 write(2, mbuf, strlen(mbuf)); 158 write(2, "\n", 1); 159 } 160 161 return (0); 162} 163 164/* 165 * Find %m in the input string and substitute an error message string. 166 */ 167static void 168do_percentm(char *obuf, size_t size, char *ibuf) 169{ 170 char ch; 171 char *s = ibuf; 172 char *t = obuf; 173 size_t prlen; 174 size_t fmt_left; 175 int saved_errno = errno; 176 177 /* 178 * We wouldn't need this mess if printf handled %m, or if 179 * strerror() had been invented before syslog(). 180 */ 181 for (fmt_left = size; (ch = *s); ++s) { 182 if (ch == '%' && s[1] == 'm') { 183 ++s; 184 prlen = snprintf(t, fmt_left, "%s", 185 strerror(saved_errno)); 186 if (prlen >= fmt_left) 187 prlen = fmt_left - 1; 188 t += prlen; 189 fmt_left -= prlen; 190 } else { 191 if (fmt_left > 1) { 192 *t++ = ch; 193 fmt_left--; 194 } 195 } 196 } 197 *t = '\0'; 198} 199 200int 201parse_warn(char *fmt, ...) 202{ 203 va_list list; 204 static char spaces[] = 205 " " 206 " "; /* 80 spaces */ 207 208 do_percentm(mbuf, sizeof(mbuf), fmt); 209 snprintf(fbuf, sizeof(fbuf), "%s line %d: %s", tlname, lexline, mbuf); 210 va_start(list, fmt); 211 vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 212 va_end(list); 213 214#ifndef DEBUG 215 syslog(log_priority | LOG_ERR, "%s", mbuf); 216 syslog(log_priority | LOG_ERR, "%s", token_line); 217 if (lexline < 81) 218 syslog(log_priority | LOG_ERR, 219 "%s^", &spaces[sizeof(spaces) - lexchar]); 220#endif 221 222 if (log_perror) { 223 write(2, mbuf, strlen(mbuf)); 224 write(2, "\n", 1); 225 write(2, token_line, strlen(token_line)); 226 write(2, "\n", 1); 227 write(2, spaces, lexchar - 1); 228 write(2, "^\n", 2); 229 } 230 231 warnings_occurred = 1; 232 233 return (0); 234} 235