|
|
1.1 root 1: /* $Source: /src386/usr/bin/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 ([email protected])
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 93/01/14 10:02:28 bin
34: * vlad: fixed problem with restoring permissions.
35: *
36: * Revision 1.1 92/08/28 08:01:59 bin
37: * Initial revision
38: *
39: * Revision 1.1 89/02/14 16:47:46 jep
40: * Initial revision
41: *
42: * Revision 1.1 88/12/23 18:02:05 mark
43: * Initial revision
44: *
45: */
46:
47: #ifndef lint
48: static char *ident = "$Id: cpio.c,v 1.2 93/01/14 10:02:28 bin Exp Locker: bin $";
49: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
50: #endif /* ! lint */
51:
52:
53: /* Headers */
54:
55: #include "pax.h"
56:
57:
58: /* Function Prototypes */
59:
60: #if __STDC__
61: static void usage(void);
62: #else /* !__STDC__ */
63: static void usage();
64: #endif /* __STDC__ */
65:
66:
67: /* do_cpio - handle cpio format archives
68: *
69: * DESCRIPTION
70: *
71: * Do_cpio provides a standard CPIO interface to the PAX program. All
72: * of the standard cpio flags are available, and the behavior of the
73: * program mimics traditonal cpio.
74: *
75: * PARAMETERS
76: *
77: * int argc - command line argument count
78: * char **argv - pointer to command line arguments
79: *
80: * RETURNS
81: *
82: * Nothing.
83: */
84:
85: #if __STDC__
86:
87: int do_cpio(int argc, char **argv)
88:
89: #else
90:
91: int do_cpio(argc, argv)
92: int argc;
93: char **argv;
94:
95: #endif
96: {
97: int c;
98: char *dirname;
99: Stat st;
100:
101: /* default input/output file for CPIO is STDIN/STDOUT */
102: ar_file = "-";
103: names_from_stdin = 1;
104:
105: /* set up the flags to reflect the default CPIO inteface. */
106: blocksize = BLOCKSIZE;
107: ar_interface = CPIO;
108: ar_format = CPIO;
109: msgfile=stderr;
110:
111: while ((c = getopt(argc, argv, "D:Bacdfilmoprtuv")) != EOF) {
112: switch (c) {
113: case 'i':
114: f_extract = 1;
115: f_owner = 1; /* VLAD */
116: break;
117: case 'o':
118: f_create = 1;
119: f_owner = 1; /* VLAD */
120: break;
121: case 'p':
122: f_pass = 1;
123: dirname = argv[--argc];
124: f_owner = 1; /* VLAD */
125:
126: /* check to make sure that the argument is a directory */
127: if (LSTAT(dirname, &st) < 0) {
128: fatal(strerror());
129: }
130: if ((st.sb_mode & S_IFMT) != S_IFDIR) {
131: fatal("Not a directory");
132: }
133: break;
134: case 'B':
135: blocksize = BLOCK;
136: break;
137: case 'a':
138: f_access_time = 1;
139: break;
140: case 'c':
141: break;
142: case 'D':
143: ar_file = optarg;
144: break;
145: case 'd':
146: f_dir_create = 1;
147: break;
148: case 'f':
149: f_reverse_match = 1;
150: break;
151: case 'l':
152: f_link = 1;
153: break;
154: case 'm':
155: f_mtime = 1;
156: break;
157: case 'r':
158: f_interactive = 1;
159: break;
160: case 't':
161: f_list = 1;
162: break;
163: case 'u':
164: f_unconditional = 1;
165: break;
166: case 'v':
167: f_verbose = 1;
168: break;
169: default:
170: usage();
171: }
172: }
173:
174: if (f_create + f_pass + f_extract != 1) {
175: usage();
176: }
177: if (!f_pass) {
178: buf_allocate((OFFSET) blocksize);
179: }
180: if (f_extract) {
181: open_archive(AR_READ); /* Open for reading */
182: read_archive();
183: } else if (f_create) {
184: open_archive(AR_WRITE);
185: create_archive();
186: } else if (f_pass) {
187: pass(dirname);
188: }
189:
190: /* print out the total block count transfered */
191: fprintf(stderr, "%ld Blocks\n", ROUNDUP(total, BLOCKSIZE) / BLOCKSIZE);
192:
193: exit(0);
194: /* NOTREACHED */
195: }
196:
197:
198: /* usage - print a helpful message and exit
199: *
200: * DESCRIPTION
201: *
202: * Usage prints out the usage message for the CPIO interface and then
203: * exits with a non-zero termination status. This is used when a user
204: * has provided non-existant or incompatible command line arguments.
205: *
206: * RETURNS
207: *
208: * Returns an exit status of 1 to the parent process.
209: *
210: */
211:
212: #if __STDC__
213:
214: static void usage(void)
215:
216: #else
217:
218: static void usage()
219:
220: #endif
221: {
222: fprintf(stderr, "Usage: %s -o[Bacv]\n", myname);
223: fprintf(stderr, " %s -i[Bcdmrtuvf] [pattern...]\n", myname);
224: fprintf(stderr, " %s -p[adlmruv] directory\n", myname);
225: exit(1);
226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.