147c08596SBrooks Davis /* $OpenBSD: errwarn.c,v 1.7 2004/05/04 22:23:01 mickey Exp $ */ 247c08596SBrooks Davis 347c08596SBrooks Davis /* Errors and warnings... */ 447c08596SBrooks Davis 58a16b7a1SPedro F. Giffuni /*- 68a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 78a16b7a1SPedro F. Giffuni * 847c08596SBrooks Davis * Copyright (c) 1996 The Internet Software Consortium. 947c08596SBrooks Davis * All Rights Reserved. 1047c08596SBrooks Davis * Copyright (c) 1995 RadioMail Corporation. All rights reserved. 1147c08596SBrooks Davis * 1247c08596SBrooks Davis * Redistribution and use in source and binary forms, with or without 1347c08596SBrooks Davis * modification, are permitted provided that the following conditions 1447c08596SBrooks Davis * are met: 1547c08596SBrooks Davis * 1647c08596SBrooks Davis * 1. Redistributions of source code must retain the above copyright 1747c08596SBrooks Davis * notice, this list of conditions and the following disclaimer. 1847c08596SBrooks Davis * 2. Redistributions in binary form must reproduce the above copyright 1947c08596SBrooks Davis * notice, this list of conditions and the following disclaimer in the 2047c08596SBrooks Davis * documentation and/or other materials provided with the distribution. 2147c08596SBrooks Davis * 3. Neither the name of RadioMail Corporation, the Internet Software 2247c08596SBrooks Davis * Consortium nor the names of its contributors may be used to endorse 2347c08596SBrooks Davis * or promote products derived from this software without specific 2447c08596SBrooks Davis * prior written permission. 2547c08596SBrooks Davis * 2647c08596SBrooks Davis * THIS SOFTWARE IS PROVIDED BY RADIOMAIL CORPORATION, THE INTERNET 2747c08596SBrooks Davis * SOFTWARE CONSORTIUM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR 2847c08596SBrooks Davis * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2947c08596SBrooks Davis * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3047c08596SBrooks Davis * ARE DISCLAIMED. IN NO EVENT SHALL RADIOMAIL CORPORATION OR CONTRIBUTORS 3147c08596SBrooks Davis * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 3247c08596SBrooks Davis * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3347c08596SBrooks Davis * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3447c08596SBrooks Davis * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3547c08596SBrooks Davis * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3647c08596SBrooks Davis * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 3747c08596SBrooks Davis * OF THE POSSIBILITY OF SUCH DAMAGE. 3847c08596SBrooks Davis * 3947c08596SBrooks Davis * This software was written for RadioMail Corporation by Ted Lemon 4047c08596SBrooks Davis * under a contract with Vixie Enterprises. Further modifications have 4147c08596SBrooks Davis * been made for the Internet Software Consortium under a contract 4247c08596SBrooks Davis * with Vixie Laboratories. 4347c08596SBrooks Davis */ 4447c08596SBrooks Davis 458794fdbbSBrooks Davis #include <sys/cdefs.h> 468794fdbbSBrooks Davis __FBSDID("$FreeBSD$"); 478794fdbbSBrooks Davis 4847c08596SBrooks Davis #include <errno.h> 4947c08596SBrooks Davis 5047c08596SBrooks Davis #include "dhcpd.h" 5147c08596SBrooks Davis 52*79a1d195SAlan Somers static void do_percentm(char *obuf, size_t size, const char *ibuf); 5347c08596SBrooks Davis 5447c08596SBrooks Davis static char mbuf[1024]; 5547c08596SBrooks Davis static char fbuf[1024]; 5647c08596SBrooks Davis 5747c08596SBrooks Davis int warnings_occurred; 5847c08596SBrooks Davis 5947c08596SBrooks Davis /* 6047c08596SBrooks Davis * Log an error message, then exit. 6147c08596SBrooks Davis */ 6247c08596SBrooks Davis void 63*79a1d195SAlan Somers error(const char *fmt, ...) 6447c08596SBrooks Davis { 6547c08596SBrooks Davis va_list list; 6647c08596SBrooks Davis 6747c08596SBrooks Davis do_percentm(fbuf, sizeof(fbuf), fmt); 6847c08596SBrooks Davis 6947c08596SBrooks Davis va_start(list, fmt); 7047c08596SBrooks Davis vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 7147c08596SBrooks Davis va_end(list); 7247c08596SBrooks Davis 7347c08596SBrooks Davis #ifndef DEBUG 74cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf); 7547c08596SBrooks Davis #endif 7647c08596SBrooks Davis 7747c08596SBrooks Davis /* Also log it to stderr? */ 7847c08596SBrooks Davis if (log_perror) { 7947c08596SBrooks Davis write(2, mbuf, strlen(mbuf)); 8047c08596SBrooks Davis write(2, "\n", 1); 8147c08596SBrooks Davis } 8247c08596SBrooks Davis 83cb003dd9SMariusz Zaborski cap_syslog(capsyslog, LOG_CRIT, "exiting."); 8447c08596SBrooks Davis if (log_perror) { 8547c08596SBrooks Davis fprintf(stderr, "exiting.\n"); 8647c08596SBrooks Davis fflush(stderr); 8747c08596SBrooks Davis } 8823f39c90SDag-Erling Smørgrav if (pidfile != NULL) 8923f39c90SDag-Erling Smørgrav pidfile_remove(pidfile); 9047c08596SBrooks Davis exit(1); 9147c08596SBrooks Davis } 9247c08596SBrooks Davis 9347c08596SBrooks Davis /* 9447c08596SBrooks Davis * Log a warning message... 9547c08596SBrooks Davis */ 9647c08596SBrooks Davis int 97*79a1d195SAlan Somers warning(const char *fmt, ...) 9847c08596SBrooks Davis { 9947c08596SBrooks Davis va_list list; 10047c08596SBrooks Davis 10147c08596SBrooks Davis do_percentm(fbuf, sizeof(fbuf), fmt); 10247c08596SBrooks Davis 10347c08596SBrooks Davis va_start(list, fmt); 10447c08596SBrooks Davis vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 10547c08596SBrooks Davis va_end(list); 10647c08596SBrooks Davis 10747c08596SBrooks Davis #ifndef DEBUG 108cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf); 10947c08596SBrooks Davis #endif 11047c08596SBrooks Davis 11147c08596SBrooks Davis if (log_perror) { 11247c08596SBrooks Davis write(2, mbuf, strlen(mbuf)); 11347c08596SBrooks Davis write(2, "\n", 1); 11447c08596SBrooks Davis } 11547c08596SBrooks Davis 11647c08596SBrooks Davis return (0); 11747c08596SBrooks Davis } 11847c08596SBrooks Davis 11947c08596SBrooks Davis /* 12047c08596SBrooks Davis * Log a note... 12147c08596SBrooks Davis */ 12247c08596SBrooks Davis int 123*79a1d195SAlan Somers note(const char *fmt, ...) 12447c08596SBrooks Davis { 12547c08596SBrooks Davis va_list list; 12647c08596SBrooks Davis 12747c08596SBrooks Davis do_percentm(fbuf, sizeof(fbuf), fmt); 12847c08596SBrooks Davis 12947c08596SBrooks Davis va_start(list, fmt); 13047c08596SBrooks Davis vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 13147c08596SBrooks Davis va_end(list); 13247c08596SBrooks Davis 13347c08596SBrooks Davis #ifndef DEBUG 134cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_INFO, "%s", mbuf); 13547c08596SBrooks Davis #endif 13647c08596SBrooks Davis 13747c08596SBrooks Davis if (log_perror) { 13847c08596SBrooks Davis write(2, mbuf, strlen(mbuf)); 13947c08596SBrooks Davis write(2, "\n", 1); 14047c08596SBrooks Davis } 14147c08596SBrooks Davis 14247c08596SBrooks Davis return (0); 14347c08596SBrooks Davis } 14447c08596SBrooks Davis 14547c08596SBrooks Davis /* 14647c08596SBrooks Davis * Log a debug message... 14747c08596SBrooks Davis */ 14847c08596SBrooks Davis int 149*79a1d195SAlan Somers debug(const char *fmt, ...) 15047c08596SBrooks Davis { 15147c08596SBrooks Davis va_list list; 15247c08596SBrooks Davis 15347c08596SBrooks Davis do_percentm(fbuf, sizeof(fbuf), fmt); 15447c08596SBrooks Davis 15547c08596SBrooks Davis va_start(list, fmt); 15647c08596SBrooks Davis vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 15747c08596SBrooks Davis va_end(list); 15847c08596SBrooks Davis 15947c08596SBrooks Davis #ifndef DEBUG 160cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_DEBUG, "%s", mbuf); 16147c08596SBrooks Davis #endif 16247c08596SBrooks Davis 16347c08596SBrooks Davis if (log_perror) { 16447c08596SBrooks Davis write(2, mbuf, strlen(mbuf)); 16547c08596SBrooks Davis write(2, "\n", 1); 16647c08596SBrooks Davis } 16747c08596SBrooks Davis 16847c08596SBrooks Davis return (0); 16947c08596SBrooks Davis } 17047c08596SBrooks Davis 17147c08596SBrooks Davis /* 17247c08596SBrooks Davis * Find %m in the input string and substitute an error message string. 17347c08596SBrooks Davis */ 17447c08596SBrooks Davis static void 175*79a1d195SAlan Somers do_percentm(char *obuf, size_t size, const char *ibuf) 17647c08596SBrooks Davis { 17747c08596SBrooks Davis char ch; 178*79a1d195SAlan Somers const char *s = ibuf; 17947c08596SBrooks Davis char *t = obuf; 18047c08596SBrooks Davis size_t prlen; 18147c08596SBrooks Davis size_t fmt_left; 18247c08596SBrooks Davis int saved_errno = errno; 18347c08596SBrooks Davis 18447c08596SBrooks Davis /* 18547c08596SBrooks Davis * We wouldn't need this mess if printf handled %m, or if 18647c08596SBrooks Davis * strerror() had been invented before syslog(). 18747c08596SBrooks Davis */ 18847c08596SBrooks Davis for (fmt_left = size; (ch = *s); ++s) { 18947c08596SBrooks Davis if (ch == '%' && s[1] == 'm') { 19047c08596SBrooks Davis ++s; 19147c08596SBrooks Davis prlen = snprintf(t, fmt_left, "%s", 19247c08596SBrooks Davis strerror(saved_errno)); 19347c08596SBrooks Davis if (prlen >= fmt_left) 19447c08596SBrooks Davis prlen = fmt_left - 1; 19547c08596SBrooks Davis t += prlen; 19647c08596SBrooks Davis fmt_left -= prlen; 19747c08596SBrooks Davis } else { 19847c08596SBrooks Davis if (fmt_left > 1) { 19947c08596SBrooks Davis *t++ = ch; 20047c08596SBrooks Davis fmt_left--; 20147c08596SBrooks Davis } 20247c08596SBrooks Davis } 20347c08596SBrooks Davis } 20447c08596SBrooks Davis *t = '\0'; 20547c08596SBrooks Davis } 20647c08596SBrooks Davis 20747c08596SBrooks Davis int 208*79a1d195SAlan Somers parse_warn(const char *fmt, ...) 20947c08596SBrooks Davis { 21047c08596SBrooks Davis va_list list; 21147c08596SBrooks Davis static char spaces[] = 21247c08596SBrooks Davis " " 21347c08596SBrooks Davis " "; /* 80 spaces */ 21447c08596SBrooks Davis 21547c08596SBrooks Davis do_percentm(mbuf, sizeof(mbuf), fmt); 21647c08596SBrooks Davis snprintf(fbuf, sizeof(fbuf), "%s line %d: %s", tlname, lexline, mbuf); 21747c08596SBrooks Davis va_start(list, fmt); 21847c08596SBrooks Davis vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 21947c08596SBrooks Davis va_end(list); 22047c08596SBrooks Davis 22147c08596SBrooks Davis #ifndef DEBUG 222cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf); 223cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", token_line); 22447c08596SBrooks Davis if (lexline < 81) 225cb003dd9SMariusz Zaborski cap_syslog(capsyslog, log_priority | LOG_ERR, 22647c08596SBrooks Davis "%s^", &spaces[sizeof(spaces) - lexchar]); 22747c08596SBrooks Davis #endif 22847c08596SBrooks Davis 22947c08596SBrooks Davis if (log_perror) { 23047c08596SBrooks Davis write(2, mbuf, strlen(mbuf)); 23147c08596SBrooks Davis write(2, "\n", 1); 23247c08596SBrooks Davis write(2, token_line, strlen(token_line)); 23347c08596SBrooks Davis write(2, "\n", 1); 23447c08596SBrooks Davis write(2, spaces, lexchar - 1); 23547c08596SBrooks Davis write(2, "^\n", 2); 23647c08596SBrooks Davis } 23747c08596SBrooks Davis 23847c08596SBrooks Davis warnings_occurred = 1; 23947c08596SBrooks Davis 24047c08596SBrooks Davis return (0); 24147c08596SBrooks Davis } 242