xref: /plan9/sys/src/ape/cmd/pax/cpio.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier /* $Source: /u/mark/src/pax/RCS/cpio.c,v $
2*9a747e4fSDavid du Colombier  *
3*9a747e4fSDavid du Colombier  * $Revision: 1.2 $
4*9a747e4fSDavid du Colombier  *
5*9a747e4fSDavid du Colombier  * cpio.c - Cpio specific functions for archive handling
6*9a747e4fSDavid du Colombier  *
7*9a747e4fSDavid du Colombier  * DESCRIPTION
8*9a747e4fSDavid du Colombier  *
9*9a747e4fSDavid du Colombier  *	These function provide a cpio conformant interface to the pax
10*9a747e4fSDavid du Colombier  *	program.
11*9a747e4fSDavid du Colombier  *
12*9a747e4fSDavid du Colombier  * AUTHOR
13*9a747e4fSDavid du Colombier  *
14*9a747e4fSDavid du Colombier  *     Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
15*9a747e4fSDavid du Colombier  *
16*9a747e4fSDavid du Colombier  * Sponsored by The USENIX Association for public distribution.
17*9a747e4fSDavid du Colombier  *
18*9a747e4fSDavid du Colombier  * Copyright (c) 1989 Mark H. Colburn.
19*9a747e4fSDavid du Colombier  * All rights reserved.
20*9a747e4fSDavid du Colombier  *
21*9a747e4fSDavid du Colombier  * Redistribution and use in source and binary forms are permitted
22*9a747e4fSDavid du Colombier  * provided that the above copyright notice is duplicated in all such
23*9a747e4fSDavid du Colombier  * forms and that any documentation, advertising materials, and other
24*9a747e4fSDavid du Colombier  * materials related to such distribution and use acknowledge that the
25*9a747e4fSDavid du Colombier  * software was developed * by Mark H. Colburn and sponsored by The
26*9a747e4fSDavid du Colombier  * USENIX Association.
27*9a747e4fSDavid du Colombier  *
28*9a747e4fSDavid du Colombier  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29*9a747e4fSDavid du Colombier  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30*9a747e4fSDavid du Colombier  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31*9a747e4fSDavid du Colombier  *
32*9a747e4fSDavid du Colombier  * $Log:	cpio.c,v $
33*9a747e4fSDavid du Colombier  * Revision 1.2  89/02/12  10:04:13  mark
34*9a747e4fSDavid du Colombier  * 1.2 release fixes
35*9a747e4fSDavid du Colombier  *
36*9a747e4fSDavid du Colombier  * Revision 1.1  88/12/23  18:02:05  mark
37*9a747e4fSDavid du Colombier  * Initial revision
38*9a747e4fSDavid du Colombier  *
39*9a747e4fSDavid du Colombier  */
40*9a747e4fSDavid du Colombier 
41*9a747e4fSDavid du Colombier #ifndef lint
42*9a747e4fSDavid du Colombier static char *ident = "$Id: cpio.c,v 1.2 89/02/12 10:04:13 mark Exp $";
43*9a747e4fSDavid du Colombier static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
44*9a747e4fSDavid du Colombier #endif /* ! lint */
45*9a747e4fSDavid du Colombier 
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier /* Headers */
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier #include "pax.h"
50*9a747e4fSDavid du Colombier 
51*9a747e4fSDavid du Colombier 
52*9a747e4fSDavid du Colombier /* Function Prototypes */
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier #ifdef __STDC__
55*9a747e4fSDavid du Colombier static void 	usage(void);
56*9a747e4fSDavid du Colombier #else /* !__STDC__ */
57*9a747e4fSDavid du Colombier static void 	usage();
58*9a747e4fSDavid du Colombier #endif /* __STDC__ */
59*9a747e4fSDavid du Colombier 
60*9a747e4fSDavid du Colombier 
61*9a747e4fSDavid du Colombier /* do_cpio - handle cpio format archives
62*9a747e4fSDavid du Colombier  *
63*9a747e4fSDavid du Colombier  * DESCRIPTION
64*9a747e4fSDavid du Colombier  *
65*9a747e4fSDavid du Colombier  *	Do_cpio provides a standard CPIO interface to the PAX program.  All
66*9a747e4fSDavid du Colombier  *	of the standard cpio flags are available, and the behavior of the
67*9a747e4fSDavid du Colombier  *	program mimics traditonal cpio.
68*9a747e4fSDavid du Colombier  *
69*9a747e4fSDavid du Colombier  * PARAMETERS
70*9a747e4fSDavid du Colombier  *
71*9a747e4fSDavid du Colombier  *	int	argc	- command line argument count
72*9a747e4fSDavid du Colombier  *	char	**argv	- pointer to command line arguments
73*9a747e4fSDavid du Colombier  *
74*9a747e4fSDavid du Colombier  * RETURNS
75*9a747e4fSDavid du Colombier  *
76*9a747e4fSDavid du Colombier  *	Nothing.
77*9a747e4fSDavid du Colombier  */
78*9a747e4fSDavid du Colombier 
79*9a747e4fSDavid du Colombier #ifdef __STDC__
80*9a747e4fSDavid du Colombier 
do_cpio(int argc,char ** argv)81*9a747e4fSDavid du Colombier int do_cpio(int argc, char **argv)
82*9a747e4fSDavid du Colombier 
83*9a747e4fSDavid du Colombier #else
84*9a747e4fSDavid du Colombier 
85*9a747e4fSDavid du Colombier int do_cpio(argc, argv)
86*9a747e4fSDavid du Colombier int             argc;
87*9a747e4fSDavid du Colombier char          **argv;
88*9a747e4fSDavid du Colombier 
89*9a747e4fSDavid du Colombier #endif
90*9a747e4fSDavid du Colombier {
91*9a747e4fSDavid du Colombier     int             c;
92*9a747e4fSDavid du Colombier     char           *dirname;
93*9a747e4fSDavid du Colombier     Stat            st;
94*9a747e4fSDavid du Colombier 
95*9a747e4fSDavid du Colombier     /* default input/output file for CPIO is STDIN/STDOUT */
96*9a747e4fSDavid du Colombier     ar_file = "-";
97*9a747e4fSDavid du Colombier     names_from_stdin = 1;
98*9a747e4fSDavid du Colombier 
99*9a747e4fSDavid du Colombier     /* set up the flags to reflect the default CPIO inteface. */
100*9a747e4fSDavid du Colombier     blocksize = BLOCKSIZE;
101*9a747e4fSDavid du Colombier     ar_interface = CPIO;
102*9a747e4fSDavid du Colombier     ar_format = CPIO;
103*9a747e4fSDavid du Colombier     msgfile=stderr;
104*9a747e4fSDavid du Colombier 
105*9a747e4fSDavid du Colombier     while ((c = getopt(argc, argv, "D:Bacdfilmoprtuv")) != EOF) {
106*9a747e4fSDavid du Colombier 	switch (c) {
107*9a747e4fSDavid du Colombier 	case 'i':
108*9a747e4fSDavid du Colombier 	    f_extract = 1;
109*9a747e4fSDavid du Colombier 	    break;
110*9a747e4fSDavid du Colombier 	case 'o':
111*9a747e4fSDavid du Colombier 	    f_create = 1;
112*9a747e4fSDavid du Colombier 	    break;
113*9a747e4fSDavid du Colombier 	case 'p':
114*9a747e4fSDavid du Colombier 	    f_pass = 1;
115*9a747e4fSDavid du Colombier 	    dirname = argv[--argc];
116*9a747e4fSDavid du Colombier 
117*9a747e4fSDavid du Colombier 	    /* check to make sure that the argument is a directory */
118*9a747e4fSDavid du Colombier 	    if (LSTAT(dirname, &st) < 0) {
119*9a747e4fSDavid du Colombier 		fatal(strerror());
120*9a747e4fSDavid du Colombier 	    }
121*9a747e4fSDavid du Colombier 	    if ((st.sb_mode & S_IFMT) != S_IFDIR) {
122*9a747e4fSDavid du Colombier 		fatal("Not a directory");
123*9a747e4fSDavid du Colombier 	    }
124*9a747e4fSDavid du Colombier 	    break;
125*9a747e4fSDavid du Colombier 	case 'B':
126*9a747e4fSDavid du Colombier 	    blocksize = BLOCK;
127*9a747e4fSDavid du Colombier 	    break;
128*9a747e4fSDavid du Colombier 	case 'a':
129*9a747e4fSDavid du Colombier 	    f_access_time = 1;
130*9a747e4fSDavid du Colombier 	    break;
131*9a747e4fSDavid du Colombier 	case 'c':
132*9a747e4fSDavid du Colombier 	    break;
133*9a747e4fSDavid du Colombier 	case 'D':
134*9a747e4fSDavid du Colombier 	    ar_file = optarg;
135*9a747e4fSDavid du Colombier 	    break;
136*9a747e4fSDavid du Colombier 	case 'd':
137*9a747e4fSDavid du Colombier 	    f_dir_create = 1;
138*9a747e4fSDavid du Colombier 	    break;
139*9a747e4fSDavid du Colombier 	case 'f':
140*9a747e4fSDavid du Colombier 	    f_reverse_match = 1;
141*9a747e4fSDavid du Colombier 	    break;
142*9a747e4fSDavid du Colombier 	case 'l':
143*9a747e4fSDavid du Colombier 	    f_link = 1;
144*9a747e4fSDavid du Colombier 	    break;
145*9a747e4fSDavid du Colombier 	case 'm':
146*9a747e4fSDavid du Colombier 	    f_mtime = 1;
147*9a747e4fSDavid du Colombier 	    break;
148*9a747e4fSDavid du Colombier 	case 'r':
149*9a747e4fSDavid du Colombier 	    f_interactive = 1;
150*9a747e4fSDavid du Colombier 	    break;
151*9a747e4fSDavid du Colombier 	case 't':
152*9a747e4fSDavid du Colombier 	    f_list = 1;
153*9a747e4fSDavid du Colombier 	    break;
154*9a747e4fSDavid du Colombier 	case 'u':
155*9a747e4fSDavid du Colombier 	    f_unconditional = 1;
156*9a747e4fSDavid du Colombier 	    break;
157*9a747e4fSDavid du Colombier 	case 'v':
158*9a747e4fSDavid du Colombier 	    f_verbose = 1;
159*9a747e4fSDavid du Colombier 	    break;
160*9a747e4fSDavid du Colombier 	default:
161*9a747e4fSDavid du Colombier 	    usage();
162*9a747e4fSDavid du Colombier 	}
163*9a747e4fSDavid du Colombier     }
164*9a747e4fSDavid du Colombier 
165*9a747e4fSDavid du Colombier     if (f_create + f_pass + f_extract != 1) {
166*9a747e4fSDavid du Colombier 	usage();
167*9a747e4fSDavid du Colombier     }
168*9a747e4fSDavid du Colombier     if (!f_pass) {
169*9a747e4fSDavid du Colombier 	buf_allocate((OFFSET) blocksize);
170*9a747e4fSDavid du Colombier     }
171*9a747e4fSDavid du Colombier     if (f_extract) {
172*9a747e4fSDavid du Colombier 	open_archive(AR_READ);	/* Open for reading */
173*9a747e4fSDavid du Colombier 	read_archive();
174*9a747e4fSDavid du Colombier     } else if (f_create) {
175*9a747e4fSDavid du Colombier 	open_archive(AR_WRITE);
176*9a747e4fSDavid du Colombier 	create_archive();
177*9a747e4fSDavid du Colombier     } else if (f_pass) {
178*9a747e4fSDavid du Colombier 	pass(dirname);
179*9a747e4fSDavid du Colombier     }
180*9a747e4fSDavid du Colombier 
181*9a747e4fSDavid du Colombier     /* print out the total block count transfered */
182*9a747e4fSDavid du Colombier     fprintf(stderr, "%ld Blocks\n", ROUNDUP(total, BLOCKSIZE) / BLOCKSIZE);
183*9a747e4fSDavid du Colombier 
184*9a747e4fSDavid du Colombier     exit(0);
185*9a747e4fSDavid du Colombier     /* NOTREACHED */
186*9a747e4fSDavid du Colombier }
187*9a747e4fSDavid du Colombier 
188*9a747e4fSDavid du Colombier 
189*9a747e4fSDavid du Colombier /* usage - print a helpful message and exit
190*9a747e4fSDavid du Colombier  *
191*9a747e4fSDavid du Colombier  * DESCRIPTION
192*9a747e4fSDavid du Colombier  *
193*9a747e4fSDavid du Colombier  *	Usage prints out the usage message for the CPIO interface and then
194*9a747e4fSDavid du Colombier  *	exits with a non-zero termination status.  This is used when a user
195*9a747e4fSDavid du Colombier  *	has provided non-existant or incompatible command line arguments.
196*9a747e4fSDavid du Colombier  *
197*9a747e4fSDavid du Colombier  * RETURNS
198*9a747e4fSDavid du Colombier  *
199*9a747e4fSDavid du Colombier  *	Returns an exit status of 1 to the parent process.
200*9a747e4fSDavid du Colombier  *
201*9a747e4fSDavid du Colombier  */
202*9a747e4fSDavid du Colombier 
203*9a747e4fSDavid du Colombier #ifdef __STDC__
204*9a747e4fSDavid du Colombier 
usage(void)205*9a747e4fSDavid du Colombier static void usage(void)
206*9a747e4fSDavid du Colombier 
207*9a747e4fSDavid du Colombier #else
208*9a747e4fSDavid du Colombier 
209*9a747e4fSDavid du Colombier static void usage()
210*9a747e4fSDavid du Colombier 
211*9a747e4fSDavid du Colombier #endif
212*9a747e4fSDavid du Colombier {
213*9a747e4fSDavid du Colombier     fprintf(stderr, "Usage: %s -o[Bacv]\n", myname);
214*9a747e4fSDavid du Colombier     fprintf(stderr, "       %s -i[Bcdmrtuvf] [pattern...]\n", myname);
215*9a747e4fSDavid du Colombier     fprintf(stderr, "       %s -p[adlmruv] directory\n", myname);
216*9a747e4fSDavid du Colombier     exit(1);
217*9a747e4fSDavid du Colombier }
218