* Copyright (c) 1990 The Regents of the University of California.
* 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 5.9 (Berkeley) 3/12/91";
static char path
[MAXPATHLEN
];
extern int ftsoptions
, dflag
, eflag
, rflag
;
register NODE
*ep
, *level
;
int ftsdepth
= 0, specdepth
= 0;
if (!(t
= fts_open(argv
, ftsoptions
, (int (*)())NULL
))) {
"mtree: fts_open: %s.\n", strerror(errno
));
while (p
= fts_read(t
)) {
if (!strcmp(p
->fts_name
, "."))
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
)) {
(void)fts_set(t
, p
, FTS_SKIP
);
compare(ep
->name
, ep
, p
);
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
);
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
)
#define MINBITS (F_GROUP|F_MODE|F_OWNER)
if ((p
->flags
& MINBITS
) != MINBITS
)
(void)printf(" (not created -- group, mode or owner 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: owner/group/mode not modified: %s\n",
if (chmod(path
, p
->st_mode
))
(void)printf("%s: permissions not set: %s\n",