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