xref: /freebsd/sbin/dhclient/errwarn.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
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>
4647c08596SBrooks Davis #include <errno.h>
4747c08596SBrooks Davis 
4847c08596SBrooks Davis #include "dhcpd.h"
4947c08596SBrooks Davis 
50*79a1d195SAlan Somers static void do_percentm(char *obuf, size_t size, const char *ibuf);
5147c08596SBrooks Davis 
5247c08596SBrooks Davis static char mbuf[1024];
5347c08596SBrooks Davis static char fbuf[1024];
5447c08596SBrooks Davis 
5547c08596SBrooks Davis int warnings_occurred;
5647c08596SBrooks Davis 
5747c08596SBrooks Davis /*
5847c08596SBrooks Davis  * Log an error message, then exit.
5947c08596SBrooks Davis  */
6047c08596SBrooks Davis void
error(const char * fmt,...)61*79a1d195SAlan Somers error(const char *fmt, ...)
6247c08596SBrooks Davis {
6347c08596SBrooks Davis 	va_list list;
6447c08596SBrooks Davis 
6547c08596SBrooks Davis 	do_percentm(fbuf, sizeof(fbuf), fmt);
6647c08596SBrooks Davis 
6747c08596SBrooks Davis 	va_start(list, fmt);
6847c08596SBrooks Davis 	vsnprintf(mbuf, sizeof(mbuf), fbuf, list);
6947c08596SBrooks Davis 	va_end(list);
7047c08596SBrooks Davis 
7147c08596SBrooks Davis #ifndef DEBUG
72cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf);
7347c08596SBrooks Davis #endif
7447c08596SBrooks Davis 
7547c08596SBrooks Davis 	/* Also log it to stderr? */
7647c08596SBrooks Davis 	if (log_perror) {
7747c08596SBrooks Davis 		write(2, mbuf, strlen(mbuf));
7847c08596SBrooks Davis 		write(2, "\n", 1);
7947c08596SBrooks Davis 	}
8047c08596SBrooks Davis 
81cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, LOG_CRIT, "exiting.");
8247c08596SBrooks Davis 	if (log_perror) {
8347c08596SBrooks Davis 		fprintf(stderr, "exiting.\n");
8447c08596SBrooks Davis 		fflush(stderr);
8547c08596SBrooks Davis 	}
8623f39c90SDag-Erling Smørgrav 	if (pidfile != NULL)
8723f39c90SDag-Erling Smørgrav 		pidfile_remove(pidfile);
8847c08596SBrooks Davis 	exit(1);
8947c08596SBrooks Davis }
9047c08596SBrooks Davis 
9147c08596SBrooks Davis /*
9247c08596SBrooks Davis  * Log a warning message...
9347c08596SBrooks Davis  */
9447c08596SBrooks Davis int
warning(const char * fmt,...)95*79a1d195SAlan Somers warning(const char *fmt, ...)
9647c08596SBrooks Davis {
9747c08596SBrooks Davis 	va_list list;
9847c08596SBrooks Davis 
9947c08596SBrooks Davis 	do_percentm(fbuf, sizeof(fbuf), fmt);
10047c08596SBrooks Davis 
10147c08596SBrooks Davis 	va_start(list, fmt);
10247c08596SBrooks Davis 	vsnprintf(mbuf, sizeof(mbuf), fbuf, list);
10347c08596SBrooks Davis 	va_end(list);
10447c08596SBrooks Davis 
10547c08596SBrooks Davis #ifndef DEBUG
106cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf);
10747c08596SBrooks Davis #endif
10847c08596SBrooks Davis 
10947c08596SBrooks Davis 	if (log_perror) {
11047c08596SBrooks Davis 		write(2, mbuf, strlen(mbuf));
11147c08596SBrooks Davis 		write(2, "\n", 1);
11247c08596SBrooks Davis 	}
11347c08596SBrooks Davis 
11447c08596SBrooks Davis 	return (0);
11547c08596SBrooks Davis }
11647c08596SBrooks Davis 
11747c08596SBrooks Davis /*
11847c08596SBrooks Davis  * Log a note...
11947c08596SBrooks Davis  */
12047c08596SBrooks Davis int
note(const char * fmt,...)121*79a1d195SAlan Somers note(const char *fmt, ...)
12247c08596SBrooks Davis {
12347c08596SBrooks Davis 	va_list list;
12447c08596SBrooks Davis 
12547c08596SBrooks Davis 	do_percentm(fbuf, sizeof(fbuf), fmt);
12647c08596SBrooks Davis 
12747c08596SBrooks Davis 	va_start(list, fmt);
12847c08596SBrooks Davis 	vsnprintf(mbuf, sizeof(mbuf), fbuf, list);
12947c08596SBrooks Davis 	va_end(list);
13047c08596SBrooks Davis 
13147c08596SBrooks Davis #ifndef DEBUG
132cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_INFO, "%s", mbuf);
13347c08596SBrooks Davis #endif
13447c08596SBrooks Davis 
13547c08596SBrooks Davis 	if (log_perror) {
13647c08596SBrooks Davis 		write(2, mbuf, strlen(mbuf));
13747c08596SBrooks Davis 		write(2, "\n", 1);
13847c08596SBrooks Davis 	}
13947c08596SBrooks Davis 
14047c08596SBrooks Davis 	return (0);
14147c08596SBrooks Davis }
14247c08596SBrooks Davis 
14347c08596SBrooks Davis /*
14447c08596SBrooks Davis  * Log a debug message...
14547c08596SBrooks Davis  */
14647c08596SBrooks Davis int
debug(const char * fmt,...)147*79a1d195SAlan Somers debug(const char *fmt, ...)
14847c08596SBrooks Davis {
14947c08596SBrooks Davis 	va_list list;
15047c08596SBrooks Davis 
15147c08596SBrooks Davis 	do_percentm(fbuf, sizeof(fbuf), fmt);
15247c08596SBrooks Davis 
15347c08596SBrooks Davis 	va_start(list, fmt);
15447c08596SBrooks Davis 	vsnprintf(mbuf, sizeof(mbuf), fbuf, list);
15547c08596SBrooks Davis 	va_end(list);
15647c08596SBrooks Davis 
15747c08596SBrooks Davis #ifndef DEBUG
158cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_DEBUG, "%s", mbuf);
15947c08596SBrooks Davis #endif
16047c08596SBrooks Davis 
16147c08596SBrooks Davis 	if (log_perror) {
16247c08596SBrooks Davis 		write(2, mbuf, strlen(mbuf));
16347c08596SBrooks Davis 		write(2, "\n", 1);
16447c08596SBrooks Davis 	}
16547c08596SBrooks Davis 
16647c08596SBrooks Davis 	return (0);
16747c08596SBrooks Davis }
16847c08596SBrooks Davis 
16947c08596SBrooks Davis /*
17047c08596SBrooks Davis  * Find %m in the input string and substitute an error message string.
17147c08596SBrooks Davis  */
17247c08596SBrooks Davis static void
do_percentm(char * obuf,size_t size,const char * ibuf)173*79a1d195SAlan Somers do_percentm(char *obuf, size_t size, const char *ibuf)
17447c08596SBrooks Davis {
17547c08596SBrooks Davis 	char ch;
176*79a1d195SAlan Somers 	const char *s = ibuf;
17747c08596SBrooks Davis 	char *t = obuf;
17847c08596SBrooks Davis 	size_t prlen;
17947c08596SBrooks Davis 	size_t fmt_left;
18047c08596SBrooks Davis 	int saved_errno = errno;
18147c08596SBrooks Davis 
18247c08596SBrooks Davis 	/*
18347c08596SBrooks Davis 	 * We wouldn't need this mess if printf handled %m, or if
18447c08596SBrooks Davis 	 * strerror() had been invented before syslog().
18547c08596SBrooks Davis 	 */
18647c08596SBrooks Davis 	for (fmt_left = size; (ch = *s); ++s) {
18747c08596SBrooks Davis 		if (ch == '%' && s[1] == 'm') {
18847c08596SBrooks Davis 			++s;
18947c08596SBrooks Davis 			prlen = snprintf(t, fmt_left, "%s",
19047c08596SBrooks Davis 			    strerror(saved_errno));
19147c08596SBrooks Davis 			if (prlen >= fmt_left)
19247c08596SBrooks Davis 				prlen = fmt_left - 1;
19347c08596SBrooks Davis 			t += prlen;
19447c08596SBrooks Davis 			fmt_left -= prlen;
19547c08596SBrooks Davis 		} else {
19647c08596SBrooks Davis 			if (fmt_left > 1) {
19747c08596SBrooks Davis 				*t++ = ch;
19847c08596SBrooks Davis 				fmt_left--;
19947c08596SBrooks Davis 			}
20047c08596SBrooks Davis 		}
20147c08596SBrooks Davis 	}
20247c08596SBrooks Davis 	*t = '\0';
20347c08596SBrooks Davis }
20447c08596SBrooks Davis 
20547c08596SBrooks Davis int
parse_warn(const char * fmt,...)206*79a1d195SAlan Somers parse_warn(const char *fmt, ...)
20747c08596SBrooks Davis {
20847c08596SBrooks Davis 	va_list list;
20947c08596SBrooks Davis 	static char spaces[] =
21047c08596SBrooks Davis 	    "                                        "
21147c08596SBrooks Davis 	    "                                        "; /* 80 spaces */
21247c08596SBrooks Davis 
21347c08596SBrooks Davis 	do_percentm(mbuf, sizeof(mbuf), fmt);
21447c08596SBrooks Davis 	snprintf(fbuf, sizeof(fbuf), "%s line %d: %s", tlname, lexline, mbuf);
21547c08596SBrooks Davis 	va_start(list, fmt);
21647c08596SBrooks Davis 	vsnprintf(mbuf, sizeof(mbuf), fbuf, list);
21747c08596SBrooks Davis 	va_end(list);
21847c08596SBrooks Davis 
21947c08596SBrooks Davis #ifndef DEBUG
220cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", mbuf);
221cb003dd9SMariusz Zaborski 	cap_syslog(capsyslog, log_priority | LOG_ERR, "%s", token_line);
22247c08596SBrooks Davis 	if (lexline < 81)
223cb003dd9SMariusz Zaborski 		cap_syslog(capsyslog, log_priority | LOG_ERR,
22447c08596SBrooks Davis 		    "%s^", &spaces[sizeof(spaces) - lexchar]);
22547c08596SBrooks Davis #endif
22647c08596SBrooks Davis 
22747c08596SBrooks Davis 	if (log_perror) {
22847c08596SBrooks Davis 		write(2, mbuf, strlen(mbuf));
22947c08596SBrooks Davis 		write(2, "\n", 1);
23047c08596SBrooks Davis 		write(2, token_line, strlen(token_line));
23147c08596SBrooks Davis 		write(2, "\n", 1);
23247c08596SBrooks Davis 		write(2, spaces, lexchar - 1);
23347c08596SBrooks Davis 		write(2, "^\n", 2);
23447c08596SBrooks Davis 	}
23547c08596SBrooks Davis 
23647c08596SBrooks Davis 	warnings_occurred = 1;
23747c08596SBrooks Davis 
23847c08596SBrooks Davis 	return (0);
23947c08596SBrooks Davis }
240