added depend label
[unix-history] / usr / src / usr.bin / ar / ar.c
index 94f07e5..076fbd9 100644 (file)
@@ -1,17 +1,28 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)ar.c       5.2 (Berkeley) %G%";
+#endif not lint
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)ar.c 4.4 %G%";
-#endif
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
 
 /*
  * ar - portable (ascii) format version
  */
 
 /*
  * ar - portable (ascii) format version
  */
-#include <sys/types.h>
+#include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 
 #include <stdio.h>
 #include <ar.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 
 #include <stdio.h>
 #include <ar.h>
-#include <signal.h>
 
 struct stat    stbuf;
 struct ar_hdr  arbuf;
 
 struct stat    stbuf;
 struct ar_hdr  arbuf;
@@ -62,7 +73,8 @@ int   tf1;
 int    tf2;
 int    qf;
 int    bastate;
 int    tf2;
 int    qf;
 int    bastate;
-char   buf[BUFSIZ];
+char   buf[MAXBSIZE];
+int    truncate;                       /* ok to truncate argument filenames */
 
 char   *trim();
 char   *mktemp();
 
 char   *trim();
 char   *mktemp();
@@ -315,6 +327,7 @@ qcmd()
                fprintf(stderr, "ar: abi not allowed with q\n");
                done(1);
        }
                fprintf(stderr, "ar: abi not allowed with q\n");
                done(1);
        }
+       truncate++;
        getqf();
        for(i=0; signum[i]; i++)
                signal(signum[i], SIG_IGN);
        getqf();
        for(i=0; signum[i]; i++)
                signal(signum[i], SIG_IGN);
@@ -442,6 +455,7 @@ cleanup()
 {
        register i, f;
 
 {
        register i, f;
 
+       truncate++;
        for(i=0; i<namc; i++) {
                file = namv[i];
                if(file == 0)
        for(i=0; i<namc; i++) {
                file = namv[i];
                if(file == 0)
@@ -475,19 +489,19 @@ install()
        }
        if(tfnam) {
                lseek(tf, 0l, 0);
        }
        if(tfnam) {
                lseek(tf, 0l, 0);
-               while((i = read(tf, buf, BUFSIZ)) > 0)
+               while((i = read(tf, buf, MAXBSIZE)) > 0)
                        if (write(af, buf, i) != i)
                                wrerr();
        }
        if(tf2nam) {
                lseek(tf2, 0l, 0);
                        if (write(af, buf, i) != i)
                                wrerr();
        }
        if(tf2nam) {
                lseek(tf2, 0l, 0);
-               while((i = read(tf2, buf, BUFSIZ)) > 0)
+               while((i = read(tf2, buf, MAXBSIZE)) > 0)
                        if (write(af, buf, i) != i)
                                wrerr();
        }
        if(tf1nam) {
                lseek(tf1, 0l, 0);
                        if (write(af, buf, i) != i)
                                wrerr();
        }
        if(tf1nam) {
                lseek(tf1, 0l, 0);
-               while((i = read(tf1, buf, BUFSIZ)) > 0)
+               while((i = read(tf1, buf, MAXBSIZE)) > 0)
                        if (write(af, buf, i) != i)
                                wrerr();
        }
                        if (write(af, buf, i) != i)
                                wrerr();
        }
@@ -504,8 +518,8 @@ movefil(f)
        sprintf(buf, "%-16s%-12ld%-6u%-6u%-8o%-10ld%-2s",
           trim(file),
           stbuf.st_mtime,
        sprintf(buf, "%-16s%-12ld%-6u%-6u%-8o%-10ld%-2s",
           trim(file),
           stbuf.st_mtime,
-          stbuf.st_uid,
-          stbuf.st_gid,
+          (u_short)stbuf.st_uid,
+          (u_short)stbuf.st_gid,
           stbuf.st_mode,
           stbuf.st_size,
           ARFMAG);
           stbuf.st_mode,
           stbuf.st_size,
           ARFMAG);
@@ -552,7 +566,7 @@ copyfil(fi, fo, flag)
        }
        pe = 0;
        while(larbuf.lar_size > 0) {
        }
        pe = 0;
        while(larbuf.lar_size > 0) {
-               i = o = BUFSIZ;
+               i = o = MAXBSIZE;
                if(larbuf.lar_size < i) {
                        i = o = larbuf.lar_size;
                        if(i&1) {
                if(larbuf.lar_size < i) {
                        i = o = larbuf.lar_size;
                        if(i&1) {
@@ -568,7 +582,7 @@ copyfil(fi, fo, flag)
                if((flag & SKIP) == 0)
                        if (write(fo, buf, o) != o)
                                wrerr();
                if((flag & SKIP) == 0)
                        if (write(fo, buf, o) != o)
                                wrerr();
-               larbuf.lar_size -= BUFSIZ;
+               larbuf.lar_size -= MAXBSIZE;
        }
        if(pe)
                phserr();
        }
        if(pe)
                phserr();
@@ -670,6 +684,7 @@ char *s;
 {
        register char *p1, *p2;
 
 {
        register char *p1, *p2;
 
+       /* Strip trailing slashes */
        for(p1 = s; *p1; p1++)
                ;
        while(p1 > s) {
        for(p1 = s; *p1; p1++)
                ;
        while(p1 > s) {
@@ -677,10 +692,25 @@ char *s;
                        break;
                *p1 = 0;
        }
                        break;
                *p1 = 0;
        }
+
+       /* Find last component of path; do not zap the path */
        p2 = s;
        for(p1 = s; *p1; p1++)
                if(*p1 == '/')
                        p2 = p1+1;
        p2 = s;
        for(p1 = s; *p1; p1++)
                if(*p1 == '/')
                        p2 = p1+1;
+
+       /*
+        * Truncate name if too long, only if we are doing an 'add'
+        * type operation. We only allow 15 cause rest of ar
+        * isn't smart enough to deal with non-null terminated
+        * names.  Need an exit status convention...
+        * Need yet another new archive format...
+        */
+       if (truncate && strlen(p2) > sizeof(arbuf.ar_name) - 1) {
+               fprintf(stderr, "ar: filename %s truncated to ", p2);
+               *(p2 + sizeof(arbuf.ar_name) - 1) = '\0';
+               fprintf(stderr, "%s\n", p2);
+       }
        return(p2);
 }
 
        return(p2);
 }