X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/1c15e88899094343f75aeba04122cd96a96b428e..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/usr.sbin/mtree/verify.c diff --git a/usr/src/usr.sbin/mtree/verify.c b/usr/src/usr.sbin/mtree/verify.c index 6c3ddafd8b..27d9b90b12 100644 --- a/usr/src/usr.sbin/mtree/verify.c +++ b/usr/src/usr.sbin/mtree/verify.c @@ -1,92 +1,105 @@ /*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 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 + * SUCH DAMAGE. */ #ifndef lint -static char sccsid[] = "@(#)verify.c 5.7 (Berkeley) 7/1/90"; +static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93"; #endif /* not lint */ #include #include #include #include +#include #include #include #include #include "mtree.h" +#include "extern.h" -extern NODE *root; +extern int crc_total, ftsoptions; +extern int dflag, eflag, rflag, sflag, uflag; +extern char fullpath[MAXPATHLEN]; +static NODE *root; static char path[MAXPATHLEN]; +static void miss __P((NODE *, char *)); +static int vwalk __P((void)); + +int verify() { - vwalk(); + int rval; + + root = spec(); + rval = vwalk(); miss(root, path); + return (rval); } +static int vwalk() { - extern int ftsoptions, dflag, eflag, rflag; register FTS *t; register FTSENT *p; register NODE *ep, *level; + int ftsdepth, specdepth, rval; char *argv[2]; - int ftsdepth = 0, specdepth = 0; argv[0] = "."; - argv[1] = (char *)NULL; - if (!(t = ftsopen(argv, ftsoptions, (int (*)())NULL))) { - (void)fprintf(stderr, - "mtree: ftsopen: %s.\n", strerror(errno)); - exit(1); - } + argv[1] = NULL; + if ((t = fts_open(argv, ftsoptions, NULL)) == NULL) + err("fts_open: %s", strerror(errno)); level = root; - while (p = ftsread(t)) { + ftsdepth = specdepth = rval = 0; + while (p = fts_read(t)) { switch(p->fts_info) { case FTS_D: - if (!strcmp(p->fts_name, ".")) - continue; - ftsdepth++; + ++ftsdepth; break; - case FTS_DC: - (void)fprintf(stderr, - "mtree: directory cycle: %s.\n", RP(p)); - continue; - case FTS_DNR: - case FTS_DNX: - (void)fprintf(stderr, - "mtree: %s: unable to read or search.\n", RP(p)); case FTS_DP: - ftsdepth--; + --ftsdepth; if (specdepth > ftsdepth) { for (level = level->parent; level->prev; level = level->prev); - specdepth--; + --specdepth; } continue; + case FTS_DNR: case FTS_ERR: - (void)fprintf(stderr, "mtree: %s: %s.\n", - RP(p), strerror(errno)); - continue; case FTS_NS: - (void)fprintf(stderr, - "mtree: can't stat: %s.\n", RP(p)); + (void)fprintf(stderr, "mtree: %s: %s\n", + RP(p), strerror(errno)); continue; default: if (dflag) @@ -94,19 +107,18 @@ vwalk() } for (ep = level; ep; ep = ep->next) - if (ep->flags & F_MAGIC && fnmatch(ep->name, - p->fts_name, FNM_PATHNAME|FNM_QUOTE) || + if (ep->flags & F_MAGIC && + !fnmatch(ep->name, p->fts_name, FNM_PATHNAME) || !strcmp(ep->name, p->fts_name)) { ep->flags |= F_VISIT; - if (ep->flags & F_IGN) { - (void)ftsset(t, p, FTS_SKIP); - continue; - } - compare(ep->name, ep, p); - if (ep->child && ep->type == F_DIR && + if (compare(ep->name, ep, p)) + rval = MISMATCHEXIT; + if (ep->flags & F_IGN) + (void)fts_set(t, p, FTS_SKIP); + else if (ep->child && ep->type == F_DIR && p->fts_info == FTS_D) { level = ep->child; - specdepth++; + ++specdepth; } break; } @@ -124,16 +136,20 @@ vwalk() } (void)putchar('\n'); } - (void)ftsset(t, p, FTS_SKIP); + (void)fts_set(t, p, FTS_SKIP); } - (void)ftsclose(t); + (void)fts_close(t); + if (sflag) + (void)fprintf(stderr, + "mtree: %s checksum: %lu\n", fullpath, crc_total); + return (rval); } +static void miss(p, tail) register NODE *p; register char *tail; { - extern int dflag, uflag; register int create; register char *tp; @@ -150,9 +166,12 @@ miss(p, tail) create = 0; 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)"); + 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)", strerror(errno)); @@ -172,7 +191,7 @@ miss(p, tail) if (!create) continue; if (chown(path, p->st_uid, p->st_gid)) { - (void)printf("%s: owner/group/mode not modified: %s\n", + (void)printf("%s: user/group/mode not modified: %s\n", path, strerror(errno)); continue; }