1 /* $NetBSD: misc.c,v 1.34 2012/12/20 19:09:25 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.34 2012/12/20 19:09:25 christos Exp $");
43 #include <sys/types.h>
53 #if 1 /* defined(__minix): LSC: our mkfs doesn't understand escaped names,
54 so always default to netbsd6 escaping mode. */
55 enum flavor flavor
= F_NETBSD6
;
57 enum flavor flavor
= F_MTREE
;
58 #endif /* defined(__minix) */
60 const char *name
; /* key name */
61 u_int val
; /* value */
63 #define NEEDVALUE 0x01
67 /* NB: the following tables must be sorted lexically. */
68 static KEY keylist
[] = {
69 {"cksum", F_CKSUM
, NEEDVALUE
},
70 {"device", F_DEV
, NEEDVALUE
},
71 {"flags", F_FLAGS
, NEEDVALUE
},
72 {"gid", F_GID
, NEEDVALUE
},
73 {"gname", F_GNAME
, NEEDVALUE
},
75 {"link", F_SLINK
, NEEDVALUE
},
76 {"md5", F_MD5
, NEEDVALUE
},
77 {"md5digest", F_MD5
, NEEDVALUE
},
78 {"mode", F_MODE
, NEEDVALUE
},
79 {"nlink", F_NLINK
, NEEDVALUE
},
80 {"nochange", F_NOCHANGE
, 0},
81 {"optional", F_OPT
, 0},
82 {"ripemd160digest", F_RMD160
, NEEDVALUE
},
83 {"rmd160", F_RMD160
, NEEDVALUE
},
84 {"rmd160digest",F_RMD160
, NEEDVALUE
},
85 {"sha1", F_SHA1
, NEEDVALUE
},
86 {"sha1digest", F_SHA1
, NEEDVALUE
},
87 {"sha256", F_SHA256
, NEEDVALUE
},
88 {"sha256digest",F_SHA256
, NEEDVALUE
},
89 {"sha384", F_SHA384
, NEEDVALUE
},
90 {"sha384digest",F_SHA384
, NEEDVALUE
},
91 {"sha512", F_SHA512
, NEEDVALUE
},
92 {"sha512digest",F_SHA512
, NEEDVALUE
},
93 {"size", F_SIZE
, NEEDVALUE
},
94 {"tags", F_TAGS
, NEEDVALUE
},
95 {"time", F_TIME
, NEEDVALUE
},
96 {"type", F_TYPE
, NEEDVALUE
},
97 {"uid", F_UID
, NEEDVALUE
},
98 {"uname", F_UNAME
, NEEDVALUE
}
101 static KEY typelist
[] = {
102 {"block", F_BLOCK
, 0},
111 {"socket", F_SOCK
, 0},
114 slist_t excludetags
, includetags
;
115 int keys
= KEYDEFAULT
;
118 int keycompare(const void *, const void *);
121 parsekey(const char *name
, int *needvaluep
)
129 for (i
= 0; i
< sizeof(keylist
) / sizeof(KEY
); i
++)
130 allbits
|= keylist
[i
].val
;
133 if (strcmp(name
, "all") == 0)
135 k
= (KEY
*)bsearch(&tmp
, keylist
, sizeof(keylist
) / sizeof(KEY
),
136 sizeof(KEY
), keycompare
);
138 mtree_err("unknown keyword `%s'", name
);
141 *needvaluep
= k
->flags
& NEEDVALUE
? 1 : 0;
147 parsetype(const char *name
)
152 k
= (KEY
*)bsearch(&tmp
, typelist
, sizeof(typelist
) / sizeof(KEY
),
153 sizeof(KEY
), keycompare
);
155 mtree_err("unknown file type `%s'", name
);
161 keycompare(const void *a
, const void *b
)
164 return (strcmp(((const KEY
*)a
)->name
, ((const KEY
*)b
)->name
));
168 mtree_err(const char *fmt
, ...)
176 warnx("failed at line %lu of the specification",
177 (u_long
) mtree_lineno
);
183 addtag(slist_t
*list
, char *elem
)
188 if ((list
->count
% TAG_CHUNK
) == 0) {
191 new = (char **)realloc(list
->list
, (list
->count
+ TAG_CHUNK
)
194 mtree_err("memory allocation error");
197 list
->list
[list
->count
] = elem
;
202 parsetags(slist_t
*list
, char *args
)
211 while ((p
= strsep(&args
, ",")) != NULL
) {
214 len
= strlen(p
) + 3; /* "," + p + ",\0" */
215 if ((e
= malloc(len
)) == NULL
)
216 mtree_err("memory allocation error");
217 snprintf(e
, len
, ",%s,", p
);
224 * returns 0 if there's a match from the exclude list in the node's tags,
225 * or there's an include list and no match.
226 * return 1 otherwise.
229 matchtags(NODE
*node
)
234 for (i
= 0; i
< excludetags
.count
; i
++)
235 if (strstr(node
->tags
, excludetags
.list
[i
]))
237 if (i
< excludetags
.count
)
240 for (i
= 0; i
< includetags
.count
; i
++)
241 if (strstr(node
->tags
, includetags
.list
[i
]))
243 if (i
> 0 && i
== includetags
.count
)
245 } else if (includetags
.count
> 0) {
252 nodetoino(u_int type
)
273 printf("unknown type %d", type
);
283 return (inotype(nodetoino(type
)));
291 switch (type
& S_IFMT
) {