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