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