-/* $NetBSD: mtree.c,v 1.9 1997/10/17 11:46:51 lukem Exp $ */
-
/*-
* Copyright (c) 1989, 1990, 1993
* The Regents of the University of California. All rights reserved.
* 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
+ * 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.
*
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
+#if 0
#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1989, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n");
+static const char copyright[] =
+"@(#) Copyright (c) 1989, 1990, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
-#if 0
static char sccsid[] = "@(#)mtree.c 8.1 (Berkeley) 6/6/93";
-#else
-__RCSID("$NetBSD: mtree.c,v 1.9 1997/10/17 11:46:51 lukem Exp $");
-#endif
#endif /* not lint */
+#endif
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/usr.sbin/mtree/mtree.c,v 1.29 2004/06/04 19:29:28 ru Exp $");
#include <sys/param.h>
#include <sys/stat.h>
+#include <err.h>
#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
#include <fts.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
#include "mtree.h"
#include "extern.h"
-extern int crc_total;
-
int ftsoptions = FTS_PHYSICAL;
-int cflag, dflag, eflag, rflag, sflag, tflag, uflag, Uflag;
-u_short keys;
+int cflag, dflag, eflag, iflag, nflag, qflag, rflag, sflag, uflag, Uflag, wflag;
+u_int keys;
char fullpath[MAXPATHLEN];
- int main __P((int, char **));
-static void usage __P((void));
+static void usage(void);
int
-main(argc, argv)
- int argc;
- char *argv[];
+main(int argc, char *argv[])
{
int ch;
char *dir, *p;
int status;
+ FILE *spec1, *spec2;
dir = NULL;
keys = KEYDEFAULT;
- while ((ch = getopt(argc, argv, "cdef:K:k:p:rs:tUux")) != -1)
+ init_excludes();
+ spec1 = stdin;
+ spec2 = NULL;
+
+ while ((ch = getopt(argc, argv, "cdef:iK:k:LnPp:qrs:UuwxX:")) != -1)
switch((char)ch) {
case 'c':
cflag = 1;
eflag = 1;
break;
case 'f':
- if (!(freopen(optarg, "r", stdin)))
- mtree_err("%s: %s", optarg, strerror(errno));
+ if (spec1 == stdin) {
+ spec1 = fopen(optarg, "r");
+ if (spec1 == NULL)
+ err(1, "%s", optarg);
+ } else if (spec2 == NULL) {
+ spec2 = fopen(optarg, "r");
+ if (spec2 == NULL)
+ err(1, "%s", optarg);
+ } else
+ usage();
+ break;
+ case 'i':
+ iflag = 1;
break;
case 'K':
while ((p = strsep(&optarg, " \t,")) != NULL)
if (*p != '\0')
keys |= parsekey(p, NULL);
break;
+ case 'L':
+ ftsoptions &= ~FTS_PHYSICAL;
+ ftsoptions |= FTS_LOGICAL;
+ break;
+ case 'n':
+ nflag = 1;
+ break;
+ case 'P':
+ ftsoptions &= ~FTS_LOGICAL;
+ ftsoptions |= FTS_PHYSICAL;
+ break;
case 'p':
dir = optarg;
break;
+ case 'q':
+ qflag = 1;
+ break;
case 'r':
rflag = 1;
break;
case 's':
sflag = 1;
- crc_total = ~strtol(optarg, &p, 0);
+ crc_total = (uint32_t)~strtoul(optarg, &p, 0);
if (*p)
- mtree_err("illegal seed value -- %s", optarg);
- break;
- case 't':
- tflag = 1;
+ errx(1, "illegal seed value -- %s", optarg);
break;
case 'U':
- Uflag = uflag = 1;
+ Uflag = 1;
+ uflag = 1;
break;
case 'u':
uflag = 1;
break;
+ case 'w':
+ wflag = 1;
+ break;
case 'x':
ftsoptions |= FTS_XDEV;
break;
+ case 'X':
+ read_excludes_file(optarg);
+ break;
case '?':
default:
usage();
}
argc -= optind;
- argv += optind;
+// argv += optind;
if (argc)
usage();
if (dir && chdir(dir))
- mtree_err("%s: %s", dir, strerror(errno));
+ err(1, "%s", dir);
if ((cflag || sflag) && !getwd(fullpath))
- mtree_err("%s", fullpath);
+ errx(1, "%s", fullpath);
if (cflag) {
cwalk();
exit(0);
}
- status = verify();
+ if (spec2 != NULL)
+ status = mtree_specspec(spec1, spec2);
+ else
+ status = mtree_verifyspec(spec1);
if (Uflag & (status == MISMATCHEXIT))
status = 0;
exit(status);
}
static void
-usage()
+usage(void)
{
(void)fprintf(stderr,
-"usage: mtree [-cderUux] [-f spec] [-K key] [-k key] [-p path] [-s seed]\n");
+"usage: mtree [-LPUcdeinqruxw] [-f spec] [-f spec] [-K key] [-k key] [-p path] [-s seed]\n"
+"\t[-X excludes]\n");
exit(1);
}