1147072Sbrooks/* $OpenBSD: errwarn.c,v 1.7 2004/05/04 22:23:01 mickey Exp $ */ 2147072Sbrooks 3147072Sbrooks/* Errors and warnings... */ 4147072Sbrooks 5147072Sbrooks/* 6147072Sbrooks * Copyright (c) 1996 The Internet Software Consortium. 7147072Sbrooks * All Rights Reserved. 8147072Sbrooks * Copyright (c) 1995 RadioMail Corporation. All rights reserved. 9147072Sbrooks * 10147072Sbrooks * Redistribution and use in source and binary forms, with or without 11147072Sbrooks * modification, are permitted provided that the following conditions 12147072Sbrooks * are met: 13147072Sbrooks * 14147072Sbrooks * 1. Redistributions of source code must retain the above copyright 15147072Sbrooks * notice, this list of conditions and the following disclaimer. 16147072Sbrooks * 2. Redistributions in binary form must reproduce the above copyright 17147072Sbrooks * notice, this list of conditions and the following disclaimer in the 18147072Sbrooks * documentation and/or other materials provided with the distribution. 19147072Sbrooks * 3. Neither the name of RadioMail Corporation, the Internet Software 20147072Sbrooks * Consortium nor the names of its contributors may be used to endorse 21147072Sbrooks * or promote products derived from this software without specific 22147072Sbrooks * prior written permission. 23147072Sbrooks * 24147072Sbrooks * THIS SOFTWARE IS PROVIDED BY RADIOMAIL CORPORATION, THE INTERNET 25147072Sbrooks * SOFTWARE CONSORTIUM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR 26147072Sbrooks * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 27147072Sbrooks * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28147072Sbrooks * ARE DISCLAIMED. IN NO EVENT SHALL RADIOMAIL CORPORATION OR CONTRIBUTORS 29147072Sbrooks * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30147072Sbrooks * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31147072Sbrooks * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32147072Sbrooks * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33147072Sbrooks * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34147072Sbrooks * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 35147072Sbrooks * OF THE POSSIBILITY OF SUCH DAMAGE. 36147072Sbrooks * 37147072Sbrooks * This software was written for RadioMail Corporation by Ted Lemon 38147072Sbrooks * under a contract with Vixie Enterprises. Further modifications have 39147072Sbrooks * been made for the Internet Software Consortium under a contract 40147072Sbrooks * with Vixie Laboratories. 41147072Sbrooks */ 42147072Sbrooks 43149399Sbrooks#include <sys/cdefs.h> 44149399Sbrooks__FBSDID("$FreeBSD$"); 45149399Sbrooks 46147072Sbrooks#include <errno.h> 47147072Sbrooks 48147072Sbrooks#include "dhcpd.h" 49147072Sbrooks 50147072Sbrooksstatic void do_percentm(char *obuf, size_t size, char *ibuf); 51147072Sbrooks 52147072Sbrooksstatic char mbuf[1024]; 53147072Sbrooksstatic char fbuf[1024]; 54147072Sbrooks 55147072Sbrooksint warnings_occurred; 56147072Sbrooks 57147072Sbrooks/* 58147072Sbrooks * Log an error message, then exit. 59147072Sbrooks */ 60147072Sbrooksvoid 61147072Sbrookserror(char *fmt, ...) 62147072Sbrooks{ 63147072Sbrooks va_list list; 64147072Sbrooks 65147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 66147072Sbrooks 67147072Sbrooks va_start(list, fmt); 68147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 69147072Sbrooks va_end(list); 70147072Sbrooks 71147072Sbrooks#ifndef DEBUG 72147072Sbrooks syslog(log_priority | LOG_ERR, "%s", mbuf); 73147072Sbrooks#endif 74147072Sbrooks 75147072Sbrooks /* Also log it to stderr? */ 76147072Sbrooks if (log_perror) { 77147072Sbrooks write(2, mbuf, strlen(mbuf)); 78147072Sbrooks write(2, "\n", 1); 79147072Sbrooks } 80147072Sbrooks 81147072Sbrooks syslog(LOG_CRIT, "exiting."); 82147072Sbrooks if (log_perror) { 83147072Sbrooks fprintf(stderr, "exiting.\n"); 84147072Sbrooks fflush(stderr); 85147072Sbrooks } 86226345Sdes if (pidfile != NULL) 87226345Sdes pidfile_remove(pidfile); 88147072Sbrooks exit(1); 89147072Sbrooks} 90147072Sbrooks 91147072Sbrooks/* 92147072Sbrooks * Log a warning message... 93147072Sbrooks */ 94147072Sbrooksint 95147072Sbrookswarning(char *fmt, ...) 96147072Sbrooks{ 97147072Sbrooks va_list list; 98147072Sbrooks 99147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 100147072Sbrooks 101147072Sbrooks va_start(list, fmt); 102147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 103147072Sbrooks va_end(list); 104147072Sbrooks 105147072Sbrooks#ifndef DEBUG 106147072Sbrooks syslog(log_priority | LOG_ERR, "%s", mbuf); 107147072Sbrooks#endif 108147072Sbrooks 109147072Sbrooks if (log_perror) { 110147072Sbrooks write(2, mbuf, strlen(mbuf)); 111147072Sbrooks write(2, "\n", 1); 112147072Sbrooks } 113147072Sbrooks 114147072Sbrooks return (0); 115147072Sbrooks} 116147072Sbrooks 117147072Sbrooks/* 118147072Sbrooks * Log a note... 119147072Sbrooks */ 120147072Sbrooksint 121147072Sbrooksnote(char *fmt, ...) 122147072Sbrooks{ 123147072Sbrooks va_list list; 124147072Sbrooks 125147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 126147072Sbrooks 127147072Sbrooks va_start(list, fmt); 128147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 129147072Sbrooks va_end(list); 130147072Sbrooks 131147072Sbrooks#ifndef DEBUG 132147072Sbrooks syslog(log_priority | LOG_INFO, "%s", mbuf); 133147072Sbrooks#endif 134147072Sbrooks 135147072Sbrooks if (log_perror) { 136147072Sbrooks write(2, mbuf, strlen(mbuf)); 137147072Sbrooks write(2, "\n", 1); 138147072Sbrooks } 139147072Sbrooks 140147072Sbrooks return (0); 141147072Sbrooks} 142147072Sbrooks 143147072Sbrooks/* 144147072Sbrooks * Log a debug message... 145147072Sbrooks */ 146147072Sbrooksint 147147072Sbrooksdebug(char *fmt, ...) 148147072Sbrooks{ 149147072Sbrooks va_list list; 150147072Sbrooks 151147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 152147072Sbrooks 153147072Sbrooks va_start(list, fmt); 154147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 155147072Sbrooks va_end(list); 156147072Sbrooks 157147072Sbrooks#ifndef DEBUG 158147072Sbrooks syslog(log_priority | LOG_DEBUG, "%s", mbuf); 159147072Sbrooks#endif 160147072Sbrooks 161147072Sbrooks if (log_perror) { 162147072Sbrooks write(2, mbuf, strlen(mbuf)); 163147072Sbrooks write(2, "\n", 1); 164147072Sbrooks } 165147072Sbrooks 166147072Sbrooks return (0); 167147072Sbrooks} 168147072Sbrooks 169147072Sbrooks/* 170147072Sbrooks * Find %m in the input string and substitute an error message string. 171147072Sbrooks */ 172147072Sbrooksstatic void 173147072Sbrooksdo_percentm(char *obuf, size_t size, char *ibuf) 174147072Sbrooks{ 175147072Sbrooks char ch; 176147072Sbrooks char *s = ibuf; 177147072Sbrooks char *t = obuf; 178147072Sbrooks size_t prlen; 179147072Sbrooks size_t fmt_left; 180147072Sbrooks int saved_errno = errno; 181147072Sbrooks 182147072Sbrooks /* 183147072Sbrooks * We wouldn't need this mess if printf handled %m, or if 184147072Sbrooks * strerror() had been invented before syslog(). 185147072Sbrooks */ 186147072Sbrooks for (fmt_left = size; (ch = *s); ++s) { 187147072Sbrooks if (ch == '%' && s[1] == 'm') { 188147072Sbrooks ++s; 189147072Sbrooks prlen = snprintf(t, fmt_left, "%s", 190147072Sbrooks strerror(saved_errno)); 191147072Sbrooks if (prlen >= fmt_left) 192147072Sbrooks prlen = fmt_left - 1; 193147072Sbrooks t += prlen; 194147072Sbrooks fmt_left -= prlen; 195147072Sbrooks } else { 196147072Sbrooks if (fmt_left > 1) { 197147072Sbrooks *t++ = ch; 198147072Sbrooks fmt_left--; 199147072Sbrooks } 200147072Sbrooks } 201147072Sbrooks } 202147072Sbrooks *t = '\0'; 203147072Sbrooks} 204147072Sbrooks 205147072Sbrooksint 206147072Sbrooksparse_warn(char *fmt, ...) 207147072Sbrooks{ 208147072Sbrooks va_list list; 209147072Sbrooks static char spaces[] = 210147072Sbrooks " " 211147072Sbrooks " "; /* 80 spaces */ 212147072Sbrooks 213147072Sbrooks do_percentm(mbuf, sizeof(mbuf), fmt); 214147072Sbrooks snprintf(fbuf, sizeof(fbuf), "%s line %d: %s", tlname, lexline, mbuf); 215147072Sbrooks va_start(list, fmt); 216147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 217147072Sbrooks va_end(list); 218147072Sbrooks 219147072Sbrooks#ifndef DEBUG 220147072Sbrooks syslog(log_priority | LOG_ERR, "%s", mbuf); 221147072Sbrooks syslog(log_priority | LOG_ERR, "%s", token_line); 222147072Sbrooks if (lexline < 81) 223147072Sbrooks syslog(log_priority | LOG_ERR, 224147072Sbrooks "%s^", &spaces[sizeof(spaces) - lexchar]); 225147072Sbrooks#endif 226147072Sbrooks 227147072Sbrooks if (log_perror) { 228147072Sbrooks write(2, mbuf, strlen(mbuf)); 229147072Sbrooks write(2, "\n", 1); 230147072Sbrooks write(2, token_line, strlen(token_line)); 231147072Sbrooks write(2, "\n", 1); 232147072Sbrooks write(2, spaces, lexchar - 1); 233147072Sbrooks write(2, "^\n", 2); 234147072Sbrooks } 235147072Sbrooks 236147072Sbrooks warnings_occurred = 1; 237147072Sbrooks 238147072Sbrooks return (0); 239147072Sbrooks} 240