Home | History | Annotate | Line # | Download | only in mtree
mtree.c revision 1.14.10.1
      1  1.14.10.1        he /*	$NetBSD: mtree.c,v 1.14.10.1 2001/12/09 17:42:29 he Exp $	*/
      2        1.5       cgd 
      3        1.1       cgd /*-
      4        1.4       cgd  * Copyright (c) 1989, 1990, 1993
      5        1.4       cgd  *	The Regents of the University of California.  All rights reserved.
      6        1.1       cgd  *
      7        1.1       cgd  * Redistribution and use in source and binary forms, with or without
      8        1.1       cgd  * modification, are permitted provided that the following conditions
      9        1.1       cgd  * are met:
     10        1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     11        1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     12        1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     13        1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     14        1.1       cgd  *    documentation and/or other materials provided with the distribution.
     15        1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     16        1.1       cgd  *    must display the following acknowledgement:
     17        1.1       cgd  *	This product includes software developed by the University of
     18        1.1       cgd  *	California, Berkeley and its contributors.
     19        1.1       cgd  * 4. Neither the name of the University nor the names of its contributors
     20        1.1       cgd  *    may be used to endorse or promote products derived from this software
     21        1.1       cgd  *    without specific prior written permission.
     22        1.1       cgd  *
     23        1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24        1.1       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25        1.1       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26        1.1       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27        1.1       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28        1.1       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29        1.1       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30        1.1       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31        1.1       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32        1.1       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33        1.1       cgd  * SUCH DAMAGE.
     34        1.1       cgd  */
     35        1.1       cgd 
     36        1.9     lukem #include <sys/cdefs.h>
     37        1.1       cgd #ifndef lint
     38        1.9     lukem __COPYRIGHT("@(#) Copyright (c) 1989, 1990, 1993\n\
     39        1.9     lukem 	The Regents of the University of California.  All rights reserved.\n");
     40        1.1       cgd #endif /* not lint */
     41        1.1       cgd 
     42        1.1       cgd #ifndef lint
     43        1.5       cgd #if 0
     44        1.4       cgd static char sccsid[] = "@(#)mtree.c	8.1 (Berkeley) 6/6/93";
     45        1.5       cgd #else
     46  1.14.10.1        he __RCSID("$NetBSD: mtree.c,v 1.14.10.1 2001/12/09 17:42:29 he Exp $");
     47        1.5       cgd #endif
     48        1.1       cgd #endif /* not lint */
     49        1.1       cgd 
     50        1.1       cgd #include <sys/param.h>
     51        1.1       cgd #include <sys/stat.h>
     52        1.1       cgd #include <errno.h>
     53        1.3       cgd #include <unistd.h>
     54        1.1       cgd #include <stdio.h>
     55        1.1       cgd #include <fts.h>
     56        1.1       cgd #include "mtree.h"
     57        1.3       cgd #include "extern.h"
     58        1.1       cgd 
     59        1.3       cgd extern int crc_total;
     60        1.1       cgd 
     61        1.3       cgd int ftsoptions = FTS_PHYSICAL;
     62  1.14.10.1        he int cflag, dflag, eflag, iflag, lflag, mflag,
     63  1.14.10.1        he     rflag, sflag, tflag, uflag, Uflag;
     64       1.11       mrg int keys;
     65        1.3       cgd char fullpath[MAXPATHLEN];
     66        1.3       cgd 
     67        1.9     lukem 	int	main __P((int, char **));
     68        1.9     lukem static	void	usage __P((void));
     69        1.3       cgd 
     70        1.3       cgd int
     71        1.1       cgd main(argc, argv)
     72        1.1       cgd 	int argc;
     73        1.3       cgd 	char *argv[];
     74        1.1       cgd {
     75        1.1       cgd 	int ch;
     76        1.3       cgd 	char *dir, *p;
     77        1.8       agc 	int status;
     78        1.1       cgd 
     79        1.3       cgd 	dir = NULL;
     80        1.3       cgd 	keys = KEYDEFAULT;
     81  1.14.10.1        he 	while ((ch = getopt(argc, argv, "cdef:iK:k:lmp:rs:tUux")) != -1)
     82        1.1       cgd 		switch((char)ch) {
     83        1.1       cgd 		case 'c':
     84        1.1       cgd 			cflag = 1;
     85        1.1       cgd 			break;
     86        1.1       cgd 		case 'd':
     87        1.1       cgd 			dflag = 1;
     88        1.1       cgd 			break;
     89        1.1       cgd 		case 'e':
     90        1.1       cgd 			eflag = 1;
     91        1.1       cgd 			break;
     92        1.1       cgd 		case 'f':
     93        1.3       cgd 			if (!(freopen(optarg, "r", stdin)))
     94       1.10  wsanchez 				mtree_err("%s: %s", optarg, strerror(errno));
     95        1.3       cgd 			break;
     96       1.14       mrg 		case 'i':
     97       1.14       mrg 			iflag = 1;
     98       1.14       mrg 			break;
     99        1.3       cgd 		case 'K':
    100        1.3       cgd 			while ((p = strsep(&optarg, " \t,")) != NULL)
    101        1.3       cgd 				if (*p != '\0')
    102        1.3       cgd 					keys |= parsekey(p, NULL);
    103        1.3       cgd 			break;
    104        1.3       cgd 		case 'k':
    105        1.3       cgd 			keys = F_TYPE;
    106        1.3       cgd 			while ((p = strsep(&optarg, " \t,")) != NULL)
    107        1.3       cgd 				if (*p != '\0')
    108        1.3       cgd 					keys |= parsekey(p, NULL);
    109        1.1       cgd 			break;
    110  1.14.10.1        he 		case 'l':
    111  1.14.10.1        he 			lflag = 1;
    112  1.14.10.1        he 			break;
    113       1.14       mrg 		case 'm':
    114       1.14       mrg 			mflag = 1;
    115       1.14       mrg 			break;
    116        1.1       cgd 		case 'p':
    117        1.1       cgd 			dir = optarg;
    118        1.1       cgd 			break;
    119        1.1       cgd 		case 'r':
    120        1.1       cgd 			rflag = 1;
    121        1.1       cgd 			break;
    122        1.3       cgd 		case 's':
    123        1.3       cgd 			sflag = 1;
    124        1.3       cgd 			crc_total = ~strtol(optarg, &p, 0);
    125        1.3       cgd 			if (*p)
    126       1.10  wsanchez 				mtree_err("illegal seed value -- %s", optarg);
    127        1.7   thorpej 			break;
    128        1.6   mycroft 		case 't':
    129        1.6   mycroft 			tflag = 1;
    130        1.6   mycroft 			break;
    131        1.8       agc 		case 'U':
    132        1.8       agc 			Uflag = uflag = 1;
    133        1.8       agc 			break;
    134        1.1       cgd 		case 'u':
    135        1.1       cgd 			uflag = 1;
    136        1.1       cgd 			break;
    137        1.1       cgd 		case 'x':
    138        1.1       cgd 			ftsoptions |= FTS_XDEV;
    139        1.1       cgd 			break;
    140        1.1       cgd 		case '?':
    141        1.1       cgd 		default:
    142        1.1       cgd 			usage();
    143        1.1       cgd 		}
    144        1.1       cgd 	argc -= optind;
    145        1.3       cgd 	argv += optind;
    146        1.3       cgd 
    147        1.1       cgd 	if (argc)
    148        1.1       cgd 		usage();
    149        1.1       cgd 
    150        1.3       cgd 	if (dir && chdir(dir))
    151       1.10  wsanchez 		mtree_err("%s: %s", dir, strerror(errno));
    152        1.1       cgd 
    153       1.12   thorpej 	if ((cflag || sflag) && !getcwd(fullpath, MAXPATHLEN))
    154       1.13     itohy 		mtree_err("%s", strerror(errno));
    155        1.1       cgd 
    156       1.14       mrg 	if (iflag == 1 && mflag == 1)
    157       1.14       mrg 		mtree_err("-i and -m flags are mutually exclusive");
    158       1.14       mrg 
    159  1.14.10.1        he 	if (lflag == 1 && uflag == 1)
    160  1.14.10.1        he 		mtree_err("-l and -u flags are mutually exclusive");
    161  1.14.10.1        he 
    162        1.3       cgd 	if (cflag) {
    163        1.1       cgd 		cwalk();
    164        1.3       cgd 		exit(0);
    165        1.3       cgd 	}
    166        1.8       agc 	status = verify();
    167        1.8       agc 	if (Uflag & (status == MISMATCHEXIT))
    168        1.8       agc 		status = 0;
    169        1.8       agc 	exit(status);
    170        1.1       cgd }
    171        1.1       cgd 
    172        1.3       cgd static void
    173        1.1       cgd usage()
    174        1.1       cgd {
    175        1.1       cgd 	(void)fprintf(stderr,
    176  1.14.10.1        he "usage: mtree [-cdelrUux] [-i|-m] [-f spec] [-K key] [-k key] [-p path]"
    177       1.14       mrg     " [-s seed]\n");
    178        1.1       cgd 	exit(1);
    179        1.1       cgd }
    180