1 /*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 *
7 * @(#)misc.c 8.1 (Berkeley) 06/06/93
8 */
9
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <fts.h>
13 #include <stdio.h>
14 #include "mtree.h"
15 #include "extern.h"
16
17 extern int lineno;
18
19 typedef struct _key {
20 char *name; /* key name */
21 u_int val; /* value */
22
23 #define NEEDVALUE 0x01
24 u_int flags;
25 } KEY;
26
27 /* NB: the following table must be sorted lexically. */
28 static KEY keylist[] = {
29 "cksum", F_CKSUM, NEEDVALUE,
30 "gid", F_GID, NEEDVALUE,
31 "gname", F_GNAME, NEEDVALUE,
32 "ignore", F_IGN, 0,
33 "link", F_SLINK, NEEDVALUE,
34 "mode", F_MODE, NEEDVALUE,
35 "nlink", F_NLINK, NEEDVALUE,
36 "size", F_SIZE, NEEDVALUE,
37 "time", F_TIME, NEEDVALUE,
38 "type", F_TYPE, NEEDVALUE,
39 "uid", F_UID, NEEDVALUE,
40 "uname", F_UNAME, NEEDVALUE,
41 };
42
43 u_int
parsekey(name,needvaluep)44 parsekey(name, needvaluep)
45 char *name;
46 int *needvaluep;
47 {
48 KEY *k, tmp;
49 int keycompare __P((const void *, const void *));
50
51 tmp.name = name;
52 k = (KEY *)bsearch(&tmp, keylist, sizeof(keylist) / sizeof(KEY),
53 sizeof(KEY), keycompare);
54 if (k == NULL)
55 err("unknown keyword %s", name);
56
57 if (needvaluep)
58 *needvaluep = k->flags & NEEDVALUE ? 1 : 0;
59 return (k->val);
60 }
61
62 int
keycompare(a,b)63 keycompare(a, b)
64 const void *a, *b;
65 {
66 return (strcmp(((KEY *)a)->name, ((KEY *)b)->name));
67 }
68
69 #if __STDC__
70 #include <stdarg.h>
71 #else
72 #include <varargs.h>
73 #endif
74
75 void
76 #if __STDC__
err(const char * fmt,...)77 err(const char *fmt, ...)
78 #else
79 err(fmt, va_alist)
80 char *fmt;
81 va_dcl
82 #endif
83 {
84 va_list ap;
85 #if __STDC__
86 va_start(ap, fmt);
87 #else
88 va_start(ap);
89 #endif
90 (void)fprintf(stderr, "mtree: ");
91 (void)vfprintf(stderr, fmt, ap);
92 va_end(ap);
93 (void)fprintf(stderr, "\n");
94 if (lineno)
95 (void)fprintf(stderr,
96 "mtree: failed at line %d of the specification\n", lineno);
97 exit(1);
98 /* NOTREACHED */
99 }
100