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