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