* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93";
extern int crc_total
, ftsoptions
;
extern int dflag
, eflag
, rflag
, sflag
, uflag
;
extern char fullpath
[MAXPATHLEN
];
static char path
[MAXPATHLEN
];
static void miss
__P((NODE
*, char *));
static int vwalk
__P((void));
register NODE
*ep
, *level
;
int ftsdepth
, specdepth
, rval
;
if ((t
= fts_open(argv
, ftsoptions
, NULL
)) == NULL
)
err("fts_open: %s", strerror(errno
));
ftsdepth
= specdepth
= rval
= 0;
while (p
= fts_read(t
)) {
if (specdepth
> ftsdepth
) {
for (level
= level
->parent
; level
->prev
;
(void)fprintf(stderr
, "mtree: %s: %s\n",
for (ep
= level
; ep
; ep
= ep
->next
)
if (ep
->flags
& F_MAGIC
&&
!fnmatch(ep
->name
, p
->fts_name
, FNM_PATHNAME
) ||
!strcmp(ep
->name
, p
->fts_name
)) {
if (compare(ep
->name
, ep
, p
))
(void)fts_set(t
, p
, FTS_SKIP
);
else if (ep
->child
&& ep
->type
== F_DIR
&&
(void)printf("extra: %s", RP(p
));
if (unlink(p
->fts_accpath
)) {
(void)printf(", not removed: %s",
(void)printf(", removed");
(void)fts_set(t
, p
, FTS_SKIP
);
"mtree: %s checksum: %lu\n", fullpath
, crc_total
);
if (p
->type
!= F_DIR
&& (dflag
|| p
->flags
& F_VISIT
))
(void)strcpy(tail
, p
->name
);
if (!(p
->flags
& F_VISIT
))
(void)printf("missing: %s", path
);
if (!(p
->flags
& F_VISIT
) && uflag
)
if (!(p
->flags
& (F_UID
| F_UNAME
)))
(void)printf(" (not created: user not specified)");
else if (!(p
->flags
& (F_GID
| F_GNAME
)))
(void)printf(" (not created: group not specified)");
else if (!(p
->flags
& F_MODE
))
(void)printf(" (not created: mode not specified)");
else if (mkdir(path
, S_IRWXU
))
(void)printf(" (not created: %s)",
(void)printf(" (created)");
if (!(p
->flags
& F_VISIT
))
for (tp
= tail
; *tp
; ++tp
);
if (chown(path
, p
->st_uid
, p
->st_gid
)) {
(void)printf("%s: user/group/mode not modified: %s\n",
if (chmod(path
, p
->st_mode
))
(void)printf("%s: permissions not set: %s\n",