1 /*- 2 * Copyright (c) 1989, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#) Copyright (c) 1989, 1990, 1993 The Regents of the University of California. All rights reserved. 30 * @(#)mtree.c 8.1 (Berkeley) 6/6/93 31 * $FreeBSD: src/usr.sbin/mtree/mtree.c,v 1.8.2.3 2003/05/07 17:55:17 tobez Exp $ 32 * $DragonFly: src/usr.sbin/mtree/mtree.c,v 1.5 2004/03/15 16:24:22 dillon Exp $ 33 */ 34 35 #include <sys/param.h> 36 #include <sys/stat.h> 37 #include <err.h> 38 #include <errno.h> 39 #include <fts.h> 40 #include <stdio.h> 41 #include <unistd.h> 42 #include "mtree.h" 43 #include "extern.h" 44 45 int ftsoptions = FTS_PHYSICAL; 46 int cflag, dflag, eflag, iflag, nflag, qflag, rflag, sflag, uflag, Uflag; 47 u_int keys; 48 char fullpath[MAXPATHLEN]; 49 50 static void usage(void); 51 52 int 53 main(int argc, char *argv[]) 54 { 55 int ch; 56 char *dir, *p; 57 int status; 58 59 dir = NULL; 60 keys = KEYDEFAULT; 61 init_excludes(); 62 63 while ((ch = getopt(argc, argv, "cdef:iK:k:LnPp:qrs:UuxX:")) != -1) 64 switch((char)ch) { 65 case 'c': 66 cflag = 1; 67 break; 68 case 'd': 69 dflag = 1; 70 break; 71 case 'e': 72 eflag = 1; 73 break; 74 case 'f': 75 if (!(freopen(optarg, "r", stdin))) 76 err(1, "%s", optarg); 77 break; 78 case 'i': 79 iflag = 1; 80 break; 81 case 'K': 82 while ((p = strsep(&optarg, " \t,")) != NULL) 83 if (*p != '\0') 84 keys |= parsekey(p, NULL); 85 break; 86 case 'k': 87 keys = F_TYPE; 88 while ((p = strsep(&optarg, " \t,")) != NULL) 89 if (*p != '\0') 90 keys |= parsekey(p, NULL); 91 break; 92 case 'L': 93 ftsoptions &= ~FTS_PHYSICAL; 94 ftsoptions |= FTS_LOGICAL; 95 break; 96 case 'n': 97 nflag = 1; 98 break; 99 case 'P': 100 ftsoptions &= ~FTS_LOGICAL; 101 ftsoptions |= FTS_PHYSICAL; 102 break; 103 case 'p': 104 dir = optarg; 105 break; 106 case 'q': 107 qflag = 1; 108 break; 109 case 'r': 110 rflag = 1; 111 break; 112 case 's': 113 sflag = 1; 114 crc_total = ~strtol(optarg, &p, 0); 115 if (*p) 116 errx(1, "illegal seed value -- %s", optarg); 117 break; 118 case 'U': 119 Uflag = 1; 120 uflag = 1; 121 break; 122 case 'u': 123 uflag = 1; 124 break; 125 case 'x': 126 ftsoptions |= FTS_XDEV; 127 break; 128 case 'X': 129 read_excludes_file(optarg); 130 break; 131 case '?': 132 default: 133 usage(); 134 } 135 argc -= optind; 136 argv += optind; 137 138 if (argc) 139 usage(); 140 141 if (dir && chdir(dir)) 142 err(1, "%s", dir); 143 144 if ((cflag || sflag) && !getwd(fullpath)) 145 errx(1, "%s", fullpath); 146 147 if (cflag) { 148 cwalk(); 149 exit(0); 150 } 151 status = verify(); 152 if (Uflag & (status == MISMATCHEXIT)) 153 status = 0; 154 exit(status); 155 } 156 157 static void 158 usage(void) 159 { 160 161 fprintf(stderr, 162 "usage: mtree [-LPUcdeinqrux] [-f spec] [-K key] [-k key] [-p path] [-s seed]\n" 163 "\t[-X excludes]\n"); 164 exit(1); 165 } 166