Home | History | Annotate | Line # | Download | only in pax
options.c revision 1.22.2.1
      1  1.22.2.1  wrstuden /*	$NetBSD: options.c,v 1.22.2.1 1999/12/27 18:27:08 wrstuden Exp $	*/
      2       1.5       cgd 
      3       1.1       jtc /*-
      4       1.1       jtc  * Copyright (c) 1992 Keith Muller.
      5       1.1       jtc  * Copyright (c) 1992, 1993
      6       1.1       jtc  *	The Regents of the University of California.  All rights reserved.
      7       1.1       jtc  *
      8       1.1       jtc  * This code is derived from software contributed to Berkeley by
      9       1.1       jtc  * Keith Muller of the University of California, San Diego.
     10       1.1       jtc  *
     11       1.1       jtc  * Redistribution and use in source and binary forms, with or without
     12       1.1       jtc  * modification, are permitted provided that the following conditions
     13       1.1       jtc  * are met:
     14       1.1       jtc  * 1. Redistributions of source code must retain the above copyright
     15       1.1       jtc  *    notice, this list of conditions and the following disclaimer.
     16       1.1       jtc  * 2. Redistributions in binary form must reproduce the above copyright
     17       1.1       jtc  *    notice, this list of conditions and the following disclaimer in the
     18       1.1       jtc  *    documentation and/or other materials provided with the distribution.
     19       1.1       jtc  * 3. All advertising materials mentioning features or use of this software
     20       1.1       jtc  *    must display the following acknowledgement:
     21       1.1       jtc  *	This product includes software developed by the University of
     22       1.1       jtc  *	California, Berkeley and its contributors.
     23       1.1       jtc  * 4. Neither the name of the University nor the names of its contributors
     24       1.1       jtc  *    may be used to endorse or promote products derived from this software
     25       1.1       jtc  *    without specific prior written permission.
     26       1.1       jtc  *
     27       1.1       jtc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     28       1.1       jtc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29       1.1       jtc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30       1.1       jtc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     31       1.1       jtc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     32       1.1       jtc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     33       1.1       jtc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     34       1.1       jtc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     35       1.1       jtc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     36       1.1       jtc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     37       1.1       jtc  * SUCH DAMAGE.
     38       1.1       jtc  */
     39       1.1       jtc 
     40       1.8  christos #include <sys/cdefs.h>
     41       1.1       jtc #ifndef lint
     42       1.5       cgd #if 0
     43       1.5       cgd static char sccsid[] = "@(#)options.c	8.2 (Berkeley) 4/18/94";
     44       1.5       cgd #else
     45  1.22.2.1  wrstuden __RCSID("$NetBSD: options.c,v 1.22.2.1 1999/12/27 18:27:08 wrstuden Exp $");
     46       1.5       cgd #endif
     47       1.1       jtc #endif /* not lint */
     48       1.1       jtc 
     49       1.1       jtc #include <sys/types.h>
     50       1.1       jtc #include <sys/time.h>
     51       1.1       jtc #include <sys/stat.h>
     52       1.1       jtc #include <sys/mtio.h>
     53       1.1       jtc #include <sys/param.h>
     54       1.1       jtc #include <stdio.h>
     55       1.1       jtc #include <ctype.h>
     56       1.1       jtc #include <string.h>
     57       1.1       jtc #include <unistd.h>
     58       1.1       jtc #include <stdlib.h>
     59       1.1       jtc #include <limits.h>
     60       1.1       jtc #include "pax.h"
     61       1.1       jtc #include "options.h"
     62       1.1       jtc #include "cpio.h"
     63       1.1       jtc #include "tar.h"
     64       1.1       jtc #include "extern.h"
     65       1.1       jtc 
     66       1.1       jtc /*
     67       1.1       jtc  * Routines which handle command line options
     68       1.1       jtc  */
     69       1.1       jtc 
     70      1.10       mrg int cpio_mode;			/* set if we are in cpio mode */
     71      1.10       mrg 
     72      1.18        tv static int nopids;		/* tar mode: suppress "pids" for -p option */
     73      1.10       mrg static char *flgch = FLGCH;	/* list of all possible flags (pax) */
     74       1.1       jtc static OPLIST *ophead = NULL;	/* head for format specific options -x */
     75       1.1       jtc static OPLIST *optail = NULL;	/* option tail */
     76  1.22.2.1  wrstuden static char *firstminusC;	/* first -C argument encountered. */
     77       1.1       jtc 
     78       1.1       jtc static int no_op __P((void));
     79       1.1       jtc static void printflg __P((unsigned int));
     80       1.1       jtc static int c_frmt __P((const void *, const void *));
     81       1.1       jtc static off_t str_offt __P((char *));
     82       1.7       tls static void pax_options __P((int, char **));
     83       1.1       jtc static void pax_usage __P((void));
     84       1.7       tls static void tar_options __P((int, char **));
     85       1.1       jtc static void tar_usage __P((void));
     86       1.7       tls static void cpio_options __P((int, char **));
     87       1.1       jtc static void cpio_usage __P((void));
     88       1.1       jtc 
     89  1.22.2.1  wrstuden static void checkpositionalminusC __P((char ***, int (*)(char *, int)));
     90  1.22.2.1  wrstuden 
     91       1.6       mrg #define GZIP_CMD	"gzip"		/* command to run as gzip */
     92       1.6       mrg #define COMPRESS_CMD	"compress"	/* command to run as compress */
     93       1.6       mrg 
     94       1.1       jtc /*
     95       1.1       jtc  *	Format specific routine table - MUST BE IN SORTED ORDER BY NAME
     96       1.1       jtc  *	(see pax.h for description of each function)
     97       1.1       jtc  *
     98       1.1       jtc  * 	name, blksz, hdsz, udev, hlk, blkagn, inhead, id, st_read,
     99       1.1       jtc  *	read, end_read, st_write, write, end_write, trail,
    100       1.1       jtc  *	rd_data, wr_data, options
    101       1.1       jtc  */
    102       1.1       jtc 
    103       1.1       jtc FSUB fsub[] = {
    104       1.1       jtc /* 0: OLD BINARY CPIO */
    105       1.8  christos 	{ "bcpio", 5120, sizeof(HD_BCPIO), 1, 0, 0, 1, bcpio_id, cpio_strd,
    106       1.8  christos 	bcpio_rd, bcpio_endrd, cpio_stwr, bcpio_wr, cpio_endwr, NULL,
    107       1.8  christos 	cpio_subtrail, rd_wrfile, wr_rdfile, bad_opt },
    108       1.1       jtc 
    109       1.1       jtc /* 1: OLD OCTAL CHARACTER CPIO */
    110       1.8  christos 	{ "cpio", 5120, sizeof(HD_CPIO), 1, 0, 0, 1, cpio_id, cpio_strd,
    111       1.8  christos 	cpio_rd, cpio_endrd, cpio_stwr, cpio_wr, cpio_endwr, NULL,
    112       1.8  christos 	cpio_subtrail, rd_wrfile, wr_rdfile, bad_opt },
    113       1.1       jtc 
    114       1.1       jtc /* 2: SVR4 HEX CPIO */
    115       1.8  christos 	{ "sv4cpio", 5120, sizeof(HD_VCPIO), 1, 0, 0, 1, vcpio_id, cpio_strd,
    116       1.8  christos 	vcpio_rd, vcpio_endrd, cpio_stwr, vcpio_wr, cpio_endwr, NULL,
    117       1.8  christos 	cpio_subtrail, rd_wrfile, wr_rdfile, bad_opt },
    118       1.1       jtc 
    119       1.1       jtc /* 3: SVR4 HEX CPIO WITH CRC */
    120       1.8  christos 	{ "sv4crc", 5120, sizeof(HD_VCPIO), 1, 0, 0, 1, crc_id, crc_strd,
    121       1.8  christos 	vcpio_rd, vcpio_endrd, crc_stwr, vcpio_wr, cpio_endwr, NULL,
    122       1.8  christos 	cpio_subtrail, rd_wrfile, wr_rdfile, bad_opt },
    123       1.1       jtc 
    124       1.1       jtc /* 4: OLD TAR */
    125       1.8  christos 	{ "tar", 10240, BLKMULT, 0, 1, BLKMULT, 0, tar_id, no_op,
    126       1.1       jtc 	tar_rd, tar_endrd, no_op, tar_wr, tar_endwr, tar_trail,
    127       1.8  christos 	NULL, rd_wrfile, wr_rdfile, tar_opt },
    128       1.1       jtc 
    129       1.1       jtc /* 5: POSIX USTAR */
    130       1.8  christos 	{ "ustar", 10240, BLKMULT, 0, 1, BLKMULT, 0, ustar_id, ustar_strd,
    131       1.1       jtc 	ustar_rd, tar_endrd, ustar_stwr, ustar_wr, tar_endwr, tar_trail,
    132       1.8  christos 	NULL, rd_wrfile, wr_rdfile, bad_opt }
    133       1.1       jtc };
    134      1.10       mrg #define F_BCPIO		0	/* old binary cpio format */
    135      1.10       mrg #define F_CPIO		1	/* old octal character cpio format */
    136      1.10       mrg #define F_SV4CPIO	2	/* SVR4 hex cpio format */
    137      1.10       mrg #define F_SV4CRC	3	/* SVR4 hex with crc cpio format */
    138      1.18        tv #define F_TAR		4	/* old V7 UNIX tar format */
    139      1.10       mrg #define F_USTAR		5	/* ustar format */
    140      1.10       mrg #define DEFLT		F_USTAR	/* default write format from list above */
    141       1.1       jtc 
    142       1.1       jtc /*
    143       1.1       jtc  * ford is the archive search order used by get_arc() to determine what kind
    144       1.1       jtc  * of archive we are dealing with. This helps to properly id  archive formats
    145       1.1       jtc  * some formats may be subsets of others....
    146       1.1       jtc  */
    147      1.10       mrg int ford[] = {F_USTAR, F_TAR, F_SV4CRC, F_SV4CPIO, F_CPIO, F_BCPIO, -1};
    148       1.1       jtc 
    149       1.1       jtc /*
    150       1.1       jtc  * options()
    151       1.1       jtc  *	figure out if we are pax, tar or cpio. Call the appropriate options
    152       1.1       jtc  *	parser
    153       1.1       jtc  */
    154       1.1       jtc 
    155       1.1       jtc #if __STDC__
    156       1.1       jtc void
    157       1.7       tls options(int argc, char **argv)
    158       1.1       jtc #else
    159       1.1       jtc void
    160       1.1       jtc options(argc, argv)
    161       1.7       tls 	int argc;
    162       1.7       tls 	char **argv;
    163       1.1       jtc #endif
    164       1.1       jtc {
    165       1.1       jtc 
    166       1.1       jtc 	/*
    167       1.1       jtc 	 * Are we acting like pax, tar or cpio (based on argv[0])
    168       1.1       jtc 	 */
    169       1.1       jtc 	if ((argv0 = strrchr(argv[0], '/')) != NULL)
    170       1.1       jtc 		argv0++;
    171       1.1       jtc 	else
    172       1.1       jtc 		argv0 = argv[0];
    173       1.1       jtc 
    174       1.1       jtc 	if (strcmp(NM_TAR, argv0) == 0)
    175      1.13   mycroft 		tar_options(argc, argv);
    176       1.1       jtc 	else if (strcmp(NM_CPIO, argv0) == 0)
    177      1.13   mycroft 		cpio_options(argc, argv);
    178      1.13   mycroft 	else {
    179      1.13   mycroft 		argv0 = NM_PAX;
    180      1.13   mycroft 		pax_options(argc, argv);
    181      1.13   mycroft 	}
    182       1.1       jtc }
    183       1.1       jtc 
    184       1.1       jtc /*
    185       1.1       jtc  * pax_options()
    186       1.1       jtc  *	look at the user specified flags. set globals as required and check if
    187       1.1       jtc  *	the user specified a legal set of flags. If not, complain and exit
    188       1.1       jtc  */
    189       1.1       jtc 
    190       1.1       jtc #if __STDC__
    191       1.1       jtc static void
    192       1.7       tls pax_options(int argc, char **argv)
    193       1.1       jtc #else
    194       1.1       jtc static void
    195       1.1       jtc pax_options(argc, argv)
    196       1.7       tls 	int argc;
    197       1.7       tls 	char **argv;
    198       1.1       jtc #endif
    199       1.1       jtc {
    200       1.7       tls 	int c;
    201       1.7       tls 	int i;
    202       1.1       jtc 	unsigned int flg = 0;
    203       1.1       jtc 	unsigned int bflg = 0;
    204       1.7       tls 	char *pt;
    205       1.1       jtc         FSUB tmp;
    206       1.1       jtc 	extern char *optarg;
    207       1.1       jtc 	extern int optind;
    208       1.1       jtc 
    209       1.1       jtc 	/*
    210       1.1       jtc 	 * process option flags
    211       1.1       jtc 	 */
    212      1.20      tron 	while ((c=getopt(argc,argv,"ab:cdf:iklno:p:rs:tuvwx:zAB:DE:G:HLPT:U:XYZ"))
    213       1.9     lukem 	    != -1) {
    214       1.1       jtc 		switch (c) {
    215       1.1       jtc 		case 'a':
    216       1.1       jtc 			/*
    217       1.1       jtc 			 * append
    218       1.1       jtc 			 */
    219       1.1       jtc 			flg |= AF;
    220       1.1       jtc 			break;
    221       1.1       jtc 		case 'b':
    222       1.1       jtc 			/*
    223       1.1       jtc 			 * specify blocksize
    224       1.1       jtc 			 */
    225       1.1       jtc 			flg |= BF;
    226       1.1       jtc 			if ((wrblksz = (int)str_offt(optarg)) <= 0) {
    227       1.8  christos 				tty_warn(1, "Invalid block size %s", optarg);
    228       1.1       jtc 				pax_usage();
    229       1.1       jtc 			}
    230       1.1       jtc 			break;
    231       1.1       jtc 		case 'c':
    232       1.1       jtc 			/*
    233       1.1       jtc 			 * inverse match on patterns
    234       1.1       jtc 			 */
    235       1.1       jtc 			cflag = 1;
    236       1.1       jtc 			flg |= CF;
    237       1.1       jtc 			break;
    238       1.1       jtc 		case 'd':
    239       1.1       jtc 			/*
    240       1.1       jtc 			 * match only dir on extract, not the subtree at dir
    241       1.1       jtc 			 */
    242       1.1       jtc 			dflag = 1;
    243       1.1       jtc 			flg |= DF;
    244       1.1       jtc 			break;
    245       1.1       jtc 		case 'f':
    246       1.1       jtc 			/*
    247       1.1       jtc 			 * filename where the archive is stored
    248       1.1       jtc 			 */
    249       1.1       jtc 			arcname = optarg;
    250       1.1       jtc 			flg |= FF;
    251       1.1       jtc 			break;
    252       1.1       jtc 		case 'i':
    253       1.1       jtc 			/*
    254       1.1       jtc 			 * interactive file rename
    255       1.1       jtc 			 */
    256       1.1       jtc 			iflag = 1;
    257       1.1       jtc 			flg |= IF;
    258       1.1       jtc 			break;
    259       1.1       jtc 		case 'k':
    260       1.1       jtc 			/*
    261       1.1       jtc 			 * do not clobber files that exist
    262       1.1       jtc 			 */
    263       1.1       jtc 			kflag = 1;
    264       1.1       jtc 			flg |= KF;
    265       1.1       jtc 			break;
    266       1.1       jtc 		case 'l':
    267       1.1       jtc 			/*
    268       1.1       jtc 			 * try to link src to dest with copy (-rw)
    269       1.1       jtc 			 */
    270       1.1       jtc 			lflag = 1;
    271       1.1       jtc 			flg |= LF;
    272       1.1       jtc 			break;
    273       1.1       jtc 		case 'n':
    274       1.1       jtc 			/*
    275       1.1       jtc 			 * select first match for a pattern only
    276       1.1       jtc 			 */
    277       1.1       jtc 			nflag = 1;
    278       1.1       jtc 			flg |= NF;
    279       1.1       jtc 			break;
    280       1.1       jtc 		case 'o':
    281       1.1       jtc 			/*
    282       1.1       jtc 			 * pass format specific options
    283       1.1       jtc 			 */
    284       1.1       jtc 			flg |= OF;
    285       1.1       jtc 			if (opt_add(optarg) < 0)
    286       1.1       jtc 				pax_usage();
    287       1.1       jtc 			break;
    288       1.1       jtc 		case 'p':
    289       1.1       jtc 			/*
    290       1.1       jtc 			 * specify file characteristic options
    291       1.1       jtc 			 */
    292       1.1       jtc 			for (pt = optarg; *pt != '\0'; ++pt) {
    293       1.1       jtc 				switch(*pt) {
    294       1.1       jtc 				case 'a':
    295       1.1       jtc 					/*
    296       1.1       jtc 					 * do not preserve access time
    297       1.1       jtc 					 */
    298       1.1       jtc 					patime = 0;
    299       1.1       jtc 					break;
    300       1.1       jtc 				case 'e':
    301       1.1       jtc 					/*
    302       1.1       jtc 					 * preserve user id, group id, file
    303       1.1       jtc 					 * mode, access/modification times
    304  1.22.2.1  wrstuden 					 * and file flags.
    305       1.1       jtc 					 */
    306       1.1       jtc 					pids = 1;
    307       1.1       jtc 					pmode = 1;
    308       1.1       jtc 					patime = 1;
    309       1.1       jtc 					pmtime = 1;
    310  1.22.2.1  wrstuden 					pfflags = 1;
    311  1.22.2.1  wrstuden 					break;
    312  1.22.2.1  wrstuden #if 0
    313  1.22.2.1  wrstuden 				case 'f':
    314  1.22.2.1  wrstuden 					/*
    315  1.22.2.1  wrstuden 					 * do not preserve file flags
    316  1.22.2.1  wrstuden 					 */
    317  1.22.2.1  wrstuden 					pfflags = 0;
    318       1.1       jtc 					break;
    319  1.22.2.1  wrstuden #endif
    320       1.1       jtc 				case 'm':
    321       1.1       jtc 					/*
    322       1.1       jtc 					 * do not preserve modification time
    323       1.1       jtc 					 */
    324       1.1       jtc 					pmtime = 0;
    325       1.1       jtc 					break;
    326       1.1       jtc 				case 'o':
    327       1.1       jtc 					/*
    328       1.1       jtc 					 * preserve uid/gid
    329       1.1       jtc 					 */
    330       1.1       jtc 					pids = 1;
    331       1.1       jtc 					break;
    332       1.1       jtc 				case 'p':
    333       1.1       jtc 					/*
    334       1.1       jtc 					 * preserver file mode bits
    335       1.1       jtc 					 */
    336       1.1       jtc 					pmode = 1;
    337       1.1       jtc 					break;
    338       1.1       jtc 				default:
    339       1.8  christos 					tty_warn(1,
    340       1.8  christos 					    "Invalid -p string: %c", *pt);
    341       1.1       jtc 					pax_usage();
    342       1.1       jtc 					break;
    343       1.1       jtc 				}
    344       1.1       jtc 			}
    345       1.1       jtc 			flg |= PF;
    346       1.1       jtc 			break;
    347       1.1       jtc 		case 'r':
    348       1.1       jtc 			/*
    349       1.1       jtc 			 * read the archive
    350       1.1       jtc 			 */
    351       1.1       jtc 			flg |= RF;
    352       1.1       jtc 			break;
    353       1.1       jtc 		case 's':
    354       1.1       jtc 			/*
    355       1.1       jtc 			 * file name substitution name pattern
    356       1.1       jtc 			 */
    357       1.1       jtc 			if (rep_add(optarg) < 0) {
    358       1.1       jtc 				pax_usage();
    359       1.1       jtc 				break;
    360       1.1       jtc 			}
    361       1.1       jtc 			flg |= SF;
    362       1.1       jtc 			break;
    363       1.1       jtc 		case 't':
    364       1.1       jtc 			/*
    365       1.1       jtc 			 * preserve access time on filesystem nodes we read
    366       1.1       jtc 			 */
    367       1.1       jtc 			tflag = 1;
    368       1.1       jtc 			flg |= TF;
    369       1.1       jtc 			break;
    370       1.1       jtc 		case 'u':
    371       1.1       jtc 			/*
    372       1.1       jtc 			 * ignore those older files
    373       1.1       jtc 			 */
    374       1.1       jtc 			uflag = 1;
    375       1.1       jtc 			flg |= UF;
    376       1.1       jtc 			break;
    377       1.1       jtc 		case 'v':
    378       1.1       jtc 			/*
    379       1.1       jtc 			 * verbose operation mode
    380       1.1       jtc 			 */
    381       1.1       jtc 			vflag = 1;
    382       1.1       jtc 			flg |= VF;
    383       1.1       jtc 			break;
    384       1.1       jtc 		case 'w':
    385       1.1       jtc 			/*
    386       1.1       jtc 			 * write an archive
    387       1.1       jtc 			 */
    388       1.1       jtc 			flg |= WF;
    389       1.1       jtc 			break;
    390       1.1       jtc 		case 'x':
    391       1.1       jtc 			/*
    392       1.1       jtc 			 * specify an archive format on write
    393       1.1       jtc 			 */
    394       1.1       jtc 			tmp.name = optarg;
    395       1.8  christos 			frmt = (FSUB *)bsearch((void *)&tmp, (void *)fsub,
    396       1.8  christos 			    sizeof(fsub)/sizeof(FSUB), sizeof(FSUB), c_frmt);
    397       1.8  christos 			if (frmt != NULL) {
    398       1.1       jtc 				flg |= XF;
    399       1.1       jtc 				break;
    400       1.1       jtc 			}
    401       1.8  christos 			tty_warn(1, "Unknown -x format: %s", optarg);
    402       1.1       jtc 			(void)fputs("pax: Known -x formats are:", stderr);
    403       1.1       jtc 			for (i = 0; i < (sizeof(fsub)/sizeof(FSUB)); ++i)
    404       1.1       jtc 				(void)fprintf(stderr, " %s", fsub[i].name);
    405       1.1       jtc 			(void)fputs("\n\n", stderr);
    406       1.1       jtc 			pax_usage();
    407       1.1       jtc 			break;
    408       1.6       mrg 		case 'z':
    409       1.6       mrg 			/*
    410       1.6       mrg 			 * use gzip.  Non standard option.
    411       1.6       mrg 			 */
    412       1.6       mrg 			zflag = 1;
    413       1.6       mrg 			gzip_program = GZIP_CMD;
    414      1.20      tron 			break;
    415      1.20      tron 		case 'A':
    416      1.20      tron 			Aflag = 1;
    417      1.20      tron 			flg |= CAF;
    418       1.6       mrg 			break;
    419       1.1       jtc 		case 'B':
    420       1.1       jtc 			/*
    421       1.1       jtc 			 * non-standard option on number of bytes written on a
    422       1.1       jtc 			 * single archive volume.
    423       1.1       jtc 			 */
    424       1.1       jtc 			if ((wrlimit = str_offt(optarg)) <= 0) {
    425       1.8  christos 				tty_warn(1, "Invalid write limit %s", optarg);
    426       1.1       jtc 				pax_usage();
    427       1.1       jtc 			}
    428       1.1       jtc 			if (wrlimit % BLKMULT) {
    429       1.8  christos 				tty_warn(1,
    430       1.8  christos 				    "Write limit is not a %d byte multiple",
    431       1.1       jtc 				    BLKMULT);
    432       1.1       jtc 				pax_usage();
    433       1.1       jtc 			}
    434       1.1       jtc 			flg |= CBF;
    435       1.1       jtc 			break;
    436       1.1       jtc 		case 'D':
    437       1.1       jtc 			/*
    438       1.1       jtc 			 * On extraction check file inode change time before the
    439       1.1       jtc 			 * modification of the file name. Non standard option.
    440       1.1       jtc 			 */
    441       1.1       jtc 			Dflag = 1;
    442       1.1       jtc 			flg |= CDF;
    443       1.1       jtc 			break;
    444       1.1       jtc 		case 'E':
    445       1.1       jtc 			/*
    446       1.1       jtc 			 * non-standard limit on read faults
    447       1.1       jtc 			 * 0 indicates stop after first error, values
    448       1.1       jtc 			 * indicate a limit, "NONE" try forever
    449       1.1       jtc 			 */
    450       1.1       jtc 			flg |= CEF;
    451       1.1       jtc 			if (strcmp(NONE, optarg) == 0)
    452       1.1       jtc 				maxflt = -1;
    453       1.1       jtc 			else if ((maxflt = atoi(optarg)) < 0) {
    454       1.8  christos 				tty_warn(1,
    455       1.8  christos 				    "Error count value must be positive");
    456       1.1       jtc 				pax_usage();
    457       1.1       jtc 			}
    458       1.1       jtc 			break;
    459       1.1       jtc 		case 'G':
    460       1.1       jtc 			/*
    461       1.1       jtc 			 * non-standard option for selecting files within an
    462       1.1       jtc 			 * archive by group (gid or name)
    463       1.1       jtc 			 */
    464       1.1       jtc 			if (grp_add(optarg) < 0) {
    465       1.1       jtc 				pax_usage();
    466       1.1       jtc 				break;
    467       1.1       jtc 			}
    468       1.1       jtc 			flg |= CGF;
    469       1.1       jtc 			break;
    470       1.1       jtc 		case 'H':
    471       1.1       jtc 			/*
    472       1.1       jtc 			 * follow command line symlinks only
    473       1.1       jtc 			 */
    474       1.1       jtc 			Hflag = 1;
    475       1.1       jtc 			flg |= CHF;
    476       1.1       jtc 			break;
    477       1.1       jtc 		case 'L':
    478       1.1       jtc 			/*
    479       1.1       jtc 			 * follow symlinks
    480       1.1       jtc 			 */
    481       1.1       jtc 			Lflag = 1;
    482       1.1       jtc 			flg |= CLF;
    483       1.1       jtc 			break;
    484       1.1       jtc 		case 'P':
    485       1.1       jtc 			/*
    486       1.1       jtc 			 * do NOT follow symlinks (default)
    487       1.1       jtc 			 */
    488       1.1       jtc 			Lflag = 0;
    489       1.1       jtc 			flg |= CPF;
    490       1.1       jtc 			break;
    491       1.1       jtc 		case 'T':
    492       1.1       jtc 			/*
    493       1.1       jtc 			 * non-standard option for selecting files within an
    494       1.1       jtc 			 * archive by modification time range (lower,upper)
    495       1.1       jtc 			 */
    496       1.1       jtc 			if (trng_add(optarg) < 0) {
    497       1.1       jtc 				pax_usage();
    498       1.1       jtc 				break;
    499       1.1       jtc 			}
    500       1.1       jtc 			flg |= CTF;
    501       1.1       jtc 			break;
    502       1.1       jtc 		case 'U':
    503       1.1       jtc 			/*
    504       1.1       jtc 			 * non-standard option for selecting files within an
    505       1.1       jtc 			 * archive by user (uid or name)
    506       1.1       jtc 			 */
    507       1.1       jtc 			if (usr_add(optarg) < 0) {
    508       1.1       jtc 				pax_usage();
    509       1.1       jtc 				break;
    510       1.1       jtc 			}
    511       1.1       jtc 			flg |= CUF;
    512       1.1       jtc 			break;
    513       1.1       jtc 		case 'X':
    514       1.1       jtc 			/*
    515       1.1       jtc 			 * do not pass over mount points in the file system
    516       1.1       jtc 			 */
    517       1.1       jtc 			Xflag = 1;
    518       1.1       jtc 			flg |= CXF;
    519       1.1       jtc 			break;
    520       1.1       jtc 		case 'Y':
    521       1.1       jtc 			/*
    522       1.1       jtc 			 * On extraction check file inode change time after the
    523       1.1       jtc 			 * modification of the file name. Non standard option.
    524       1.1       jtc 			 */
    525       1.1       jtc 			Yflag = 1;
    526       1.1       jtc 			flg |= CYF;
    527       1.1       jtc 			break;
    528       1.1       jtc 		case 'Z':
    529       1.1       jtc 			/*
    530       1.1       jtc 			 * On extraction check modification time after the
    531       1.1       jtc 			 * modification of the file name. Non standard option.
    532       1.1       jtc 			 */
    533       1.1       jtc 			Zflag = 1;
    534       1.1       jtc 			flg |= CZF;
    535       1.1       jtc 			break;
    536       1.1       jtc 		case '?':
    537       1.1       jtc 		default:
    538       1.1       jtc 			pax_usage();
    539       1.1       jtc 			break;
    540       1.1       jtc 		}
    541       1.1       jtc 	}
    542       1.1       jtc 
    543       1.1       jtc 	/*
    544       1.1       jtc 	 * figure out the operation mode of pax read,write,extract,copy,append
    545       1.1       jtc 	 * or list. check that we have not been given a bogus set of flags
    546       1.1       jtc 	 * for the operation mode.
    547       1.1       jtc 	 */
    548       1.1       jtc 	if (ISLIST(flg)) {
    549       1.1       jtc 		act = LIST;
    550       1.1       jtc 		bflg = flg & BDLIST;
    551       1.1       jtc 	} else if (ISEXTRACT(flg)) {
    552       1.1       jtc 		act = EXTRACT;
    553       1.1       jtc 		bflg = flg & BDEXTR;
    554       1.1       jtc 	} else if (ISARCHIVE(flg)) {
    555       1.1       jtc 		act = ARCHIVE;
    556       1.1       jtc 		bflg = flg & BDARCH;
    557       1.1       jtc 	} else if (ISAPPND(flg)) {
    558       1.1       jtc 		act = APPND;
    559       1.1       jtc 		bflg = flg & BDARCH;
    560       1.1       jtc 	} else if (ISCOPY(flg)) {
    561       1.1       jtc 		act = COPY;
    562       1.1       jtc 		bflg = flg & BDCOPY;
    563       1.1       jtc 	} else
    564       1.1       jtc 		pax_usage();
    565       1.1       jtc 	if (bflg) {
    566       1.1       jtc 		printflg(flg);
    567       1.1       jtc 		pax_usage();
    568       1.1       jtc 	}
    569       1.1       jtc 
    570       1.1       jtc 	/*
    571       1.1       jtc 	 * if we are writing (ARCHIVE) we use the default format if the user
    572       1.1       jtc 	 * did not specify a format. when we write during an APPEND, we will
    573       1.1       jtc 	 * adopt the format of the existing archive if none was supplied.
    574       1.1       jtc 	 */
    575       1.1       jtc 	if (!(flg & XF) && (act == ARCHIVE))
    576       1.1       jtc 		frmt = &(fsub[DEFLT]);
    577       1.1       jtc 
    578       1.1       jtc 	/*
    579       1.1       jtc 	 * process the args as they are interpreted by the operation mode
    580       1.1       jtc 	 */
    581       1.1       jtc 	switch (act) {
    582       1.1       jtc 	case LIST:
    583       1.1       jtc 	case EXTRACT:
    584       1.1       jtc 		for (; optind < argc; optind++)
    585  1.22.2.1  wrstuden 			if (pat_add(argv[optind], 0) < 0)
    586       1.1       jtc 				pax_usage();
    587       1.1       jtc 		break;
    588       1.1       jtc 	case COPY:
    589       1.1       jtc 		if (optind >= argc) {
    590       1.8  christos 			tty_warn(0, "Destination directory was not supplied");
    591       1.1       jtc 			pax_usage();
    592       1.1       jtc 		}
    593       1.1       jtc 		--argc;
    594       1.1       jtc 		dirptr = argv[argc];
    595      1.14   mycroft 		/* FALLTHROUGH */
    596       1.1       jtc 	case ARCHIVE:
    597       1.1       jtc 	case APPND:
    598       1.1       jtc 		for (; optind < argc; optind++)
    599  1.22.2.1  wrstuden 			if (ftree_add(argv[optind], 0) < 0)
    600       1.1       jtc 				pax_usage();
    601       1.1       jtc 		/*
    602       1.1       jtc 		 * no read errors allowed on updates/append operation!
    603       1.1       jtc 		 */
    604       1.1       jtc 		maxflt = 0;
    605       1.1       jtc 		break;
    606       1.1       jtc 	}
    607       1.1       jtc }
    608       1.1       jtc 
    609       1.1       jtc 
    610       1.1       jtc /*
    611       1.1       jtc  * tar_options()
    612       1.1       jtc  *	look at the user specified flags. set globals as required and check if
    613       1.1       jtc  *	the user specified a legal set of flags. If not, complain and exit
    614       1.1       jtc  */
    615       1.1       jtc 
    616       1.1       jtc #if __STDC__
    617       1.1       jtc static void
    618       1.7       tls tar_options(int argc, char **argv)
    619       1.1       jtc #else
    620       1.1       jtc static void
    621       1.1       jtc tar_options(argc, argv)
    622       1.7       tls 	int argc;
    623       1.7       tls 	char **argv;
    624       1.1       jtc #endif
    625       1.1       jtc {
    626       1.7       tls 	int c;
    627       1.1       jtc 	int fstdin = 0;
    628       1.1       jtc 
    629       1.1       jtc 	/*
    630       1.1       jtc 	 * process option flags
    631       1.1       jtc 	 */
    632      1.22      tron 	while ((c = getoldopt(argc, argv, "b:cef:hlmoprutvwxzBC:LPX:Z014578"))
    633       1.9     lukem 	    != -1)  {
    634       1.4       jtc 		switch(c) {
    635       1.1       jtc 		case 'b':
    636       1.1       jtc 			/*
    637       1.1       jtc 			 * specify blocksize
    638       1.1       jtc 			 */
    639       1.4       jtc 			if ((wrblksz = (int)str_offt(optarg)) <= 0) {
    640       1.8  christos 				tty_warn(1, "Invalid block size %s", optarg);
    641       1.1       jtc 				tar_usage();
    642       1.1       jtc 			}
    643       1.1       jtc 			break;
    644       1.1       jtc 		case 'c':
    645       1.1       jtc 			/*
    646       1.1       jtc 			 * create an archive
    647       1.1       jtc 			 */
    648       1.1       jtc 			act = ARCHIVE;
    649       1.1       jtc 			break;
    650      1.10       mrg 		case 'C':
    651      1.10       mrg 			/*
    652      1.10       mrg 			 * chdir here before extracting.
    653  1.22.2.1  wrstuden 			 * do so lazily, in case it's a list
    654      1.10       mrg 			 */
    655  1.22.2.1  wrstuden 			firstminusC = optarg;
    656      1.10       mrg 			break;
    657       1.1       jtc 		case 'e':
    658       1.1       jtc 			/*
    659       1.1       jtc 			 * stop after first error
    660       1.1       jtc 			 */
    661       1.1       jtc 			maxflt = 0;
    662       1.1       jtc 			break;
    663       1.1       jtc 		case 'f':
    664       1.1       jtc 			/*
    665       1.1       jtc 			 * filename where the archive is stored
    666       1.1       jtc 			 */
    667       1.4       jtc 			if ((optarg[0] == '-') && (optarg[1]== '\0')) {
    668       1.1       jtc 				/*
    669       1.1       jtc 				 * treat a - as stdin
    670       1.1       jtc 				 */
    671       1.4       jtc 				fstdin = 1;
    672       1.1       jtc 				arcname = (char *)0;
    673       1.1       jtc 				break;
    674       1.1       jtc 			}
    675       1.1       jtc 			fstdin = 0;
    676       1.4       jtc 			arcname = optarg;
    677       1.1       jtc 			break;
    678      1.21      tron 		case 'h':
    679      1.21      tron 			/*
    680      1.21      tron 			 * follow command line symlinks only
    681      1.21      tron 			 */
    682      1.21      tron 			Hflag = 1;
    683      1.21      tron 			break;
    684      1.10       mrg 		case 'l':
    685      1.10       mrg 			/*
    686      1.10       mrg 			 * do not pass over mount points in the file system
    687      1.10       mrg 			 */
    688      1.10       mrg 			Xflag = 1;
    689      1.10       mrg 			break;
    690       1.1       jtc 		case 'm':
    691       1.1       jtc 			/*
    692       1.1       jtc 			 * do not preserve modification time
    693       1.1       jtc 			 */
    694       1.1       jtc 			pmtime = 0;
    695       1.1       jtc 			break;
    696       1.1       jtc 		case 'o':
    697      1.18        tv 			/*
    698      1.18        tv 			 * This option does several things based on whether
    699      1.18        tv 			 * this is a create or extract operation.
    700      1.18        tv 			 */
    701      1.18        tv 			if (act == ARCHIVE) {
    702      1.18        tv 				/* 4.2BSD: don't add directory entries. */
    703      1.18        tv 				if (opt_add("write_opt=nodir") < 0)
    704      1.18        tv 					tar_usage();
    705      1.18        tv 
    706      1.18        tv 				/* GNU tar: write V7 format archives. */
    707      1.16        tv 				frmt = &(fsub[F_TAR]);
    708      1.18        tv 			} else {
    709      1.18        tv 				/* SUS: don't preserve owner/group. */
    710      1.18        tv 				pids = 0;
    711      1.18        tv 				nopids = 1;
    712      1.18        tv 			}
    713       1.1       jtc 			break;
    714       1.1       jtc 		case 'p':
    715       1.1       jtc 			/*
    716       1.1       jtc 			 * preserve user id, group id, file
    717       1.1       jtc 			 * mode, access/modification times
    718       1.1       jtc 			 */
    719      1.18        tv 			if (!nopids)
    720      1.18        tv 				pids = 1;
    721       1.1       jtc 			pmode = 1;
    722       1.1       jtc 			patime = 1;
    723       1.1       jtc 			pmtime = 1;
    724       1.1       jtc 			break;
    725       1.1       jtc 		case 'r':
    726       1.1       jtc 		case 'u':
    727       1.1       jtc 			/*
    728       1.1       jtc 			 * append to the archive
    729       1.1       jtc 			 */
    730       1.1       jtc 			act = APPND;
    731       1.1       jtc 			break;
    732       1.1       jtc 		case 't':
    733       1.1       jtc 			/*
    734       1.1       jtc 			 * list contents of the tape
    735       1.1       jtc 			 */
    736       1.1       jtc 			act = LIST;
    737       1.1       jtc 			break;
    738       1.1       jtc 		case 'v':
    739       1.1       jtc 			/*
    740       1.1       jtc 			 * verbose operation mode
    741       1.1       jtc 			 */
    742       1.1       jtc 			vflag = 1;
    743       1.1       jtc 			break;
    744       1.1       jtc 		case 'w':
    745       1.1       jtc 			/*
    746       1.1       jtc 			 * interactive file rename
    747       1.1       jtc 			 */
    748       1.1       jtc 			iflag = 1;
    749       1.1       jtc 			break;
    750       1.1       jtc 		case 'x':
    751       1.1       jtc 			/*
    752       1.1       jtc 			 * write an archive
    753       1.1       jtc 			 */
    754       1.1       jtc 			act = EXTRACT;
    755       1.1       jtc 			break;
    756       1.6       mrg 		case 'z':
    757       1.6       mrg 			/*
    758       1.6       mrg 			 * use gzip.  Non standard option.
    759       1.6       mrg 			 */
    760       1.6       mrg 			zflag = 1;
    761       1.6       mrg 			gzip_program = GZIP_CMD;
    762       1.6       mrg 			break;
    763       1.1       jtc 		case 'B':
    764       1.1       jtc 			/*
    765       1.1       jtc 			 * Nothing to do here, this is pax default
    766       1.1       jtc 			 */
    767       1.1       jtc 			break;
    768       1.1       jtc 		case 'L':
    769       1.1       jtc 			/*
    770       1.1       jtc 			 * follow symlinks
    771       1.1       jtc 			 */
    772       1.1       jtc 			Lflag = 1;
    773       1.1       jtc 			break;
    774       1.1       jtc 		case 'P':
    775      1.21      tron 			Aflag = 1;
    776       1.1       jtc 			break;
    777       1.1       jtc 		case 'X':
    778       1.1       jtc 			/*
    779      1.15       mrg 			 * GNU tar compat: exclude the files listed in optarg
    780       1.1       jtc 			 */
    781      1.15       mrg 			if (tar_gnutar_X_compat(optarg) != 0)
    782      1.15       mrg 				tar_usage();
    783       1.6       mrg 			break;
    784       1.6       mrg 		case 'Z':
    785       1.6       mrg 			/*
    786       1.6       mrg 			 * use compress.
    787       1.6       mrg 			 */
    788       1.6       mrg 			zflag = 1;
    789       1.6       mrg 			gzip_program = COMPRESS_CMD;
    790       1.1       jtc 			break;
    791       1.1       jtc 		case '0':
    792       1.1       jtc 			arcname = DEV_0;
    793       1.1       jtc 			break;
    794       1.1       jtc 		case '1':
    795       1.1       jtc 			arcname = DEV_1;
    796       1.1       jtc 			break;
    797       1.1       jtc 		case '4':
    798       1.1       jtc 			arcname = DEV_4;
    799       1.1       jtc 			break;
    800       1.1       jtc 		case '5':
    801       1.1       jtc 			arcname = DEV_5;
    802       1.1       jtc 			break;
    803       1.1       jtc 		case '7':
    804       1.1       jtc 			arcname = DEV_7;
    805       1.1       jtc 			break;
    806       1.1       jtc 		case '8':
    807       1.1       jtc 			arcname = DEV_8;
    808       1.1       jtc 			break;
    809       1.1       jtc 		default:
    810       1.1       jtc 			tar_usage();
    811       1.1       jtc 			break;
    812       1.1       jtc 		}
    813       1.1       jtc 	}
    814       1.4       jtc 	argc -= optind;
    815       1.4       jtc 	argv += optind;
    816      1.17        tv 
    817  1.22.2.1  wrstuden 	if (firstminusC && (opt_chdir(firstminusC) < 0))
    818  1.22.2.1  wrstuden 		tty_warn(1, "can't remember -C directory");
    819  1.22.2.1  wrstuden 
    820      1.17        tv 	/*
    821      1.17        tv 	 * if we are writing (ARCHIVE) specify tar, otherwise run like pax
    822      1.17        tv 	 */
    823      1.17        tv 	if (act == ARCHIVE && frmt == NULL)
    824      1.17        tv 		frmt = &(fsub[F_USTAR]);
    825       1.1       jtc 
    826       1.1       jtc 	/*
    827       1.1       jtc 	 * process the args as they are interpreted by the operation mode
    828       1.1       jtc 	 */
    829       1.1       jtc 	switch (act) {
    830       1.1       jtc 	case LIST:
    831       1.1       jtc 	default:
    832       1.1       jtc 		while (*argv != (char *)NULL)
    833  1.22.2.1  wrstuden 			if (pat_add(*argv++, 0) < 0)
    834       1.1       jtc 				tar_usage();
    835       1.1       jtc 		break;
    836  1.22.2.1  wrstuden 	case EXTRACT:
    837  1.22.2.1  wrstuden 		checkpositionalminusC(&argv, pat_add);
    838  1.22.2.1  wrstuden 		break;
    839       1.1       jtc 	case ARCHIVE:
    840       1.1       jtc 	case APPND:
    841  1.22.2.1  wrstuden 		checkpositionalminusC(&argv, ftree_add);
    842       1.1       jtc 		/*
    843       1.1       jtc 		 * no read errors allowed on updates/append operation!
    844       1.1       jtc 		 */
    845       1.1       jtc 		maxflt = 0;
    846       1.1       jtc 		break;
    847       1.1       jtc 	}
    848       1.1       jtc 	if (!fstdin && ((arcname == (char *)NULL) || (*arcname == '\0'))) {
    849       1.1       jtc 		arcname = getenv("TAPE");
    850       1.1       jtc 		if ((arcname == (char *)NULL) || (*arcname == '\0'))
    851       1.1       jtc 			arcname = DEV_8;
    852       1.1       jtc 	}
    853       1.1       jtc }
    854       1.1       jtc 
    855       1.1       jtc /*
    856       1.1       jtc  * cpio_options()
    857       1.1       jtc  *	look at the user specified flags. set globals as required and check if
    858       1.1       jtc  *	the user specified a legal set of flags. If not, complain and exit
    859       1.1       jtc  */
    860       1.1       jtc 
    861       1.1       jtc #if __STDC__
    862       1.1       jtc static void
    863       1.7       tls cpio_options(int argc, char **argv)
    864       1.1       jtc #else
    865       1.1       jtc static void
    866       1.1       jtc cpio_options(argc, argv)
    867       1.7       tls 	int argc;
    868       1.7       tls 	char **argv;
    869       1.1       jtc #endif
    870       1.1       jtc {
    871      1.10       mrg         FSUB tmp;
    872      1.10       mrg 	unsigned int flg = 0;
    873      1.10       mrg 	unsigned int bflg = 0;
    874      1.10       mrg 	int c, i;
    875      1.10       mrg 
    876      1.10       mrg 	cpio_mode = uflag = 1;
    877      1.10       mrg 	/*
    878      1.10       mrg 	 * process option flags
    879      1.10       mrg 	 */
    880      1.10       mrg 	while ((c = getoldopt(argc, argv, "ABC:E:H:I:LM:O:R:SVabcdfiklmoprstuv"))
    881      1.10       mrg 	    != -1)  {
    882      1.10       mrg 		switch(c) {
    883      1.10       mrg 		case 'A':
    884      1.10       mrg 			/*
    885      1.10       mrg 			 * append to an archive
    886      1.10       mrg 			 */
    887      1.10       mrg 			act = APPND;
    888      1.10       mrg 			flg |= AF;
    889      1.10       mrg 			break;
    890      1.10       mrg 		case 'B':
    891      1.10       mrg 			/*
    892      1.10       mrg 			 * set blocksize to 5120
    893      1.10       mrg 			 */
    894      1.10       mrg 			blksz = 5120;
    895      1.10       mrg 			break;
    896      1.10       mrg 		case 'C':
    897      1.10       mrg 			/*
    898      1.10       mrg 			 * specify blocksize
    899      1.10       mrg 			 */
    900      1.10       mrg 			if ((blksz = (int)str_offt(optarg)) <= 0) {
    901      1.10       mrg 				tty_warn(1, "Invalid block size %s", optarg);
    902      1.10       mrg 				tar_usage();
    903      1.10       mrg 			}
    904      1.10       mrg 			break;
    905      1.10       mrg #ifdef notyet
    906      1.10       mrg 		case 'E':
    907      1.10       mrg 			arg = optarg;
    908      1.10       mrg 			break;
    909      1.10       mrg #endif
    910      1.10       mrg 		case 'H':
    911      1.10       mrg 			/*
    912      1.10       mrg 			 * specify an archive format on write
    913      1.10       mrg 			 */
    914      1.10       mrg 			tmp.name = optarg;
    915      1.10       mrg 			frmt = (FSUB *)bsearch((void *)&tmp, (void *)fsub,
    916      1.10       mrg 			    sizeof(fsub)/sizeof(FSUB), sizeof(FSUB), c_frmt);
    917      1.10       mrg 			if (frmt != NULL) {
    918      1.10       mrg 				flg |= XF;
    919      1.10       mrg 				break;
    920      1.10       mrg 			}
    921      1.10       mrg 			tty_warn(1, "Unknown -H format: %s", optarg);
    922      1.10       mrg 			(void)fputs("cpio: Known -H formats are:", stderr);
    923      1.10       mrg 			for (i = 0; i < (sizeof(fsub)/sizeof(FSUB)); ++i)
    924      1.10       mrg 				(void)fprintf(stderr, " %s", fsub[i].name);
    925      1.10       mrg 			(void)fputs("\n\n", stderr);
    926      1.10       mrg 			tar_usage();
    927      1.10       mrg 			break;
    928      1.10       mrg 		case 'I':
    929      1.10       mrg 		case 'O':
    930      1.10       mrg 			/*
    931      1.10       mrg 			 * filename where the archive is stored
    932      1.10       mrg 			 */
    933      1.10       mrg 			if ((optarg[0] == '-') && (optarg[1]== '\0')) {
    934      1.10       mrg 				/*
    935      1.10       mrg 				 * treat a - as stdin
    936      1.10       mrg 				 */
    937      1.10       mrg 				arcname = (char *)0;
    938      1.10       mrg 				break;
    939      1.10       mrg 			}
    940      1.10       mrg 			arcname = optarg;
    941      1.10       mrg 			break;
    942      1.10       mrg 		case 'L':
    943      1.10       mrg 			/*
    944      1.10       mrg 			 * follow symlinks
    945      1.10       mrg 			 */
    946      1.10       mrg 			Lflag = 1;
    947      1.10       mrg 			flg |= CLF;
    948      1.10       mrg 			break;
    949      1.10       mrg #ifdef notyet
    950      1.10       mrg 		case 'M':
    951      1.10       mrg 			arg = optarg;
    952      1.10       mrg 			break;
    953      1.10       mrg 		case 'R':
    954      1.10       mrg 			arg = optarg;
    955      1.10       mrg 			break;
    956      1.10       mrg #endif
    957      1.10       mrg 		case 'S':
    958      1.10       mrg 			cpio_swp_head = 1;
    959      1.10       mrg 			break;
    960      1.10       mrg #ifdef notyet
    961      1.10       mrg 		case 'V':
    962      1.10       mrg 			break;
    963      1.10       mrg #endif
    964      1.10       mrg 		case 'a':
    965      1.10       mrg 			/*
    966      1.10       mrg 			 * preserve access time on filesystem nodes we read
    967      1.10       mrg 			 */
    968      1.10       mrg 			tflag = 1;
    969      1.10       mrg 			flg |= TF;
    970      1.10       mrg 			break;
    971      1.10       mrg #ifdef notyet
    972      1.10       mrg 		case 'b':
    973      1.10       mrg 			break;
    974      1.10       mrg #endif
    975      1.10       mrg 		case 'c':
    976      1.10       mrg 			frmt = &fsub[F_SV4CPIO];
    977      1.10       mrg 			break;
    978      1.10       mrg 		case 'd':
    979      1.10       mrg 			/*
    980      1.10       mrg 			 * pax does this by default ..
    981      1.10       mrg 			 */
    982      1.10       mrg 			flg |= RF;
    983      1.10       mrg 			break;
    984      1.10       mrg 		case 'f':
    985      1.10       mrg 			/*
    986      1.10       mrg 			 * inverse match on patterns
    987      1.10       mrg 			 */
    988      1.10       mrg 			cflag = 1;
    989      1.10       mrg 			flg |= CF;
    990      1.10       mrg 			break;
    991      1.10       mrg 		case 'i':
    992      1.10       mrg 			/*
    993      1.10       mrg 			 * read the archive
    994      1.10       mrg 			 */
    995      1.10       mrg 			flg |= RF;
    996      1.10       mrg 			break;
    997      1.10       mrg #ifdef notyet
    998      1.10       mrg 		case 'k':
    999      1.10       mrg 			break;
   1000      1.10       mrg #endif
   1001      1.10       mrg 		case 'l':
   1002      1.10       mrg 			/*
   1003      1.10       mrg 			 * try to link src to dest with copy (-rw)
   1004      1.10       mrg 			 */
   1005      1.10       mrg 			lflag = 1;
   1006      1.10       mrg 			flg |= LF;
   1007      1.10       mrg 			break;
   1008      1.10       mrg 		case 'm':
   1009      1.10       mrg 			/*
   1010      1.10       mrg 			 * preserve mtime
   1011      1.10       mrg 			 */
   1012      1.10       mrg 			flg |= PF;
   1013      1.10       mrg 			pmtime = 1;
   1014      1.10       mrg 			break;
   1015      1.10       mrg 		case 'o':
   1016      1.10       mrg 			/*
   1017      1.10       mrg 			 * write an archive
   1018      1.10       mrg 			 */
   1019      1.10       mrg 			flg |= WF;
   1020      1.10       mrg 			break;
   1021      1.10       mrg 		case 'p':
   1022      1.10       mrg 			/*
   1023      1.10       mrg 			 * cpio -p is like pax -rw
   1024      1.10       mrg 			 */
   1025      1.10       mrg 			flg |= RF | WF;
   1026      1.10       mrg 			break;
   1027      1.10       mrg 		case 'r':
   1028      1.10       mrg 			/*
   1029      1.10       mrg 			 * interactive file rename
   1030      1.10       mrg 			 */
   1031      1.10       mrg 			iflag = 1;
   1032      1.10       mrg 			flg |= IF;
   1033      1.10       mrg 			break;
   1034      1.10       mrg #ifdef notyet
   1035      1.10       mrg 		case 's':
   1036      1.10       mrg 			break;
   1037      1.10       mrg #endif
   1038      1.10       mrg 		case 't':
   1039      1.10       mrg 			act = LIST;
   1040      1.10       mrg 			break;
   1041      1.10       mrg 		case 'u':
   1042      1.10       mrg 			/*
   1043      1.10       mrg 			 * don't ignore those older files
   1044      1.10       mrg 			 */
   1045      1.10       mrg 			uflag = 0;
   1046      1.10       mrg 			flg |= UF;
   1047      1.10       mrg 			break;
   1048      1.10       mrg 		case 'v':
   1049      1.10       mrg 			/*
   1050      1.10       mrg 			 * verbose operation mode
   1051      1.10       mrg 			 */
   1052      1.10       mrg 			vflag = 1;
   1053      1.10       mrg 			flg |= VF;
   1054      1.10       mrg 			break;
   1055      1.10       mrg 		default:
   1056      1.10       mrg 			cpio_usage();
   1057      1.10       mrg 			break;
   1058      1.10       mrg 		}
   1059      1.10       mrg 	}
   1060      1.10       mrg 
   1061      1.10       mrg 	/*
   1062      1.10       mrg 	 * figure out the operation mode of cpio. check that we have not been
   1063      1.10       mrg 	 * given a bogus set of flags for the operation mode.
   1064      1.10       mrg 	 */
   1065      1.10       mrg 	if (ISLIST(flg)) {
   1066      1.10       mrg 		act = LIST;
   1067      1.10       mrg 		bflg = flg & BDLIST;
   1068      1.10       mrg 	} else if (ISEXTRACT(flg)) {
   1069      1.10       mrg 		act = EXTRACT;
   1070      1.10       mrg 		bflg = flg & BDEXTR;
   1071      1.10       mrg 	} else if (ISARCHIVE(flg)) {
   1072      1.10       mrg 		act = ARCHIVE;
   1073      1.10       mrg 		bflg = flg & BDARCH;
   1074      1.10       mrg 	} else if (ISAPPND(flg)) {
   1075      1.10       mrg 		act = APPND;
   1076      1.10       mrg 		bflg = flg & BDARCH;
   1077      1.10       mrg 	} else if (ISCOPY(flg)) {
   1078      1.10       mrg 		act = COPY;
   1079      1.10       mrg 		bflg = flg & BDCOPY;
   1080      1.10       mrg 	} else
   1081      1.10       mrg 		cpio_usage();
   1082      1.10       mrg 	if (bflg) {
   1083      1.10       mrg 		cpio_usage();
   1084      1.10       mrg 	}
   1085      1.10       mrg 
   1086      1.10       mrg 	/*
   1087      1.10       mrg 	 * if we are writing (ARCHIVE) we use the default format if the user
   1088      1.10       mrg 	 * did not specify a format. when we write during an APPEND, we will
   1089      1.10       mrg 	 * adopt the format of the existing archive if none was supplied.
   1090      1.10       mrg 	 */
   1091      1.10       mrg 	if (!(flg & XF) && (act == ARCHIVE))
   1092      1.10       mrg 		frmt = &(fsub[F_BCPIO]);
   1093      1.10       mrg 
   1094      1.10       mrg 	/*
   1095      1.10       mrg 	 * process the args as they are interpreted by the operation mode
   1096      1.10       mrg 	 */
   1097      1.10       mrg 	switch (act) {
   1098      1.10       mrg 	case LIST:
   1099      1.10       mrg 	case EXTRACT:
   1100      1.10       mrg 		for (; optind < argc; optind++)
   1101  1.22.2.1  wrstuden 			if (pat_add(argv[optind], 0) < 0)
   1102      1.10       mrg 				cpio_usage();
   1103      1.10       mrg 		break;
   1104      1.10       mrg 	case COPY:
   1105      1.10       mrg 		if (optind >= argc) {
   1106      1.10       mrg 			tty_warn(0, "Destination directory was not supplied");
   1107      1.10       mrg 			cpio_usage();
   1108      1.10       mrg 		}
   1109      1.10       mrg 		--argc;
   1110      1.10       mrg 		dirptr = argv[argc];
   1111      1.14   mycroft 		/* FALLTHROUGH */
   1112      1.10       mrg 	case ARCHIVE:
   1113      1.10       mrg 	case APPND:
   1114      1.10       mrg 		for (; optind < argc; optind++)
   1115  1.22.2.1  wrstuden 			if (ftree_add(argv[optind], 0) < 0)
   1116      1.10       mrg 				cpio_usage();
   1117      1.10       mrg 		/*
   1118      1.10       mrg 		 * no read errors allowed on updates/append operation!
   1119      1.10       mrg 		 */
   1120      1.10       mrg 		maxflt = 0;
   1121      1.10       mrg 		break;
   1122      1.10       mrg 	}
   1123       1.1       jtc }
   1124       1.1       jtc 
   1125       1.1       jtc /*
   1126       1.1       jtc  * printflg()
   1127       1.1       jtc  *	print out those invalid flag sets found to the user
   1128       1.1       jtc  */
   1129       1.1       jtc 
   1130       1.1       jtc #if __STDC__
   1131       1.1       jtc static void
   1132       1.1       jtc printflg(unsigned int flg)
   1133       1.1       jtc #else
   1134       1.1       jtc static void
   1135       1.1       jtc printflg(flg)
   1136       1.1       jtc 	unsigned int flg;
   1137       1.1       jtc #endif
   1138       1.1       jtc {
   1139       1.1       jtc 	int nxt;
   1140       1.1       jtc 	int pos = 0;
   1141       1.1       jtc 
   1142       1.1       jtc 	(void)fprintf(stderr,"%s: Invalid combination of options:", argv0);
   1143       1.8  christos 	while ((nxt = ffs(flg)) != 0) {
   1144       1.1       jtc 		flg = flg >> nxt;
   1145       1.1       jtc 		pos += nxt;
   1146       1.1       jtc 		(void)fprintf(stderr, " -%c", flgch[pos-1]);
   1147       1.1       jtc 	}
   1148       1.1       jtc 	(void)putc('\n', stderr);
   1149       1.1       jtc }
   1150       1.1       jtc 
   1151       1.1       jtc /*
   1152       1.1       jtc  * c_frmt()
   1153       1.1       jtc  *	comparison routine used by bsearch to find the format specified
   1154       1.1       jtc  *	by the user
   1155       1.1       jtc  */
   1156       1.1       jtc 
   1157       1.1       jtc #if __STDC__
   1158       1.1       jtc static int
   1159       1.1       jtc c_frmt(const void *a, const void *b)
   1160       1.1       jtc #else
   1161       1.1       jtc static int
   1162       1.1       jtc c_frmt(a, b)
   1163       1.1       jtc         void *a;
   1164       1.1       jtc         void *b;
   1165       1.1       jtc #endif
   1166       1.1       jtc {
   1167       1.1       jtc         return(strcmp(((FSUB *)a)->name, ((FSUB *)b)->name));
   1168       1.1       jtc }
   1169       1.1       jtc 
   1170       1.1       jtc /*
   1171       1.1       jtc  * opt_next()
   1172       1.1       jtc  *	called by format specific options routines to get each format specific
   1173       1.1       jtc  *	flag and value specified with -o
   1174       1.1       jtc  * Return:
   1175       1.1       jtc  *	pointer to next OPLIST entry or NULL (end of list).
   1176       1.1       jtc  */
   1177       1.1       jtc 
   1178       1.1       jtc #if __STDC__
   1179       1.1       jtc OPLIST *
   1180       1.1       jtc opt_next(void)
   1181       1.1       jtc #else
   1182       1.1       jtc OPLIST *
   1183       1.1       jtc opt_next()
   1184       1.1       jtc #endif
   1185       1.1       jtc {
   1186       1.1       jtc 	OPLIST *opt;
   1187       1.1       jtc 
   1188       1.1       jtc 	if ((opt = ophead) != NULL)
   1189       1.1       jtc 		ophead = ophead->fow;
   1190       1.1       jtc 	return(opt);
   1191       1.1       jtc }
   1192       1.1       jtc 
   1193       1.1       jtc /*
   1194       1.1       jtc  * bad_opt()
   1195       1.1       jtc  *	generic routine used to complain about a format specific options
   1196       1.1       jtc  *	when the format does not support options.
   1197       1.1       jtc  */
   1198       1.1       jtc 
   1199       1.1       jtc #if __STDC__
   1200       1.1       jtc int
   1201       1.1       jtc bad_opt(void)
   1202       1.1       jtc #else
   1203       1.1       jtc int
   1204       1.1       jtc bad_opt()
   1205       1.1       jtc #endif
   1206       1.1       jtc {
   1207       1.7       tls 	OPLIST *opt;
   1208       1.1       jtc 
   1209       1.1       jtc 	if (ophead == NULL)
   1210       1.1       jtc 		return(0);
   1211       1.1       jtc 	/*
   1212       1.1       jtc 	 * print all we were given
   1213       1.1       jtc 	 */
   1214       1.8  christos 	tty_warn(1,"These format options are not supported");
   1215       1.1       jtc 	while ((opt = opt_next()) != NULL)
   1216       1.1       jtc 		(void)fprintf(stderr, "\t%s = %s\n", opt->name, opt->value);
   1217       1.1       jtc 	pax_usage();
   1218       1.1       jtc 	return(0);
   1219       1.1       jtc }
   1220       1.1       jtc 
   1221       1.1       jtc /*
   1222       1.1       jtc  * opt_add()
   1223       1.1       jtc  *	breaks the value supplied to -o into a option name and value. options
   1224       1.1       jtc  *	are given to -o in the form -o name-value,name=value
   1225       1.1       jtc  *	mulltiple -o may be specified.
   1226       1.1       jtc  * Return:
   1227       1.1       jtc  *	0 if format in name=value format, -1 if -o is passed junk
   1228       1.1       jtc  */
   1229       1.1       jtc 
   1230       1.1       jtc #if __STDC__
   1231       1.1       jtc int
   1232      1.18        tv opt_add(const char *str)
   1233       1.1       jtc #else
   1234       1.1       jtc int
   1235       1.1       jtc opt_add(str)
   1236      1.18        tv 	const char *str;
   1237       1.1       jtc #endif
   1238       1.1       jtc {
   1239       1.7       tls 	OPLIST *opt;
   1240       1.7       tls 	char *frpt;
   1241       1.7       tls 	char *pt;
   1242       1.7       tls 	char *endpt;
   1243       1.1       jtc 
   1244       1.1       jtc 	if ((str == NULL) || (*str == '\0')) {
   1245       1.8  christos 		tty_warn(0, "Invalid option name");
   1246       1.1       jtc 		return(-1);
   1247       1.1       jtc 	}
   1248      1.18        tv 	frpt = endpt = strdup(str);
   1249       1.1       jtc 
   1250       1.1       jtc 	/*
   1251       1.1       jtc 	 * break into name and values pieces and stuff each one into a
   1252       1.1       jtc 	 * OPLIST structure. When we know the format, the format specific
   1253       1.1       jtc 	 * option function will go through this list
   1254       1.1       jtc 	 */
   1255       1.1       jtc 	while ((frpt != NULL) && (*frpt != '\0')) {
   1256       1.1       jtc 		if ((endpt = strchr(frpt, ',')) != NULL)
   1257       1.1       jtc 			*endpt = '\0';
   1258       1.1       jtc 		if ((pt = strchr(frpt, '=')) == NULL) {
   1259       1.8  christos 			tty_warn(0, "Invalid options format");
   1260       1.1       jtc 			return(-1);
   1261       1.1       jtc 		}
   1262       1.1       jtc 		if ((opt = (OPLIST *)malloc(sizeof(OPLIST))) == NULL) {
   1263       1.8  christos 			tty_warn(0, "Unable to allocate space for option list");
   1264       1.1       jtc 			return(-1);
   1265       1.1       jtc 		}
   1266       1.1       jtc 		*pt++ = '\0';
   1267       1.1       jtc 		opt->name = frpt;
   1268       1.1       jtc 		opt->value = pt;
   1269       1.1       jtc 		opt->fow = NULL;
   1270       1.1       jtc 		if (endpt != NULL)
   1271       1.1       jtc 			frpt = endpt + 1;
   1272       1.1       jtc 		else
   1273       1.1       jtc 			frpt = NULL;
   1274       1.1       jtc 		if (ophead == NULL) {
   1275       1.1       jtc 			optail = ophead = opt;
   1276       1.1       jtc 			continue;
   1277       1.1       jtc 		}
   1278       1.1       jtc 		optail->fow = opt;
   1279       1.1       jtc 		optail = opt;
   1280       1.1       jtc 	}
   1281       1.1       jtc 	return(0);
   1282       1.1       jtc }
   1283       1.1       jtc 
   1284       1.1       jtc /*
   1285       1.1       jtc  * str_offt()
   1286       1.1       jtc  *	Convert an expression of the following forms to an off_t > 0.
   1287       1.1       jtc  * 	1) A positive decimal number.
   1288       1.1       jtc  *	2) A positive decimal number followed by a b (mult by 512).
   1289       1.1       jtc  *	3) A positive decimal number followed by a k (mult by 1024).
   1290       1.1       jtc  *	4) A positive decimal number followed by a m (mult by 512).
   1291       1.1       jtc  *	5) A positive decimal number followed by a w (mult by sizeof int)
   1292       1.1       jtc  *	6) Two or more positive decimal numbers (with/without k,b or w).
   1293       1.1       jtc  *	   seperated by x (also * for backwards compatibility), specifying
   1294       1.1       jtc  *	   the product of the indicated values.
   1295       1.1       jtc  * Return:
   1296       1.1       jtc  *	0 for an error, a positive value o.w.
   1297       1.1       jtc  */
   1298       1.1       jtc 
   1299       1.1       jtc #if __STDC__
   1300       1.1       jtc static off_t
   1301       1.1       jtc str_offt(char *val)
   1302       1.1       jtc #else
   1303       1.1       jtc static off_t
   1304       1.1       jtc str_offt(val)
   1305       1.1       jtc 	char *val;
   1306       1.1       jtc #endif
   1307       1.1       jtc {
   1308       1.1       jtc 	char *expr;
   1309       1.1       jtc 	off_t num, t;
   1310       1.1       jtc 
   1311       1.1       jtc #	ifdef NET2_STAT
   1312       1.1       jtc 	num = strtol(val, &expr, 0);
   1313       1.1       jtc 	if ((num == LONG_MAX) || (num <= 0) || (expr == val))
   1314       1.1       jtc #	else
   1315       1.1       jtc 	num = strtoq(val, &expr, 0);
   1316       1.1       jtc 	if ((num == QUAD_MAX) || (num <= 0) || (expr == val))
   1317       1.1       jtc #	endif
   1318       1.1       jtc 		return(0);
   1319       1.1       jtc 
   1320       1.1       jtc 	switch(*expr) {
   1321       1.1       jtc 	case 'b':
   1322       1.1       jtc 		t = num;
   1323       1.1       jtc 		num *= 512;
   1324       1.1       jtc 		if (t > num)
   1325       1.1       jtc 			return(0);
   1326       1.1       jtc 		++expr;
   1327       1.1       jtc 		break;
   1328       1.1       jtc 	case 'k':
   1329       1.1       jtc 		t = num;
   1330       1.1       jtc 		num *= 1024;
   1331       1.1       jtc 		if (t > num)
   1332       1.1       jtc 			return(0);
   1333       1.1       jtc 		++expr;
   1334       1.1       jtc 		break;
   1335       1.1       jtc 	case 'm':
   1336       1.1       jtc 		t = num;
   1337       1.1       jtc 		num *= 1048576;
   1338       1.1       jtc 		if (t > num)
   1339       1.1       jtc 			return(0);
   1340       1.1       jtc 		++expr;
   1341       1.1       jtc 		break;
   1342       1.1       jtc 	case 'w':
   1343       1.1       jtc 		t = num;
   1344       1.1       jtc 		num *= sizeof(int);
   1345       1.1       jtc 		if (t > num)
   1346       1.1       jtc 			return(0);
   1347       1.1       jtc 		++expr;
   1348       1.1       jtc 		break;
   1349       1.1       jtc 	}
   1350       1.1       jtc 
   1351       1.1       jtc 	switch(*expr) {
   1352       1.1       jtc 		case '\0':
   1353       1.1       jtc 			break;
   1354       1.1       jtc 		case '*':
   1355       1.1       jtc 		case 'x':
   1356       1.1       jtc 			t = num;
   1357       1.1       jtc 			num *= str_offt(expr + 1);
   1358       1.1       jtc 			if (t > num)
   1359       1.1       jtc 				return(0);
   1360       1.1       jtc 			break;
   1361       1.1       jtc 		default:
   1362       1.1       jtc 			return(0);
   1363       1.1       jtc 	}
   1364       1.1       jtc 	return(num);
   1365       1.1       jtc }
   1366       1.1       jtc 
   1367       1.1       jtc /*
   1368       1.1       jtc  * no_op()
   1369       1.1       jtc  *	for those option functions where the archive format has nothing to do.
   1370       1.1       jtc  * Return:
   1371       1.1       jtc  *	0
   1372       1.1       jtc  */
   1373       1.1       jtc 
   1374       1.1       jtc #if __STDC__
   1375       1.1       jtc static int
   1376       1.1       jtc no_op(void)
   1377       1.1       jtc #else
   1378       1.1       jtc static int
   1379       1.1       jtc no_op()
   1380       1.1       jtc #endif
   1381       1.1       jtc {
   1382       1.1       jtc 	return(0);
   1383       1.1       jtc }
   1384       1.1       jtc 
   1385       1.1       jtc /*
   1386       1.1       jtc  * pax_usage()
   1387       1.1       jtc  *	print the usage summary to the user
   1388       1.1       jtc  */
   1389       1.1       jtc 
   1390       1.1       jtc #if __STDC__
   1391       1.1       jtc void
   1392       1.1       jtc pax_usage(void)
   1393       1.1       jtc #else
   1394       1.1       jtc void
   1395       1.1       jtc pax_usage()
   1396       1.1       jtc #endif
   1397       1.1       jtc {
   1398      1.19   mycroft 	(void)fputs("usage: pax [-cdnvz] [-E limit] [-f archive] ", stderr);
   1399       1.1       jtc 	(void)fputs("[-s replstr] ... [-U user] ...", stderr);
   1400       1.1       jtc 	(void)fputs("\n           [-G group] ... ", stderr);
   1401       1.1       jtc 	(void)fputs("[-T [from_date][,to_date]] ... ", stderr);
   1402       1.1       jtc 	(void)fputs("[pattern ...]\n", stderr);
   1403      1.19   mycroft 	(void)fputs("       pax -r [-cdiknuvzDYZ] [-E limit] ", stderr);
   1404       1.1       jtc 	(void)fputs("[-f archive] [-o options] ... \n", stderr);
   1405       1.1       jtc 	(void)fputs("           [-p string] ... [-s replstr] ... ", stderr);
   1406       1.1       jtc 	(void)fputs("[-U user] ... [-G group] ...\n           ", stderr);
   1407       1.1       jtc 	(void)fputs("[-T [from_date][,to_date]] ... ", stderr);
   1408       1.1       jtc 	(void)fputs(" [pattern ...]\n", stderr);
   1409      1.19   mycroft 	(void)fputs("       pax -w [-dituvzHLPX] [-b blocksize] ", stderr);
   1410      1.19   mycroft 	(void)fputs("[[-a] [-f archive]] [-x format] \n", stderr);
   1411      1.19   mycroft 	(void)fputs("           [-B bytes] [-o options] ... ", stderr);
   1412      1.19   mycroft 	(void)fputs("[-s replstr] ... [-U user] ...", stderr);
   1413       1.1       jtc 	(void)fputs("\n           [-G group] ... ", stderr);
   1414       1.1       jtc 	(void)fputs("[-T [from_date][,to_date][/[c][m]]] ... ", stderr);
   1415       1.1       jtc 	(void)fputs("[file ...]\n", stderr);
   1416      1.19   mycroft 	(void)fputs("       pax -r -w [-diklntuvzDHLPXYZ] ", stderr);
   1417       1.1       jtc 	(void)fputs("[-p string] ... [-s replstr] ...", stderr);
   1418       1.1       jtc 	(void)fputs("\n           [-U user] ... [-G group] ... ", stderr);
   1419       1.1       jtc 	(void)fputs("[-T [from_date][,to_date][/[c][m]]] ... ", stderr);
   1420       1.1       jtc 	(void)fputs("\n           [file ...] directory\n", stderr);
   1421       1.1       jtc 	exit(1);
   1422      1.12   mycroft 	/* NOTREACHED */
   1423       1.1       jtc }
   1424       1.1       jtc 
   1425       1.1       jtc /*
   1426       1.1       jtc  * tar_usage()
   1427       1.1       jtc  *	print the usage summary to the user
   1428       1.1       jtc  */
   1429       1.1       jtc 
   1430       1.1       jtc #if __STDC__
   1431       1.1       jtc void
   1432       1.1       jtc tar_usage(void)
   1433       1.1       jtc #else
   1434       1.1       jtc void
   1435       1.1       jtc tar_usage()
   1436       1.1       jtc #endif
   1437       1.1       jtc {
   1438      1.22      tron 	(void)fputs("usage: tar -{txru}[cevfbhlmopwBLPX014578] [tapefile] ",
   1439       1.1       jtc 		 stderr);
   1440      1.15       mrg 	(void)fputs("[blocksize] [exclude-file] file1 file2...\n", stderr);
   1441       1.1       jtc 	exit(1);
   1442      1.12   mycroft 	/* NOTREACHED */
   1443       1.1       jtc }
   1444       1.1       jtc 
   1445       1.1       jtc /*
   1446       1.1       jtc  * cpio_usage()
   1447       1.1       jtc  *	print the usage summary to the user
   1448       1.1       jtc  */
   1449       1.1       jtc 
   1450       1.1       jtc #if __STDC__
   1451       1.1       jtc void
   1452       1.1       jtc cpio_usage(void)
   1453       1.1       jtc #else
   1454       1.1       jtc void
   1455       1.1       jtc cpio_usage()
   1456       1.1       jtc #endif
   1457       1.1       jtc {
   1458      1.10       mrg 
   1459      1.10       mrg #if 1
   1460      1.10       mrg 	(void)fputs(
   1461      1.10       mrg 	    "usage: cpio -i [-BcdfmrStuv] [ -C blksize ] [ -H header ]\n",
   1462      1.10       mrg 	    stderr);
   1463      1.10       mrg 	(void)fputs("  [ -I file ] [ pattern ... ]\n", stderr);
   1464      1.10       mrg 	(void)fputs("usage: cpio -o [-aABcLv] [ -C bufsize ] [ -H header ]\n",
   1465      1.10       mrg 	    stderr);
   1466      1.10       mrg 	(void)fputs("  [ -O file ]\n", stderr);
   1467      1.10       mrg 	(void)fputs("usage: cpio -p [ adlLmuv ] directory\n", stderr);
   1468      1.10       mrg #else
   1469      1.10       mrg 	/* no E, M, R, V, b, k or s */
   1470      1.10       mrg 	(void)fputs("usage: cpio -i [-bBcdfkmrsStuvV] [ -C bufsize ]\n", stderr);
   1471      1.10       mrg 	(void)fputs("  [ -E file ] [ -H header ] [ -I file [ -M message ] ]\n",
   1472      1.10       mrg 	    stderr);
   1473      1.10       mrg 	(void)fputs("  [ -R id ] [ pattern ... ]\n", stderr);
   1474      1.10       mrg 	(void)fputs("usage: cpio -o [-aABcLvV] [ -C bufsize ] [ -H header ]\n",
   1475      1.10       mrg 	    stderr);
   1476      1.10       mrg 	(void)fputs("  [ -O file [ -M message ] ]\n", stderr);
   1477      1.10       mrg 	(void)fputs("usage: cpio -p [ adlLmuvV ] [ -R id ] directory\n", stderr);
   1478      1.10       mrg #endif
   1479       1.1       jtc 	exit(1);
   1480      1.12   mycroft 	/* NOTREACHED */
   1481  1.22.2.1  wrstuden }
   1482  1.22.2.1  wrstuden 
   1483  1.22.2.1  wrstuden /*
   1484  1.22.2.1  wrstuden  * opt_chdir
   1485  1.22.2.1  wrstuden  *	call ftree_add or pat_add, depending on archive type.
   1486  1.22.2.1  wrstuden  *
   1487  1.22.2.1  wrstuden  * Returns: -1 for listing, else what ftree_add or pat_add returned.
   1488  1.22.2.1  wrstuden  */
   1489  1.22.2.1  wrstuden 
   1490  1.22.2.1  wrstuden #ifdef __STDC__
   1491  1.22.2.1  wrstuden int
   1492  1.22.2.1  wrstuden opt_chdir(char *name)
   1493  1.22.2.1  wrstuden #else
   1494  1.22.2.1  wrstuden int
   1495  1.22.2.1  wrstuden opt_chdir(name)
   1496  1.22.2.1  wrstuden 	char *name;
   1497  1.22.2.1  wrstuden #endif
   1498  1.22.2.1  wrstuden {
   1499  1.22.2.1  wrstuden 	switch (act) {
   1500  1.22.2.1  wrstuden 	default:
   1501  1.22.2.1  wrstuden 		return (-1);
   1502  1.22.2.1  wrstuden 		break;
   1503  1.22.2.1  wrstuden 	case ARCHIVE:
   1504  1.22.2.1  wrstuden 	case APPND:
   1505  1.22.2.1  wrstuden 		return (ftree_add(name, 1));
   1506  1.22.2.1  wrstuden 		break;
   1507  1.22.2.1  wrstuden 	case EXTRACT:
   1508  1.22.2.1  wrstuden 		return (pat_add(name, 1));
   1509  1.22.2.1  wrstuden 		break;
   1510  1.22.2.1  wrstuden 	}
   1511  1.22.2.1  wrstuden }
   1512  1.22.2.1  wrstuden 
   1513  1.22.2.1  wrstuden /*
   1514  1.22.2.1  wrstuden  * checkpositionalminusC(argvp, addfunc)
   1515  1.22.2.1  wrstuden  */
   1516  1.22.2.1  wrstuden 
   1517  1.22.2.1  wrstuden #ifdef __STDC__
   1518  1.22.2.1  wrstuden void
   1519  1.22.2.1  wrstuden checkpositionalminusC(char ***argvp, int (*addfunc)(char *, int))
   1520  1.22.2.1  wrstuden #else
   1521  1.22.2.1  wrstuden void
   1522  1.22.2.1  wrstuden checkpositionalminusC(argvp, addfunc)
   1523  1.22.2.1  wrstuden 	char ***argvp;
   1524  1.22.2.1  wrstuden 	int (*addfunc)();
   1525  1.22.2.1  wrstuden #endif
   1526  1.22.2.1  wrstuden {
   1527  1.22.2.1  wrstuden 	while (**argvp != (char *)NULL) {
   1528  1.22.2.1  wrstuden 		if (!strcmp(**argvp, "-C")) {
   1529  1.22.2.1  wrstuden 			/* XXX should be allow for positional -C/dir, too? */
   1530  1.22.2.1  wrstuden 			if ((*addfunc)(*++*argvp, 1) < 0) {
   1531  1.22.2.1  wrstuden 				tar_usage();
   1532  1.22.2.1  wrstuden 			}
   1533  1.22.2.1  wrstuden 			++*argvp;
   1534  1.22.2.1  wrstuden 			continue;
   1535  1.22.2.1  wrstuden 		}
   1536  1.22.2.1  wrstuden 		if ((*addfunc)(*(*argvp)++, 0) < 0)
   1537  1.22.2.1  wrstuden 			tar_usage();
   1538  1.22.2.1  wrstuden 	}
   1539       1.1       jtc }
   1540