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