diff options
| author | christos <christos@NetBSD.org> | 2013-02-03 19:15:16 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2013-02-03 19:15:16 +0000 |
| commit | 2e7d76fd2a7aeee58838df1eed629ff73b9e4b7e (patch) | |
| tree | 1bd88a024ea3be525e97b55267ef672c6f260aa9 /usr.sbin/mtree | |
| parent | 2e24e89ec308a35bf56f2e7f4632fa227d53ac4b (diff) | |
add the ability to only output paths included in a spec file when creating
from a directory (-c)
Diffstat (limited to 'usr.sbin/mtree')
| -rw-r--r-- | usr.sbin/mtree/Makefile | 4 | ||||
| -rw-r--r-- | usr.sbin/mtree/create.c | 8 | ||||
| -rw-r--r-- | usr.sbin/mtree/extern.h | 5 | ||||
| -rw-r--r-- | usr.sbin/mtree/mtree.8 | 4 | ||||
| -rw-r--r-- | usr.sbin/mtree/mtree.c | 9 | ||||
| -rw-r--r-- | usr.sbin/mtree/only.c | 131 | ||||
| -rw-r--r-- | usr.sbin/mtree/verify.c | 8 |
7 files changed, 158 insertions, 11 deletions
diff --git a/usr.sbin/mtree/Makefile b/usr.sbin/mtree/Makefile index b14a73fb6f1..3613e141a9a 100644 --- a/usr.sbin/mtree/Makefile +++ b/usr.sbin/mtree/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.33 2012/10/05 01:26:56 christos Exp $ +# $NetBSD: Makefile,v 1.34 2013/02/03 19:15:16 christos Exp $ # from: @(#)Makefile 8.2 (Berkeley) 4/27/95 .include <bsd.own.mk> @@ -8,7 +8,7 @@ PROG= mtree CPPFLAGS+= -DMTREE MAN= mtree.8 SRCS= compare.c crc.c create.c excludes.c misc.c mtree.c spec.c specspec.c \ - verify.c getid.c pack_dev.c + verify.c getid.c pack_dev.c only.c .if (${HOSTPROG:U} == "") DPADD+= ${LIBUTIL} LDADD+= -lutil diff --git a/usr.sbin/mtree/create.c b/usr.sbin/mtree/create.c index a08b6809e45..10306f993d2 100644 --- a/usr.sbin/mtree/create.c +++ b/usr.sbin/mtree/create.c @@ -1,4 +1,4 @@ -/* $NetBSD: create.c,v 1.68 2012/12/20 16:43:16 christos Exp $ */ +/* $NetBSD: create.c,v 1.69 2013/02/03 19:15:17 christos Exp $ */ /*- * Copyright (c) 1989, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: create.c,v 1.68 2012/12/20 16:43:16 christos Exp $"); +__RCSID("$NetBSD: create.c,v 1.69 2013/02/03 19:15:17 christos Exp $"); #endif #endif /* not lint */ @@ -134,6 +134,10 @@ cwalk(void) fts_set(t, p, FTS_SKIP); continue; } + if (!find_only(p->fts_path)) { + fts_set(t, p, FTS_SKIP); + continue; + } switch(p->fts_info) { case FTS_D: if (!bflag) diff --git a/usr.sbin/mtree/extern.h b/usr.sbin/mtree/extern.h index 0a12ad296b5..861df9daf25 100644 --- a/usr.sbin/mtree/extern.h +++ b/usr.sbin/mtree/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.37 2012/12/20 16:43:16 christos Exp $ */ +/* $NetBSD: extern.h,v 1.38 2013/02/03 19:15:17 christos Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -42,6 +42,7 @@ #include <err.h> #include <fts.h> #include <util.h> +#include <stdbool.h> #if HAVE_NETDB_H /* For MAXHOSTNAMELEN on some platforms. */ @@ -74,6 +75,8 @@ u_int parsetype(const char *); void read_excludes_file(const char *); const char *rlink(const char *); int verify(FILE *); +void load_only(const char *fname); +bool find_only(const char *path); extern int bflag, dflag, eflag, iflag, jflag, lflag, mflag, nflag, qflag, rflag, sflag, tflag, uflag; diff --git a/usr.sbin/mtree/mtree.8 b/usr.sbin/mtree/mtree.8 index 6df19c7bbc8..9971313912b 100644 --- a/usr.sbin/mtree/mtree.8 +++ b/usr.sbin/mtree/mtree.8 @@ -1,4 +1,4 @@ -.\" $NetBSD: mtree.8,v 1.67 2012/12/20 20:31:01 wiz Exp $ +.\" $NetBSD: mtree.8,v 1.68 2013/02/03 19:15:17 christos Exp $ .\" .\" Copyright (c) 1989, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -273,6 +273,8 @@ rather than using the results from the system's and .Xr getgrnam 3 (and related) library calls. +.It Fl O Ar onlypaths +Only include files included in this list of pathnames. .It Fl P Don't follow symbolic links in the file hierarchy, instead consider the symbolic link itself in any comparisons. diff --git a/usr.sbin/mtree/mtree.c b/usr.sbin/mtree/mtree.c index 78b50dc0847..fbf7cb62f40 100644 --- a/usr.sbin/mtree/mtree.c +++ b/usr.sbin/mtree/mtree.c @@ -1,4 +1,4 @@ -/* $NetBSD: mtree.c,v 1.46 2012/12/20 19:09:25 christos Exp $ */ +/* $NetBSD: mtree.c,v 1.47 2013/02/03 19:15:17 christos Exp $ */ /*- * Copyright (c) 1989, 1990, 1993 @@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1990, 1993\ #if 0 static char sccsid[] = "@(#)mtree.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: mtree.c,v 1.46 2012/12/20 19:09:25 christos Exp $"); +__RCSID("$NetBSD: mtree.c,v 1.47 2013/02/03 19:15:17 christos Exp $"); #endif #endif /* not lint */ @@ -90,7 +90,7 @@ main(int argc, char **argv) spec2 = NULL; while ((ch = getopt(argc, argv, - "bcCdDeE:f:F:I:ijk:K:lLmMnN:p:PqrR:s:StuUwWxX:")) + "bcCdDeE:f:F:I:ijk:K:lLmMnN:O:p:PqrR:s:StuUwWxX:")) != -1) { switch((char)ch) { case 'b': @@ -179,6 +179,9 @@ main(int argc, char **argv) "Unable to use user and group databases in `%s'", optarg); break; + case 'O': + load_only(optarg); + break; case 'p': dir = optarg; break; diff --git a/usr.sbin/mtree/only.c b/usr.sbin/mtree/only.c new file mode 100644 index 00000000000..5f94f957618 --- /dev/null +++ b/usr.sbin/mtree/only.c @@ -0,0 +1,131 @@ +/* $NetBSD: only.c,v 1.1 2013/02/03 19:15:17 christos Exp $ */ + +/*- + * Copyright (c) 2013 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * 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 NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 HAVE_NBTOOL_CONFIG_H +#include "nbtool_config.h" +#endif + +#include <sys/cdefs.h> + +#if defined(__RCSID) && !defined(lint) +__RCSID("$NetBSD: only.c,v 1.1 2013/02/03 19:15:17 christos Exp $"); +#endif + +#include <sys/param.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <time.h> +#include <err.h> +#include <util.h> + +#include "extern.h" + +struct hentry { + char *str; + uint32_t hash; + struct hentry *next; +}; + +static struct hentry *table[1024]; +static bool loaded; + +static uint32_t +hash_str(const char *str) +{ + const uint8_t *s = (const uint8_t *)str; + uint8_t c; + uint32_t hash = 0; + while ((c = *s++) != '\0') + hash = hash * 33 + c; /* "perl": k=33, r=r+r/32 */ + return hash + (hash >> 5); +} + +static bool +hash_find(const char *str, uint32_t *h) +{ + struct hentry *e; + *h = hash_str(str) % __arraycount(table); + + for (e = table[*h]; e; e = e->next) + if (e->hash == *h && strcmp(e->str, str) == 0) + return true; + return false; +} + +static void +hash_insert(char *str) +{ + uint32_t h; + struct hentry *e; + + if (hash_find(str, &h)) + err(1, "Duplicate entry %s", str); + + if ((e = malloc(sizeof(*e))) == NULL) + mtree_err("memory allocation error"); + + e->str = str; + e->hash = h; + e->next = table[h]; + table[h] = e; +} + +void +load_only(const char *fname) +{ + FILE *fp; + char *line; + size_t len, lineno; + + if ((fp = fopen(fname, "r")) == NULL) + err(1, "Cannot open `%s'", fname); + + while ((line = fparseln(fp, &len, &lineno, NULL, FPARSELN_UNESCALL))) + hash_insert(line); + + fclose(fp); + loaded = true; +} + +bool +find_only(const char *path) +{ + uint32_t h; + + if (!loaded) + return true; + return hash_find(path, &h); +} diff --git a/usr.sbin/mtree/verify.c b/usr.sbin/mtree/verify.c index 54b704cbf5b..66b020ac8b9 100644 --- a/usr.sbin/mtree/verify.c +++ b/usr.sbin/mtree/verify.c @@ -1,4 +1,4 @@ -/* $NetBSD: verify.c,v 1.43 2012/10/05 01:31:05 christos Exp $ */ +/* $NetBSD: verify.c,v 1.44 2013/02/03 19:15:17 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: verify.c,v 1.43 2012/10/05 01:31:05 christos Exp $"); +__RCSID("$NetBSD: verify.c,v 1.44 2013/02/03 19:15:17 christos Exp $"); #endif #endif /* not lint */ @@ -95,6 +95,10 @@ vwalk(void) fts_set(t, p, FTS_SKIP); continue; } + if (!find_only(p->fts_path)) { + fts_set(t, p, FTS_SKIP); + continue; + } switch(p->fts_info) { case FTS_D: case FTS_SL: |
