BSD 4_4 release
[unix-history] / usr / src / usr.bin / ar / replace.c
index cefcc0d..1600b8c 100644 (file)
@@ -1,26 +1,54 @@
 /*-
 /*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Hugh Smith at The University of Guelph.
  *
  *
  * This code is derived from software contributed to Berkeley by
  * Hugh Smith at The University of Guelph.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)replace.c  5.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)replace.c  8.1 (Berkeley) 6/6/93";
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
-#include <sys/errno.h>
 #include <fcntl.h>
 #include <fcntl.h>
-#include <unistd.h>
 #include <dirent.h>
 #include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
 #include <ar.h>
 #include <stdio.h>
 #include <ar.h>
 #include <stdio.h>
+#include <string.h>
 #include "archive.h"
 #include "archive.h"
+#include "extern.h"
 
 extern CHDR chdr;                      /* converted header */
 extern char *archive;                  /* archive name */
 
 extern CHDR chdr;                      /* converted header */
 extern char *archive;                  /* archive name */
@@ -36,7 +64,7 @@ extern char *tname;                     /* temporary file "name" */
 replace(argv)
        char **argv;
 {
 replace(argv)
        char **argv;
 {
-       extern char *posname;           /* positioning file name */
+       extern char *posarg, *posname;  /* positioning file name */
        register char *file;
        register int afd, curfd, mods, sfd;
        struct stat sb;
        register char *file;
        register int afd, curfd, mods, sfd;
        struct stat sb;
@@ -45,6 +73,7 @@ replace(argv)
        int err, exists, tfd1, tfd2;
        char *rname();
 
        int err, exists, tfd1, tfd2;
        char *rname();
 
+       err = 0;
        /*
         * If doesn't exist, simply append to the archive.  There's
         * a race here, but it's pretty short, and not worth fixing.
        /*
         * If doesn't exist, simply append to the archive.  There's
         * a race here, but it's pretty short, and not worth fixing.
@@ -69,8 +98,8 @@ replace(argv)
         * all back together at the end.
         */
        mods = (options & (AR_A|AR_B));
         * all back together at the end.
         */
        mods = (options & (AR_A|AR_B));
-       for (err = 0, curfd = tfd1; get_header(afd);) {
-               if ((file = *argv) && files(argv)) {
+       for (curfd = tfd1; get_arobj(afd);) {
+               if (*argv && (file = files(argv))) {
                        if ((sfd = open(file, O_RDONLY)) < 0) {
                                err = 1;
                                (void)fprintf(stderr, "ar: %s: %s.\n",
                        if ((sfd = open(file, O_RDONLY)) < 0) {
                                err = 1;
                                (void)fprintf(stderr, "ar: %s: %s.\n",
@@ -82,13 +111,13 @@ replace(argv)
                                goto useold;
 
                        if (options & AR_V)
                                goto useold;
 
                        if (options & AR_V)
-                            (void)printf("r - %s\n", chdr.name);
+                            (void)printf("r - %s\n", file);
 
 
+                       /* Read from disk, write to an archive; pad on write */
                        SETCF(sfd, file, curfd, tname, WPAD);
                        SETCF(sfd, file, curfd, tname, WPAD);
-                       put_header(&cf, &sb);
-                       copyfile(&cf, sb.st_size);
+                       put_arobj(&cf, &sb);
                        (void)close(sfd);
                        (void)close(sfd);
-                       SKIP(afd, chdr.size, archive);
+                       skip_arobj(afd);
                        continue;
                }
 
                        continue;
                }
 
@@ -96,21 +125,21 @@ replace(argv)
                        mods = 0;
                        if (options & AR_B)
                                curfd = tfd2;
                        mods = 0;
                        if (options & AR_B)
                                curfd = tfd2;
+                       /* Read and write to an archive; pad on both. */
                        SETCF(afd, archive, curfd, tname, RPAD|WPAD);
                        SETCF(afd, archive, curfd, tname, RPAD|WPAD);
-                       put_header(&cf, (struct stat *)NULL);
-                       copyfile(&cf, chdr.size);
+                       put_arobj(&cf, (struct stat *)NULL);
                        if (options & AR_A)
                                curfd = tfd2;
                } else {
                        if (options & AR_A)
                                curfd = tfd2;
                } else {
+                       /* Read and write to an archive; pad on both. */
 useold:                        SETCF(afd, archive, curfd, tname, RPAD|WPAD);
 useold:                        SETCF(afd, archive, curfd, tname, RPAD|WPAD);
-                       put_header(&cf, (struct stat *)NULL);
-                       copyfile(&cf, chdr.size);
+                       put_arobj(&cf, (struct stat *)NULL);
                }
        }
 
        if (mods) {
                (void)fprintf(stderr, "ar: %s: archive member not found.\n",
                }
        }
 
        if (mods) {
                (void)fprintf(stderr, "ar: %s: archive member not found.\n",
-                   posname);
+                   posarg);
                 close_archive(afd);
                 return(1);
         }
                 close_archive(afd);
                 return(1);
         }
@@ -118,7 +147,7 @@ useold:                     SETCF(afd, archive, curfd, tname, RPAD|WPAD);
        /* Append any left-over arguments to the end of the after file. */
 append:        while (file = *argv++) {
                if (options & AR_V)
        /* Append any left-over arguments to the end of the after file. */
 append:        while (file = *argv++) {
                if (options & AR_V)
-                       (void)printf("a - %s\n", rname(file));
+                       (void)printf("a - %s\n", file);
                if ((sfd = open(file, O_RDONLY)) < 0) {
                        err = 1;
                        (void)fprintf(stderr, "ar: %s: %s.\n",
                if ((sfd = open(file, O_RDONLY)) < 0) {
                        err = 1;
                        (void)fprintf(stderr, "ar: %s: %s.\n",
@@ -126,27 +155,27 @@ append:   while (file = *argv++) {
                        continue;
                }
                (void)fstat(sfd, &sb);
                        continue;
                }
                (void)fstat(sfd, &sb);
+               /* Read from disk, write to an archive; pad on write. */
                SETCF(sfd, file,
                    options & (AR_A|AR_B) ? tfd1 : tfd2, tname, WPAD);
                SETCF(sfd, file,
                    options & (AR_A|AR_B) ? tfd1 : tfd2, tname, WPAD);
-               put_header(&cf, &sb);
-               copyfile(&cf, sb.st_size);
+               put_arobj(&cf, &sb);
                (void)close(sfd);
        }
        
        (void)lseek(afd, (off_t)SARMAG, SEEK_SET);
 
                (void)close(sfd);
        }
        
        (void)lseek(afd, (off_t)SARMAG, SEEK_SET);
 
-       SETCF(tfd1, tname, afd, archive, 0);
+       SETCF(tfd1, tname, afd, archive, NOPAD);
        if (tfd1 != -1) {
                tsize = size = lseek(tfd1, (off_t)0, SEEK_CUR);
                (void)lseek(tfd1, (off_t)0, SEEK_SET);
        if (tfd1 != -1) {
                tsize = size = lseek(tfd1, (off_t)0, SEEK_CUR);
                (void)lseek(tfd1, (off_t)0, SEEK_SET);
-               copyfile(&cf, size);
+               copy_ar(&cf, size);
        } else
                tsize = 0;
 
        tsize += size = lseek(tfd2, (off_t)0, SEEK_CUR);
        (void)lseek(tfd2, (off_t)0, SEEK_SET);
        cf.rfd = tfd2;
        } else
                tsize = 0;
 
        tsize += size = lseek(tfd2, (off_t)0, SEEK_CUR);
        (void)lseek(tfd2, (off_t)0, SEEK_SET);
        cf.rfd = tfd2;
-       copyfile(&cf, size);
+       copy_ar(&cf, size);
 
        (void)ftruncate(afd, tsize + SARMAG);
        close_archive(afd);
 
        (void)ftruncate(afd, tsize + SARMAG);
        close_archive(afd);