Import a new version of NetBSD's mtree.

This version of mtree implements a new flag (-O) that can be used to
restrict the tool to certain pathnames. Also, it fixes a compiler
warning generated by -Wmissing-variable-declarations.

Acked by:	brooks
This commit is contained in:
ed 2013-04-09 06:50:11 +00:00
commit 1184231943
8 changed files with 186 additions and 15 deletions

View File

@ -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 # from: @(#)Makefile 8.2 (Berkeley) 4/27/95
.include <bsd.own.mk> .include <bsd.own.mk>
@ -8,7 +8,7 @@ PROG= mtree
CPPFLAGS+= -DMTREE CPPFLAGS+= -DMTREE
MAN= mtree.8 MAN= mtree.8
SRCS= compare.c crc.c create.c excludes.c misc.c mtree.c spec.c specspec.c \ 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} == "") .if (${HOSTPROG:U} == "")
DPADD+= ${LIBUTIL} DPADD+= ${LIBUTIL}
LDADD+= -lutil LDADD+= -lutil

View File

@ -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 * Copyright (c) 1989, 1993
@ -38,7 +38,7 @@
#if 0 #if 0
static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93"; static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93";
#else #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
#endif /* not lint */ #endif /* not lint */
@ -134,6 +134,10 @@ cwalk(void)
fts_set(t, p, FTS_SKIP); fts_set(t, p, FTS_SKIP);
continue; continue;
} }
if (!find_only(p->fts_path)) {
fts_set(t, p, FTS_SKIP);
continue;
}
switch(p->fts_info) { switch(p->fts_info) {
case FTS_D: case FTS_D:
if (!bflag) if (!bflag)

View File

@ -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 * Copyright (c) 1991, 1993
@ -42,6 +42,7 @@
#include <err.h> #include <err.h>
#include <fts.h> #include <fts.h>
#include <util.h> #include <util.h>
#include <stdbool.h>
#if HAVE_NETDB_H #if HAVE_NETDB_H
/* For MAXHOSTNAMELEN on some platforms. */ /* For MAXHOSTNAMELEN on some platforms. */
@ -74,6 +75,8 @@ u_int parsetype(const char *);
void read_excludes_file(const char *); void read_excludes_file(const char *);
const char *rlink(const char *); const char *rlink(const char *);
int verify(FILE *); int verify(FILE *);
void load_only(const char *fname);
bool find_only(const char *path);
extern int bflag, dflag, eflag, iflag, jflag, lflag, mflag, extern int bflag, dflag, eflag, iflag, jflag, lflag, mflag,
nflag, qflag, rflag, sflag, tflag, uflag; nflag, qflag, rflag, sflag, tflag, uflag;

View File

@ -1,4 +1,4 @@
.\" $NetBSD: mtree.8,v 1.67 2012/12/20 20:31:01 wiz Exp $ .\" $NetBSD: mtree.8,v 1.69 2013/02/03 19:16:06 christos Exp $
.\" .\"
.\" Copyright (c) 1989, 1990, 1993 .\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved. .\" The Regents of the University of California. All rights reserved.
@ -56,7 +56,7 @@
.\" .\"
.\" @(#)mtree.8 8.2 (Berkeley) 12/11/93 .\" @(#)mtree.8 8.2 (Berkeley) 12/11/93
.\" .\"
.Dd December 20, 2012 .Dd February 3, 2013
.Dt MTREE 8 .Dt MTREE 8
.Os .Os
.Sh NAME .Sh NAME
@ -73,6 +73,7 @@
.Op Fl K Ar keywords .Op Fl K Ar keywords
.Op Fl k Ar keywords .Op Fl k Ar keywords
.Op Fl N Ar dbdir .Op Fl N Ar dbdir
.Op Fl O Ar onlyfile
.Op Fl p Ar path .Op Fl p Ar path
.Op Fl R Ar keywords .Op Fl R Ar keywords
.Op Fl s Ar seed .Op Fl s Ar seed
@ -273,6 +274,8 @@ rather than using the results from the system's
and and
.Xr getgrnam 3 .Xr getgrnam 3
(and related) library calls. (and related) library calls.
.It Fl O Ar onlypaths
Only include files included in this list of pathnames.
.It Fl P .It Fl P
Don't follow symbolic links in the file hierarchy, instead consider Don't follow symbolic links in the file hierarchy, instead consider
the symbolic link itself in any comparisons. the symbolic link itself in any comparisons.

View File

@ -1,4 +1,4 @@
/* $NetBSD: mtree.c,v 1.46 2012/12/20 19:09:25 christos Exp $ */ /* $NetBSD: mtree.c,v 1.48 2013/04/08 17:39:11 christos Exp $ */
/*- /*-
* Copyright (c) 1989, 1990, 1993 * Copyright (c) 1989, 1990, 1993
@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1990, 1993\
#if 0 #if 0
static char sccsid[] = "@(#)mtree.c 8.1 (Berkeley) 6/6/93"; static char sccsid[] = "@(#)mtree.c 8.1 (Berkeley) 6/6/93";
#else #else
__RCSID("$NetBSD: mtree.c,v 1.46 2012/12/20 19:09:25 christos Exp $"); __RCSID("$NetBSD: mtree.c,v 1.48 2013/04/08 17:39:11 christos Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
@ -59,8 +59,8 @@ __RCSID("$NetBSD: mtree.c,v 1.46 2012/12/20 19:09:25 christos Exp $");
#include "extern.h" #include "extern.h"
int ftsoptions = FTS_PHYSICAL; int ftsoptions = FTS_PHYSICAL;
int bflag, cflag, Cflag, dflag, Dflag, eflag, iflag, jflag, lflag, mflag, int bflag, dflag, eflag, iflag, jflag, lflag, mflag, nflag, qflag, rflag,
nflag, qflag, rflag, sflag, tflag, uflag, Uflag, wflag; sflag, tflag, uflag;
char fullpath[MAXPATHLEN]; char fullpath[MAXPATHLEN];
static struct { static struct {
@ -79,18 +79,20 @@ main(int argc, char **argv)
{ {
int ch, status; int ch, status;
unsigned int i; unsigned int i;
int cflag, Cflag, Dflag, Uflag, wflag;
char *dir, *p; char *dir, *p;
FILE *spec1, *spec2; FILE *spec1, *spec2;
setprogname(argv[0]); setprogname(argv[0]);
cflag = Cflag = Dflag = Uflag = wflag = 0;
dir = NULL; dir = NULL;
init_excludes(); init_excludes();
spec1 = stdin; spec1 = stdin;
spec2 = NULL; spec2 = NULL;
while ((ch = getopt(argc, argv, 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) { != -1) {
switch((char)ch) { switch((char)ch) {
case 'b': case 'b':
@ -179,6 +181,9 @@ main(int argc, char **argv)
"Unable to use user and group databases in `%s'", "Unable to use user and group databases in `%s'",
optarg); optarg);
break; break;
case 'O':
load_only(optarg);
break;
case 'p': case 'p':
dir = optarg; dir = optarg;
break; break;

152
contrib/mtree/only.c Normal file
View File

@ -0,0 +1,152 @@
/* $NetBSD: only.c,v 1.2 2013/02/05 00:59:03 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.2 2013/02/05 00:59:03 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 ((e = malloc(sizeof(*e))) == NULL)
mtree_err("memory allocation error");
e->str = str;
e->hash = h;
e->next = table[h];
table[h] = e;
}
static void
fill(char *str)
{
uint32_t h;
char *ptr = strrchr(str, '/');
if (ptr == NULL)
return;
*ptr = '\0';
if (!hash_find(str, &h)) {
char *x = strdup(str);
if (x == NULL)
mtree_err("memory allocation error");
hash_insert(x, h);
fill(str);
}
*ptr = '/';
}
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))) {
uint32_t h;
if (hash_find(line, &h))
err(1, "Duplicate entry %s", line);
hash_insert(line, h);
fill(line);
}
fclose(fp);
loaded = true;
}
bool
find_only(const char *path)
{
uint32_t h;
if (!loaded)
return true;
return hash_find(path, &h);
}

View File

@ -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 * Copyright (c) 1990, 1993
@ -38,7 +38,7 @@
#if 0 #if 0
static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93"; static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93";
#else #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
#endif /* not lint */ #endif /* not lint */
@ -95,6 +95,10 @@ vwalk(void)
fts_set(t, p, FTS_SKIP); fts_set(t, p, FTS_SKIP);
continue; continue;
} }
if (!find_only(p->fts_path)) {
fts_set(t, p, FTS_SKIP);
continue;
}
switch(p->fts_info) { switch(p->fts_info) {
case FTS_D: case FTS_D:
case FTS_SL: case FTS_SL:

View File

@ -7,7 +7,7 @@
PROG= nmtree PROG= nmtree
MAN= nmtree.8 MAN= nmtree.8
SRCS= compare.c crc.c create.c excludes.c getid.c misc.c mtree.c \ SRCS= compare.c crc.c create.c excludes.c getid.c misc.c mtree.c \
spec.c specspec.c verify.c only.c spec.c specspec.c verify.c
LDADD+= -lmd -lutil LDADD+= -lmd -lutil
CFLAGS+= -I${.CURDIR}/../../contrib/mknod CFLAGS+= -I${.CURDIR}/../../contrib/mknod