xref: /openbsd-src/usr.sbin/config/util.c (revision 41da4b048144c0ef07f1c056b08babefd50a9b97)
1*41da4b04Stb /*	$OpenBSD: util.c,v 1.18 2016/10/16 09:35:40 tb Exp $	*/
26fd5fbd6Sniklas /*	$NetBSD: util.c,v 1.5 1996/08/31 20:58:29 mycroft Exp $	*/
3608f9123Sniklas 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1992, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * This software was developed by the Computer Systems Engineering group
9df930be7Sderaadt  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
10df930be7Sderaadt  * contributed to Berkeley.
11df930be7Sderaadt  *
12df930be7Sderaadt  * All advertising materials mentioning features or use of this software
13df930be7Sderaadt  * must display the following acknowledgement:
14df930be7Sderaadt  *	This product includes software developed by the University of
15df930be7Sderaadt  *	California, Lawrence Berkeley Laboratories.
16df930be7Sderaadt  *
17df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
18df930be7Sderaadt  * modification, are permitted provided that the following conditions
19df930be7Sderaadt  * are met:
20df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
21df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
22df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
23df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
24df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
2529295d1cSmillert  * 3. Neither the name of the University nor the names of its contributors
26df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
27df930be7Sderaadt  *    without specific prior written permission.
28df930be7Sderaadt  *
29df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39df930be7Sderaadt  * SUCH DAMAGE.
40df930be7Sderaadt  *
41df930be7Sderaadt  *	from: @(#)util.c	8.1 (Berkeley) 6/6/93
42df930be7Sderaadt  */
43df930be7Sderaadt 
44e7beb4a7Smillert #include <sys/types.h>
45c6b62359Sedd 
46df930be7Sderaadt #include <ctype.h>
47dbd4818eSakfaew #include <err.h>
48c6b62359Sedd #include <stdarg.h>
49df930be7Sderaadt #include <stdio.h>
50df930be7Sderaadt #include <stdlib.h>
51df930be7Sderaadt #include <string.h>
52c6b62359Sedd 
53df930be7Sderaadt #include "config.h"
54df930be7Sderaadt 
55*41da4b04Stb static void vxerror(const char *, int, const char *, va_list)
56*41da4b04Stb 		__attribute__((__format__ (printf, 3, 0)));
57df930be7Sderaadt 
58df930be7Sderaadt /*
59df930be7Sderaadt  * Malloc, with abort on error.
60df930be7Sderaadt  */
61df930be7Sderaadt void *
emalloc(size_t size)62815b5809Sderaadt emalloc(size_t size)
63df930be7Sderaadt {
64df930be7Sderaadt 	void *p;
65df930be7Sderaadt 
66e3a3b5caStedu 	if ((p = calloc(1, size)) == NULL)
67dbd4818eSakfaew 		err(1, NULL);
68dbd4818eSakfaew 	return p;
69df930be7Sderaadt }
70df930be7Sderaadt 
71df930be7Sderaadt /*
72c811dcf3Sespie  * Reallocarray, with abort on error.
73df930be7Sderaadt  */
74df930be7Sderaadt void *
ereallocarray(void * p,size_t sz1,size_t sz2)75c811dcf3Sespie ereallocarray(void *p, size_t sz1, size_t sz2)
76df930be7Sderaadt {
77df930be7Sderaadt 
78c811dcf3Sespie 	if ((p = reallocarray(p, sz1, sz2)) == NULL)
79dbd4818eSakfaew 		err(1, NULL);
80dbd4818eSakfaew 	return p;
81c811dcf3Sespie }
82c811dcf3Sespie 
83c811dcf3Sespie /*
84c811dcf3Sespie  * Calloc, with abort on error.
85c811dcf3Sespie  */
86c811dcf3Sespie void *
ecalloc(size_t sz1,size_t sz2)87c811dcf3Sespie ecalloc(size_t sz1, size_t sz2)
88c811dcf3Sespie {
89c811dcf3Sespie 	void *p;
90c811dcf3Sespie 
91c811dcf3Sespie 	if ((p = calloc(sz1, sz2)) == NULL)
92dbd4818eSakfaew 		err(1, NULL);
93dbd4818eSakfaew 	return p;
94df930be7Sderaadt }
95df930be7Sderaadt 
96df930be7Sderaadt /*
976fd5fbd6Sniklas  * Prepend the source path to a file name.
98df930be7Sderaadt  */
99df930be7Sderaadt char *
sourcepath(const char * file)100815b5809Sderaadt sourcepath(const char *file)
101df930be7Sderaadt {
1020ac0d02eSmpech 	char *cp;
103df930be7Sderaadt 
104ad0977caSakfaew 	if (asprintf(&cp, "%s/%s", srcdir, file) == -1)
105ad0977caSakfaew 		err(1, NULL);
106ad0977caSakfaew 
107dbd4818eSakfaew 	return cp;
108df930be7Sderaadt }
109df930be7Sderaadt 
110df930be7Sderaadt static struct nvlist *nvhead;
111df930be7Sderaadt 
112df930be7Sderaadt struct nvlist *
newnv(const char * name,const char * str,void * ptr,int i,struct nvlist * next)113815b5809Sderaadt newnv(const char *name, const char *str, void *ptr, int i, struct nvlist *next)
114df930be7Sderaadt {
1150ac0d02eSmpech 	struct nvlist *nv;
116df930be7Sderaadt 
117df930be7Sderaadt 	if ((nv = nvhead) == NULL)
118df930be7Sderaadt 		nv = emalloc(sizeof(*nv));
119df930be7Sderaadt 	else
120df930be7Sderaadt 		nvhead = nv->nv_next;
121f3bae140Sderaadt 	nv->nv_next = next;
122815b5809Sderaadt 	nv->nv_name = (char *)name;
123df930be7Sderaadt 	if (ptr == NULL)
124df930be7Sderaadt 		nv->nv_str = str;
125df930be7Sderaadt 	else {
126df930be7Sderaadt 		if (str != NULL)
127df930be7Sderaadt 			panic("newnv");
128df930be7Sderaadt 		nv->nv_ptr = ptr;
129df930be7Sderaadt 	}
130df930be7Sderaadt 	nv->nv_int = i;
131dbd4818eSakfaew 	return nv;
132df930be7Sderaadt }
133df930be7Sderaadt 
134df930be7Sderaadt /*
135df930be7Sderaadt  * Free an nvlist structure (just one).
136df930be7Sderaadt  */
137df930be7Sderaadt void
nvfree(struct nvlist * nv)138815b5809Sderaadt nvfree(struct nvlist *nv)
139df930be7Sderaadt {
140df930be7Sderaadt 
141df930be7Sderaadt 	nv->nv_next = nvhead;
142df930be7Sderaadt 	nvhead = nv;
143df930be7Sderaadt }
144df930be7Sderaadt 
145df930be7Sderaadt /*
146df930be7Sderaadt  * Free an nvlist (the whole list).
147df930be7Sderaadt  */
148df930be7Sderaadt void
nvfreel(struct nvlist * nv)149815b5809Sderaadt nvfreel(struct nvlist *nv)
150df930be7Sderaadt {
1510ac0d02eSmpech 	struct nvlist *next;
152df930be7Sderaadt 
153df930be7Sderaadt 	for (; nv != NULL; nv = next) {
154df930be7Sderaadt 		next = nv->nv_next;
155df930be7Sderaadt 		nv->nv_next = nvhead;
156df930be7Sderaadt 		nvhead = nv;
157df930be7Sderaadt 	}
158df930be7Sderaadt }
159df930be7Sderaadt 
160df930be7Sderaadt /*
161df930be7Sderaadt  * External (config file) error.  Complain, using current file
162df930be7Sderaadt  * and line number.
163df930be7Sderaadt  */
164df930be7Sderaadt void
error(const char * fmt,...)165df930be7Sderaadt error(const char *fmt, ...)
166df930be7Sderaadt {
167df930be7Sderaadt 	va_list ap;
168df930be7Sderaadt 	extern const char *yyfile;
169df930be7Sderaadt 
170df930be7Sderaadt 	va_start(ap, fmt);
171df930be7Sderaadt 	vxerror(yyfile, currentline(), fmt, ap);
172df930be7Sderaadt 	va_end(ap);
173df930be7Sderaadt }
174df930be7Sderaadt 
175df930be7Sderaadt /*
176df930be7Sderaadt  * Delayed config file error (i.e., something was wrong but we could not
177df930be7Sderaadt  * find out about it until later).
178df930be7Sderaadt  */
179df930be7Sderaadt void
xerror(const char * file,int line,const char * fmt,...)180df930be7Sderaadt xerror(const char *file, int line, const char *fmt, ...)
181df930be7Sderaadt {
182df930be7Sderaadt 	va_list ap;
183df930be7Sderaadt 
184df930be7Sderaadt 	va_start(ap, fmt);
185df930be7Sderaadt 	vxerror(file, line, fmt, ap);
186df930be7Sderaadt 	va_end(ap);
187df930be7Sderaadt }
188df930be7Sderaadt 
189df930be7Sderaadt /*
190df930be7Sderaadt  * Internal form of error() and xerror().
191df930be7Sderaadt  */
192df930be7Sderaadt static void
vxerror(const char * file,int line,const char * fmt,va_list ap)193815b5809Sderaadt vxerror(const char *file, int line, const char *fmt, va_list ap)
194df930be7Sderaadt {
195df930be7Sderaadt 
196df930be7Sderaadt 	(void)fprintf(stderr, "%s:%d: ", file, line);
197df930be7Sderaadt 	(void)vfprintf(stderr, fmt, ap);
198df930be7Sderaadt 	(void)putc('\n', stderr);
199df930be7Sderaadt 	errors++;
200df930be7Sderaadt }
201df930be7Sderaadt 
202df930be7Sderaadt /*
203df930be7Sderaadt  * Internal error, abort.
204df930be7Sderaadt  */
205df930be7Sderaadt __dead void
panic(const char * fmt,...)206df930be7Sderaadt panic(const char *fmt, ...)
207df930be7Sderaadt {
208df930be7Sderaadt 	va_list ap;
209df930be7Sderaadt 
210df930be7Sderaadt 	va_start(ap, fmt);
211df930be7Sderaadt 	(void)fprintf(stderr, "config: panic: ");
212df930be7Sderaadt 	(void)vfprintf(stderr, fmt, ap);
213df930be7Sderaadt 	(void)putc('\n', stderr);
214df930be7Sderaadt 	va_end(ap);
215df930be7Sderaadt 	exit(2);
216df930be7Sderaadt }
217