1 /* $NetBSD: misc.c,v 1.29 2006/10/16 00:11:57 christos Exp $ */
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * @(#)misc.c 8.1 (Berkeley) 6/6/93
34 #if HAVE_NBTOOL_CONFIG_H
35 #include "nbtool_config.h"
38 #include <sys/cdefs.h>
39 #if defined(__RCSID) && !defined(lint)
40 __RCSID("$NetBSD: misc.c,v 1.29 2006/10/16 00:11:57 christos Exp $");
43 #include <sys/types.h>
54 const char *name
; /* key name */
55 u_int val
; /* value */
57 #define NEEDVALUE 0x01
61 /* NB: the following tables must be sorted lexically. */
62 static KEY keylist
[] = {
63 {"cksum", F_CKSUM
, NEEDVALUE
},
64 {"device", F_DEV
, NEEDVALUE
},
65 {"flags", F_FLAGS
, NEEDVALUE
},
66 {"gid", F_GID
, NEEDVALUE
},
67 {"gname", F_GNAME
, NEEDVALUE
},
69 {"link", F_SLINK
, NEEDVALUE
},
70 {"md5", F_MD5
, NEEDVALUE
},
71 {"md5digest", F_MD5
, NEEDVALUE
},
72 {"mode", F_MODE
, NEEDVALUE
},
73 {"nlink", F_NLINK
, NEEDVALUE
},
74 {"optional", F_OPT
, 0},
75 {"rmd160", F_RMD160
, NEEDVALUE
},
76 {"rmd160digest",F_RMD160
, NEEDVALUE
},
77 {"sha1", F_SHA1
, NEEDVALUE
},
78 {"sha1digest", F_SHA1
, NEEDVALUE
},
79 {"sha256", F_SHA256
, NEEDVALUE
},
80 {"sha256digest",F_SHA256
, NEEDVALUE
},
81 {"sha384", F_SHA384
, NEEDVALUE
},
82 {"sha384digest",F_SHA384
, NEEDVALUE
},
83 {"sha512", F_SHA512
, NEEDVALUE
},
84 {"sha512digest",F_SHA512
, NEEDVALUE
},
85 {"size", F_SIZE
, NEEDVALUE
},
86 {"tags", F_TAGS
, NEEDVALUE
},
87 {"time", F_TIME
, NEEDVALUE
},
88 {"type", F_TYPE
, NEEDVALUE
},
89 {"uid", F_UID
, NEEDVALUE
},
90 {"uname", F_UNAME
, NEEDVALUE
}
93 static KEY typelist
[] = {
94 {"block", F_BLOCK
, 0},
103 {"socket", F_SOCK
, 0},
106 slist_t excludetags
, includetags
;
107 int keys
= KEYDEFAULT
;
110 int keycompare(const void *, const void *);
113 parsekey(const char *name
, int *needvaluep
)
121 for (i
= 0; i
< sizeof(keylist
) / sizeof(KEY
); i
++)
122 allbits
|= keylist
[i
].val
;
125 if (strcmp(name
, "all") == 0)
127 k
= (KEY
*)bsearch(&tmp
, keylist
, sizeof(keylist
) / sizeof(KEY
),
128 sizeof(KEY
), keycompare
);
130 mtree_err("unknown keyword `%s'", name
);
133 *needvaluep
= k
->flags
& NEEDVALUE
? 1 : 0;
139 parsetype(const char *name
)
144 k
= (KEY
*)bsearch(&tmp
, typelist
, sizeof(typelist
) / sizeof(KEY
),
145 sizeof(KEY
), keycompare
);
147 mtree_err("unknown file type `%s'", name
);
153 keycompare(const void *a
, const void *b
)
156 return (strcmp(((const KEY
*)a
)->name
, ((const KEY
*)b
)->name
));
160 mtree_err(const char *fmt
, ...)
168 warnx("failed at line %lu of the specification",
169 (u_long
) mtree_lineno
);
175 addtag(slist_t
*list
, char *elem
)
180 if ((list
->count
% TAG_CHUNK
) == 0) {
183 new = (char **)realloc(list
->list
, (list
->count
+ TAG_CHUNK
)
186 mtree_err("memory allocation error");
189 list
->list
[list
->count
] = elem
;
194 parsetags(slist_t
*list
, char *args
)
203 while ((p
= strsep(&args
, ",")) != NULL
) {
206 len
= strlen(p
) + 3; /* "," + p + ",\0" */
207 if ((e
= malloc(len
)) == NULL
)
208 mtree_err("memory allocation error");
209 snprintf(e
, len
, ",%s,", p
);
216 * returns 0 if there's a match from the exclude list in the node's tags,
217 * or there's an include list and no match.
218 * return 1 otherwise.
221 matchtags(NODE
*node
)
226 for (i
= 0; i
< excludetags
.count
; i
++)
227 if (strstr(node
->tags
, excludetags
.list
[i
]))
229 if (i
< excludetags
.count
)
232 for (i
= 0; i
< includetags
.count
; i
++)
233 if (strstr(node
->tags
, includetags
.list
[i
]))
235 if (i
> 0 && i
== includetags
.count
)
237 } else if (includetags
.count
> 0) {
244 nodetoino(u_int type
)
265 printf("unknown type %d", type
);
275 return (inotype(nodetoino(type
)));
283 switch (type
& S_IFMT
) {