xref: /openbsd/usr.sbin/mtree/misc.c (revision f251446c)
1*f251446cSkrw /*	$OpenBSD: misc.c,v 1.20 2017/09/25 17:10:55 krw Exp $	*/
2df930be7Sderaadt /*	$NetBSD: misc.c,v 1.4 1995/03/07 21:26:23 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*-
5df930be7Sderaadt  * Copyright (c) 1991, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
1629295d1cSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  *
32df930be7Sderaadt  *	@(#)misc.c	8.1 (Berkeley) 6/6/93
33df930be7Sderaadt  */
34df930be7Sderaadt 
35df930be7Sderaadt #include <sys/types.h>
36df930be7Sderaadt #include <sys/stat.h>
37df930be7Sderaadt #include <stdio.h>
38e7beb4a7Smillert #include <stdarg.h>
39df930be7Sderaadt #include "mtree.h"
40df930be7Sderaadt #include "extern.h"
41df930be7Sderaadt 
42df930be7Sderaadt extern int lineno;
43df930be7Sderaadt 
44df930be7Sderaadt typedef struct _key {
45df930be7Sderaadt 	char *name;			/* key name */
46df930be7Sderaadt 	u_int val;			/* value */
47df930be7Sderaadt 
48df930be7Sderaadt #define	NEEDVALUE	0x01
49df930be7Sderaadt 	u_int flags;
50df930be7Sderaadt } KEY;
51df930be7Sderaadt 
52df930be7Sderaadt /* NB: the following table must be sorted lexically. */
53df930be7Sderaadt static KEY keylist[] = {
5446360e3cSderaadt 	{"cksum",	F_CKSUM,	NEEDVALUE},
5531636a68Smillert 	{"flags",	F_FLAGS,	NEEDVALUE},
5646360e3cSderaadt 	{"gid",		F_GID,		NEEDVALUE},
5746360e3cSderaadt 	{"gname",	F_GNAME,	NEEDVALUE},
5846360e3cSderaadt 	{"ignore",	F_IGN,		0},
5946360e3cSderaadt 	{"link",	F_SLINK,	NEEDVALUE},
6046360e3cSderaadt 	{"md5digest",	F_MD5,		NEEDVALUE},
6146360e3cSderaadt 	{"mode",	F_MODE,		NEEDVALUE},
6246360e3cSderaadt 	{"nlink",	F_NLINK,	NEEDVALUE},
635372c5f0Smillert 	{"nochange",	F_NOCHANGE,	0},
6494bb8e67Smillert 	{"optional",	F_OPT,		0},
6537841f9cSmillert 	{"rmd160digest",F_RMD160,	NEEDVALUE},
661a0a9baeSmillert 	{"sha1digest",	F_SHA1,		NEEDVALUE},
6775049d8dSnaddy 	{"sha256digest",F_SHA256,	NEEDVALUE},
6846360e3cSderaadt 	{"size",	F_SIZE,		NEEDVALUE},
6946360e3cSderaadt 	{"time",	F_TIME,		NEEDVALUE},
7046360e3cSderaadt 	{"type",	F_TYPE,		NEEDVALUE},
7146360e3cSderaadt 	{"uid",		F_UID,		NEEDVALUE},
7246360e3cSderaadt 	{"uname",	F_UNAME,	NEEDVALUE},
73df930be7Sderaadt };
74df930be7Sderaadt 
75df930be7Sderaadt u_int
parsekey(char * name,int * needvaluep)76f56bb1bdSderaadt parsekey(char *name, int *needvaluep)
77df930be7Sderaadt {
78df930be7Sderaadt 	KEY *k, tmp;
79c72b5b24Smillert 	int keycompare(const void *, const void *);
80df930be7Sderaadt 
81df930be7Sderaadt 	tmp.name = name;
82df930be7Sderaadt 	k = (KEY *)bsearch(&tmp, keylist, sizeof(keylist) / sizeof(KEY),
83df930be7Sderaadt 	    sizeof(KEY), keycompare);
84df930be7Sderaadt 	if (k == NULL)
85642654b6Smillert 		error("unknown keyword %s", name);
86df930be7Sderaadt 
87df930be7Sderaadt 	if (needvaluep)
88df930be7Sderaadt 		*needvaluep = k->flags & NEEDVALUE ? 1 : 0;
89df930be7Sderaadt 	return (k->val);
90df930be7Sderaadt }
91df930be7Sderaadt 
92df930be7Sderaadt int
keycompare(const void * a,const void * b)93f303ad03Sderaadt keycompare(const void *a, const void *b)
94df930be7Sderaadt {
95df930be7Sderaadt 	return (strcmp(((KEY *)a)->name, ((KEY *)b)->name));
96df930be7Sderaadt }
97df930be7Sderaadt 
98*f251446cSkrw __dead void
error(const char * fmt,...)99642654b6Smillert error(const char *fmt, ...)
100df930be7Sderaadt {
101df930be7Sderaadt 	va_list ap;
102e7beb4a7Smillert 
103df930be7Sderaadt 	va_start(ap, fmt);
10446360e3cSderaadt 	(void)fflush(NULL);
10546360e3cSderaadt 	(void)fprintf(stderr, "\nmtree: ");
106df930be7Sderaadt 	(void)vfprintf(stderr, fmt, ap);
107df930be7Sderaadt 	va_end(ap);
108df930be7Sderaadt 	(void)fprintf(stderr, "\n");
109df930be7Sderaadt 	if (lineno)
110df930be7Sderaadt 		(void)fprintf(stderr,
111df930be7Sderaadt 		    "mtree: failed at line %d of the specification\n", lineno);
112df930be7Sderaadt 	exit(1);
113df930be7Sderaadt 	/* NOTREACHED */
114df930be7Sderaadt }
115