errwarn.c revision 149399
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: head/sbin/dhclient/errwarn.c 149399 2005-08-23 23:59:55Z brooks $"); 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 } 86147072Sbrooks exit(1); 87147072Sbrooks} 88147072Sbrooks 89147072Sbrooks/* 90147072Sbrooks * Log a warning message... 91147072Sbrooks */ 92147072Sbrooksint 93147072Sbrookswarning(char *fmt, ...) 94147072Sbrooks{ 95147072Sbrooks va_list list; 96147072Sbrooks 97147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 98147072Sbrooks 99147072Sbrooks va_start(list, fmt); 100147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 101147072Sbrooks va_end(list); 102147072Sbrooks 103147072Sbrooks#ifndef DEBUG 104147072Sbrooks syslog(log_priority | LOG_ERR, "%s", mbuf); 105147072Sbrooks#endif 106147072Sbrooks 107147072Sbrooks if (log_perror) { 108147072Sbrooks write(2, mbuf, strlen(mbuf)); 109147072Sbrooks write(2, "\n", 1); 110147072Sbrooks } 111147072Sbrooks 112147072Sbrooks return (0); 113147072Sbrooks} 114147072Sbrooks 115147072Sbrooks/* 116147072Sbrooks * Log a note... 117147072Sbrooks */ 118147072Sbrooksint 119147072Sbrooksnote(char *fmt, ...) 120147072Sbrooks{ 121147072Sbrooks va_list list; 122147072Sbrooks 123147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 124147072Sbrooks 125147072Sbrooks va_start(list, fmt); 126147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 127147072Sbrooks va_end(list); 128147072Sbrooks 129147072Sbrooks#ifndef DEBUG 130147072Sbrooks syslog(log_priority | LOG_INFO, "%s", mbuf); 131147072Sbrooks#endif 132147072Sbrooks 133147072Sbrooks if (log_perror) { 134147072Sbrooks write(2, mbuf, strlen(mbuf)); 135147072Sbrooks write(2, "\n", 1); 136147072Sbrooks } 137147072Sbrooks 138147072Sbrooks return (0); 139147072Sbrooks} 140147072Sbrooks 141147072Sbrooks/* 142147072Sbrooks * Log a debug message... 143147072Sbrooks */ 144147072Sbrooksint 145147072Sbrooksdebug(char *fmt, ...) 146147072Sbrooks{ 147147072Sbrooks va_list list; 148147072Sbrooks 149147072Sbrooks do_percentm(fbuf, sizeof(fbuf), fmt); 150147072Sbrooks 151147072Sbrooks va_start(list, fmt); 152147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 153147072Sbrooks va_end(list); 154147072Sbrooks 155147072Sbrooks#ifndef DEBUG 156147072Sbrooks syslog(log_priority | LOG_DEBUG, "%s", mbuf); 157147072Sbrooks#endif 158147072Sbrooks 159147072Sbrooks if (log_perror) { 160147072Sbrooks write(2, mbuf, strlen(mbuf)); 161147072Sbrooks write(2, "\n", 1); 162147072Sbrooks } 163147072Sbrooks 164147072Sbrooks return (0); 165147072Sbrooks} 166147072Sbrooks 167147072Sbrooks/* 168147072Sbrooks * Find %m in the input string and substitute an error message string. 169147072Sbrooks */ 170147072Sbrooksstatic void 171147072Sbrooksdo_percentm(char *obuf, size_t size, char *ibuf) 172147072Sbrooks{ 173147072Sbrooks char ch; 174147072Sbrooks char *s = ibuf; 175147072Sbrooks char *t = obuf; 176147072Sbrooks size_t prlen; 177147072Sbrooks size_t fmt_left; 178147072Sbrooks int saved_errno = errno; 179147072Sbrooks 180147072Sbrooks /* 181147072Sbrooks * We wouldn't need this mess if printf handled %m, or if 182147072Sbrooks * strerror() had been invented before syslog(). 183147072Sbrooks */ 184147072Sbrooks for (fmt_left = size; (ch = *s); ++s) { 185147072Sbrooks if (ch == '%' && s[1] == 'm') { 186147072Sbrooks ++s; 187147072Sbrooks prlen = snprintf(t, fmt_left, "%s", 188147072Sbrooks strerror(saved_errno)); 189147072Sbrooks if (prlen >= fmt_left) 190147072Sbrooks prlen = fmt_left - 1; 191147072Sbrooks t += prlen; 192147072Sbrooks fmt_left -= prlen; 193147072Sbrooks } else { 194147072Sbrooks if (fmt_left > 1) { 195147072Sbrooks *t++ = ch; 196147072Sbrooks fmt_left--; 197147072Sbrooks } 198147072Sbrooks } 199147072Sbrooks } 200147072Sbrooks *t = '\0'; 201147072Sbrooks} 202147072Sbrooks 203147072Sbrooksint 204147072Sbrooksparse_warn(char *fmt, ...) 205147072Sbrooks{ 206147072Sbrooks va_list list; 207147072Sbrooks static char spaces[] = 208147072Sbrooks " " 209147072Sbrooks " "; /* 80 spaces */ 210147072Sbrooks 211147072Sbrooks do_percentm(mbuf, sizeof(mbuf), fmt); 212147072Sbrooks snprintf(fbuf, sizeof(fbuf), "%s line %d: %s", tlname, lexline, mbuf); 213147072Sbrooks va_start(list, fmt); 214147072Sbrooks vsnprintf(mbuf, sizeof(mbuf), fbuf, list); 215147072Sbrooks va_end(list); 216147072Sbrooks 217147072Sbrooks#ifndef DEBUG 218147072Sbrooks syslog(log_priority | LOG_ERR, "%s", mbuf); 219147072Sbrooks syslog(log_priority | LOG_ERR, "%s", token_line); 220147072Sbrooks if (lexline < 81) 221147072Sbrooks syslog(log_priority | LOG_ERR, 222147072Sbrooks "%s^", &spaces[sizeof(spaces) - lexchar]); 223147072Sbrooks#endif 224147072Sbrooks 225147072Sbrooks if (log_perror) { 226147072Sbrooks write(2, mbuf, strlen(mbuf)); 227147072Sbrooks write(2, "\n", 1); 228147072Sbrooks write(2, token_line, strlen(token_line)); 229147072Sbrooks write(2, "\n", 1); 230147072Sbrooks write(2, spaces, lexchar - 1); 231147072Sbrooks write(2, "^\n", 2); 232147072Sbrooks } 233147072Sbrooks 234147072Sbrooks warnings_occurred = 1; 235147072Sbrooks 236147072Sbrooks return (0); 237147072Sbrooks} 238