2 * Copyright (c) 1990, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Hugh Smith at The University of Guelph.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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.
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
36 * @(#)replace.c 8.3 (Berkeley) 4/2/94
38 * $DragonFly: src/usr.bin/ar/Attic/replace.c,v 1.4 2005/01/13 18:57:56 okumoto Exp $
41 #include <sys/param.h>
57 * Replace or add named members to archive. Entries already in the
58 * archive are swapped in place. Others are added before or after
59 * the key entry, based on the a, b and i options. If the u option
60 * is specified, modification dates select for replacement.
66 int afd
, curfd
, errflg
, exists
, mods
, sfd
, tfd1
, tfd2
;
73 * If doesn't exist, simply append to the archive. There's
74 * a race here, but it's pretty short, and not worth fixing.
76 exists
= !stat(archive
, &sb
);
77 afd
= open_archive(O_CREAT
|O_RDWR
);
85 tfd1
= tmp(); /* Files before key file. */
86 tfd2
= tmp(); /* Files after key file. */
89 * Break archive into two parts -- entries before and after the key
90 * entry. If positioning before the key, place the key at the
91 * beginning of the after key entries and if positioning after the
92 * key, place the key at the end of the before key entries. Put it
93 * all back together at the end.
95 mods
= (options
& (AR_A
|AR_B
));
96 for (curfd
= tfd1
; get_arobj(afd
);) {
97 if (*argv
&& (file
= files(argv
))) {
98 if ((sfd
= open(file
, O_RDONLY
)) < 0) {
104 if (options
& AR_U
&& sb
.st_mtime
<= chdr
.date
) {
110 printf("r - %s\n", file
);
112 /* Read from disk, write to an archive; pad on write */
113 SETCF(sfd
, file
, curfd
, tname
, WPAD
);
120 if (mods
&& compare(posname
)) {
124 /* Read and write to an archive; pad on both. */
125 SETCF(afd
, archive
, curfd
, tname
, RPAD
|WPAD
);
126 put_arobj(&cf
, (struct stat
*)NULL
);
130 /* Read and write to an archive; pad on both. */
131 useold
: SETCF(afd
, archive
, curfd
, tname
, RPAD
|WPAD
);
132 put_arobj(&cf
, (struct stat
*)NULL
);
137 warnx("%s: archive member not found", posarg
);
142 /* Append any left-over arguments to the end of the after file. */
143 append
: while ( (file
= *argv
++) ) {
145 printf("a - %s\n", file
);
146 if ((sfd
= open(file
, O_RDONLY
)) < 0) {
152 /* Read from disk, write to an archive; pad on write. */
154 options
& (AR_A
|AR_B
) ? tfd1
: tfd2
, tname
, WPAD
);
159 lseek(afd
, (off_t
)SARMAG
, SEEK_SET
);
161 SETCF(tfd1
, tname
, afd
, archive
, NOPAD
);
163 tsize
= size
= lseek(tfd1
, (off_t
)0, SEEK_CUR
);
164 lseek(tfd1
, (off_t
)0, SEEK_SET
);
169 tsize
+= size
= lseek(tfd2
, (off_t
)0, SEEK_CUR
);
170 lseek(tfd2
, (off_t
)0, SEEK_SET
);
174 ftruncate(afd
, tsize
+ SARMAG
);