]>
git.saurik.com Git - apple/file_cmds.git/blob - mtree/verify.c
1 /* $NetBSD: verify.c,v 1.14 1998/08/27 18:03:45 ross Exp $ */
4 * Copyright (c) 1990, 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. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/cdefs.h>
39 static char sccsid
[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93";
41 __RCSID("$NetBSD: verify.c,v 1.14 1998/08/27 18:03:45 ross Exp $");
45 #include <sys/param.h>
56 extern int crc_total
, ftsoptions
;
57 extern int dflag
, eflag
, rflag
, sflag
, uflag
;
58 extern char fullpath
[MAXPATHLEN
];
61 static char path
[MAXPATHLEN
];
63 static void miss
__P((NODE
*, char *));
64 static int vwalk
__P((void));
83 int ftsdepth
, specdepth
, rval
;
88 if ((t
= fts_open(argv
, ftsoptions
, NULL
)) == NULL
)
89 mtree_err("fts_open: %s", strerror(errno
));
91 ftsdepth
= specdepth
= rval
= 0;
92 while ((p
= fts_read(t
)) != NULL
) {
99 if (specdepth
> ftsdepth
) {
100 for (level
= level
->parent
; level
->prev
;
101 level
= level
->prev
);
108 (void)fprintf(stderr
, "mtree: %s: %s\n",
109 RP(p
), strerror(errno
));
116 for (ep
= level
; ep
; ep
= ep
->next
)
117 if ((ep
->flags
& F_MAGIC
&&
118 !fnmatch(ep
->name
, p
->fts_name
, FNM_PATHNAME
)) ||
119 !strcmp(ep
->name
, p
->fts_name
)) {
120 ep
->flags
|= F_VISIT
;
121 if (compare(ep
->name
, ep
, p
))
123 if (!(ep
->flags
& F_IGN
) &&
124 ep
->child
&& ep
->type
== F_DIR
&&
125 p
->fts_info
== FTS_D
) {
129 (void)fts_set(t
, p
, FTS_SKIP
);
136 (void)printf("extra: %s", RP(p
));
138 if (unlink(p
->fts_accpath
)) {
139 (void)printf(", not removed: %s",
142 (void)printf(", removed");
146 (void)fts_set(t
, p
, FTS_SKIP
);
150 (void)fprintf(stderr
,
151 "mtree: %s checksum: %u\n", fullpath
, crc_total
);
163 for (; p
; p
= p
->next
) {
164 if (p
->flags
& F_OPT
&& !(p
->flags
& F_VISIT
))
166 if (p
->type
!= F_DIR
&& (dflag
|| p
->flags
& F_VISIT
))
168 (void)strcpy(tail
, p
->name
);
169 if (!(p
->flags
& F_VISIT
))
170 (void)printf("missing: %s", path
);
171 if (p
->type
!= F_DIR
) {
177 if (!(p
->flags
& F_VISIT
) && uflag
) {
178 if (!(p
->flags
& (F_UID
| F_UNAME
)))
179 (void)printf(" (not created: user not specified)");
180 else if (!(p
->flags
& (F_GID
| F_GNAME
)))
181 (void)printf(" (not created: group not specified)");
182 else if (!(p
->flags
& F_MODE
))
183 (void)printf(" (not created: mode not specified)");
184 else if (mkdir(path
, S_IRWXU
))
185 (void)printf(" (not created: %s)",
189 (void)printf(" (created)");
192 if (!(p
->flags
& F_VISIT
))
195 for (tp
= tail
; *tp
; ++tp
);
197 miss(p
->child
, tp
+ 1);
202 if (chown(path
, p
->st_uid
, p
->st_gid
)) {
203 (void)printf("%s: user/group/mode not modified: %s\n",
204 path
, strerror(errno
));
207 if (chmod(path
, p
->st_mode
))
208 (void)printf("%s: permissions not set: %s\n",
209 path
, strerror(errno
));