1: /*-
2: * Copyright (c) 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Hugh Smith at The University of Guelph.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by the University of
19: * California, Berkeley and its contributors.
20: * 4. Neither the name of the University nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: */
36:
37: #if defined(DOSCCS) && !defined(lint)
38: static char sccsid[] = "@(#)extract.c 5.5 (Berkeley) 3/12/91";
39: #endif
40:
41: #include <sys/param.h>
42: #include <sys/time.h>
43: #include <sys/stat.h>
44: #include <fcntl.h>
45: #include <errno.h>
46: #include <sys/dir.h>
47: #include <stdio.h>
48: #include <string.h>
49: #include "archive.h"
50: #include "extern.h"
51:
52: extern int errno;
53: extern CHDR chdr; /* converted header */
54: extern char *archive; /* archive name */
55:
56: /*
57: * extract --
58: * Extract files from the named archive - if member names given only
59: * extract those members otherwise extract all members. If 'o' option
60: * selected modify date of newly created file to be same as archive
61: * members date otherwise date is time of extraction. Does not modify
62: * archive.
63: */
64: (argv)
65: char **argv;
66: {
67: register int afd, all, tfd;
68: struct timeval tv[2];
69: struct stat sb;
70: CF cf;
71: char *file;
72:
73: tv[0].tv_usec = tv[1].tv_usec = 0;
74:
75: afd = open_archive(O_RDONLY);
76:
77: /* Read from an archive, write to disk; pad on read. */
78: SETCF(afd, archive, 0, 0, RPAD);
79: for (all = !*argv; get_arobj(afd);) {
80: if (all)
81: file = chdr.name;
82: else if (!(file = files(argv))) {
83: skip_arobj(afd);
84: continue;
85: }
86:
87: if (options & AR_U && !stat(file, &sb) &&
88: sb.st_mtime > chdr.date)
89: continue;
90:
91: if ((tfd = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0200)) < 0) {
92: (void)fprintf(stderr, "ar: %s: %s.\n",
93: file, strerror(errno));
94: skip_arobj(afd);
95: continue;
96: }
97:
98: if (options & AR_V)
99: (void)printf("x - %s\n", file);
100:
101: cf.wfd = tfd;
102: cf.wname = file;
103: copy_ar(&cf, chdr.size);
104:
105: if (fchmod(tfd, (short)chdr.mode)) {
106: (void)fprintf(stderr, "ar: %s: chmod: %s\n",
107: file, strerror(errno));
108: }
109: if (options & AR_O) {
110: tv[0].tv_sec = tv[1].tv_sec = chdr.date;
111: if (utimes(file, tv)) {
112: (void)fprintf(stderr, "ar: %s: utimes: %s\n",
113: file, strerror(errno));
114: }
115: }
116: (void)close(tfd);
117: if (!all && !*argv)
118: break;
119: }
120: close_archive(afd);
121:
122: if (*argv) {
123: orphans(argv);
124: return(1);
125: }
126: return(0);
127: }
Defined functions
defined in line
64; used 2 times
Defined variables