]> git.saurik.com Git - apple/file_cmds.git/blobdiff - mtree/mtree.c
file_cmds-264.50.1.tar.gz
[apple/file_cmds.git] / mtree / mtree.c
index f51b372fe723cda99790a32c201a9c34fecea94a..22bb6f00303605e05d8e150478e69fada61b3ffa 100644 (file)
@@ -1,5 +1,3 @@
-/*     $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;
@@ -89,8 +85,19 @@ main(argc, argv)
                        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)
@@ -103,60 +110,82 @@ main(argc, argv)
                                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);
 }