diff options
Diffstat (limited to 'usr.sbin/fmtree/verify.c')
-rw-r--r-- | usr.sbin/fmtree/verify.c | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/usr.sbin/fmtree/verify.c b/usr.sbin/fmtree/verify.c deleted file mode 100644 index 2f9ca3dae927..000000000000 --- a/usr.sbin/fmtree/verify.c +++ /dev/null @@ -1,261 +0,0 @@ -/*- - * 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 - * 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. 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. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93"; -#endif /* not lint */ -#endif -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/stat.h> -#include <dirent.h> -#include <err.h> -#include <errno.h> -#include <fts.h> -#include <fnmatch.h> -#include <stdio.h> -#include <unistd.h> -#include "mtree.h" -#include "extern.h" - -static NODE *root; -static char path[MAXPATHLEN]; - -static void miss(NODE *, char *); -static int vwalk(void); - -int -mtree_verifyspec(FILE *fi) -{ - int rval; - - root = mtree_readspec(fi); - rval = vwalk(); - miss(root, path); - return (rval); -} - -static int -nsort(const FTSENT * const *a, const FTSENT * const *b) -{ - return (strcmp((*a)->fts_name, (*b)->fts_name)); -} - -static int -vwalk(void) -{ - FTS *t; - FTSENT *p; - NODE *ep, *level; - int specdepth, rval; - char *argv[2]; - char dot[] = "."; - - argv[0] = dot; - argv[1] = NULL; - if ((t = fts_open(argv, ftsoptions, nsort)) == NULL) - err(1, "line %d: fts_open", lineno); - level = root; - specdepth = rval = 0; - while (errno = 0, (p = fts_read(t))) { - if (check_excludes(p->fts_name, p->fts_path)) { - fts_set(t, p, FTS_SKIP); - continue; - } - switch(p->fts_info) { - case FTS_D: - case FTS_SL: - break; - case FTS_DP: - if (specdepth > p->fts_level) { - for (level = level->parent; level->prev; - level = level->prev); - --specdepth; - } - continue; - case FTS_DNR: - case FTS_ERR: - case FTS_NS: - warnx("%s: %s", RP(p), strerror(p->fts_errno)); - continue; - default: - if (dflag) - continue; - } - - if (specdepth != p->fts_level) - goto extra; - 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)) { - ep->flags |= F_VISIT; - if ((ep->flags & F_NOCHANGE) == 0 && - 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; - } - break; - } - - if (ep) - continue; -extra: - if (!eflag) { - (void)printf("%s extra", RP(p)); - if (rflag) { - if ((S_ISDIR(p->fts_statp->st_mode) - ? rmdir : unlink)(p->fts_accpath)) { - (void)printf(", not removed: %s", - strerror(errno)); - } else - (void)printf(", removed"); - } - (void)putchar('\n'); - } - (void)fts_set(t, p, FTS_SKIP); - } - if (errno != 0) - err(1, "fts_read()"); - (void)fts_close(t); - if (sflag) - warnx("%s checksum: %lu", fullpath, (unsigned long)crc_total); - return (rval); -} - -static void -miss(NODE *p, char *tail) -{ - int create; - char *tp; - const char *type, *what; - int serr; - - for (; p; p = p->next) { - if (p->flags & F_OPT && !(p->flags & F_VISIT)) - continue; - if (p->type != F_DIR && (dflag || p->flags & F_VISIT)) - continue; - (void)strcpy(tail, p->name); - if (!(p->flags & F_VISIT)) { - /* Don't print missing message if file exists as a - symbolic link and the -q flag is set. */ - struct stat statbuf; - - if (qflag && stat(path, &statbuf) == 0) - p->flags |= F_VISIT; - else - (void)printf("%s missing", path); - } - if (p->type != F_DIR && p->type != F_LINK) { - putchar('\n'); - continue; - } - - create = 0; - if (p->type == F_LINK) - type = "symlink"; - else - type = "directory"; - if (!(p->flags & F_VISIT) && uflag) { - if (!(p->flags & (F_UID | F_UNAME))) - (void)printf(" (%s not created: user not specified)", type); - else if (!(p->flags & (F_GID | F_GNAME))) - (void)printf(" (%s not created: group not specified)", type); - else if (p->type == F_LINK) { - if (symlink(p->slink, path)) - (void)printf(" (symlink not created: %s)\n", - strerror(errno)); - else - (void)printf(" (created)\n"); - if (lchown(path, p->st_uid, p->st_gid) == -1) { - serr = errno; - if (p->st_uid == (uid_t)-1) - what = "group"; - else if (lchown(path, (uid_t)-1, - p->st_gid) == -1) - what = "user & group"; - else { - what = "user"; - errno = serr; - } - (void)printf("%s: %s not modified: %s" - "\n", path, what, strerror(errno)); - } - continue; - } else if (!(p->flags & F_MODE)) - (void)printf(" (directory not created: mode not specified)"); - else if (mkdir(path, S_IRWXU)) - (void)printf(" (directory not created: %s)", - strerror(errno)); - else { - create = 1; - (void)printf(" (created)"); - } - } - if (!(p->flags & F_VISIT)) - (void)putchar('\n'); - - for (tp = tail; *tp; ++tp); - *tp = '/'; - miss(p->child, tp + 1); - *tp = '\0'; - - if (!create && !uflag) - continue; - if (chown(path, p->st_uid, p->st_gid) == -1) { - serr = errno; - if (p->st_uid == (uid_t)-1) - what = "group"; - else if (chown(path, (uid_t)-1, p->st_gid) == -1) - what = "user & group"; - else { - what = "user"; - errno = serr; - } - (void)printf("%s: %s not modified: %s\n", - path, what, strerror(errno)); - } - if (chmod(path, p->st_mode)) - (void)printf("%s: permissions not set: %s\n", - path, strerror(errno)); - if ((p->flags & F_FLAGS) && p->st_flags && - chflags(path, p->st_flags)) - (void)printf("%s: file flags not set: %s\n", - path, strerror(errno)); - } -} |