* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Hugh Smith at The University of Guelph.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)replace.c 5.8 (Berkeley) %G%";
extern CHDR chdr
; /* converted header */
extern char *archive
; /* archive name */
extern char *tname
; /* temporary file "name" */
* Replace or add named members to archive. Entries already in the
* archive are swapped in place. Others are added before or after
* the key entry, based on the a, b and i options. If the u option
* is specified, modification dates select for replacement.
extern char *posarg
, *posname
; /* positioning file name */
register int afd
, curfd
, mods
, sfd
;
int err
, exists
, tfd1
, tfd2
;
* If doesn't exist, simply append to the archive. There's
* a race here, but it's pretty short, and not worth fixing.
exists
= !stat(archive
, &sb
);
afd
= open_archive(O_CREAT
|O_RDWR
);
tfd1
= tmp(); /* Files before key file. */
tfd2
= tmp(); /* Files after key file. */
* Break archive into two parts -- entries before and after the key
* entry. If positioning before the key, place the key at the
* beginning of the after key entries and if positioning after the
* key, place the key at the end of the before key entries. Put it
* all back together at the end.
mods
= (options
& (AR_A
|AR_B
));
for (curfd
= tfd1
; get_arobj(afd
);) {
if (*argv
&& (file
= files(argv
))) {
if ((sfd
= open(file
, O_RDONLY
)) < 0) {
(void)fprintf(stderr
, "ar: %s: %s.\n",
if (options
& AR_U
&& sb
.st_mtime
<= chdr
.date
)
(void)printf("r - %s\n", file
);
/* Read from disk, write to an archive; pad on write */
SETCF(sfd
, file
, curfd
, tname
, WPAD
);
if (mods
&& compare(posname
)) {
/* Read and write to an archive; pad on both. */
SETCF(afd
, archive
, curfd
, tname
, RPAD
|WPAD
);
put_arobj(&cf
, (struct stat
*)NULL
);
/* Read and write to an archive; pad on both. */
useold
: SETCF(afd
, archive
, curfd
, tname
, RPAD
|WPAD
);
put_arobj(&cf
, (struct stat
*)NULL
);
(void)fprintf(stderr
, "ar: %s: archive member not found.\n",
/* Append any left-over arguments to the end of the after file. */
append
: while (file
= *argv
++) {
(void)printf("a - %s\n", file
);
if ((sfd
= open(file
, O_RDONLY
)) < 0) {
(void)fprintf(stderr
, "ar: %s: %s.\n",
/* Read from disk, write to an archive; pad on write. */
options
& (AR_A
|AR_B
) ? tfd1
: tfd2
, tname
, WPAD
);
(void)lseek(afd
, (off_t
)SARMAG
, SEEK_SET
);
SETCF(tfd1
, tname
, afd
, archive
, NOPAD
);
tsize
= size
= lseek(tfd1
, (off_t
)0, SEEK_CUR
);
(void)lseek(tfd1
, (off_t
)0, SEEK_SET
);
tsize
+= size
= lseek(tfd2
, (off_t
)0, SEEK_CUR
);
(void)lseek(tfd2
, (off_t
)0, SEEK_SET
);
(void)ftruncate(afd
, tsize
+ SARMAG
);