added depend label
[unix-history] / usr / src / usr.bin / ar / ar.c
index db8c6d8..076fbd9 100644 (file)
@@ -1,22 +1,37 @@
-static char sccsid[] = "@(#)ar.c 4.2 %G%";
+/*
+ * 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
+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 <stdio.h>
-#include <sys/types.h>
+#include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
+#include <sys/time.h>
+
+#include <stdio.h>
 #include <ar.h>
 #include <ar.h>
-#include <signal.h>
 
 
-typedef        unsigned short ushort;
 struct stat    stbuf;
 struct ar_hdr  arbuf;
 struct lar_hdr {
        char    lar_name[16];
        long    lar_date;
 struct stat    stbuf;
 struct ar_hdr  arbuf;
 struct lar_hdr {
        char    lar_name[16];
        long    lar_date;
-       ushort  lar_uid;
-       ushort  lar_gid;
-       ushort  lar_mode;
+       u_short lar_uid;
+       u_short lar_gid;
+       u_short lar_mode;
        long    lar_size;
 } larbuf;
 
        long    lar_size;
 } larbuf;
 
@@ -58,8 +73,8 @@ int   tf1;
 int    tf2;
 int    qf;
 int    bastate;
 int    tf2;
 int    qf;
 int    bastate;
-char   buf[BUFSIZ];
-time_t timep[2];
+char   buf[MAXBSIZE];
+int    truncate;                       /* ok to truncate argument filenames */
 
 char   *trim();
 char   *mktemp();
 
 char   *trim();
 char   *mktemp();
@@ -216,6 +231,7 @@ dcmd()
 xcmd()
 {
        register f;
 xcmd()
 {
        register f;
+       struct timeval tv[2];
 
        if(getaf())
                noar();
 
        if(getaf())
                noar();
@@ -230,8 +246,9 @@ xcmd()
                        copyfil(af, f, IODD);
                        close(f);
                        if (flg['o'-'a']) {
                        copyfil(af, f, IODD);
                        close(f);
                        if (flg['o'-'a']) {
-                               timep[0] = timep[1] = (time_t) larbuf.lar_date;
-                               utime(file, timep);
+                               tv[0].tv_sec = tv[1].tv_sec = larbuf.lar_date;
+                               tv[0].tv_usec = tv[1].tv_usec = 0;
+                               utimes(file, tv);
                        }
                        continue;
                }
                        }
                        continue;
                }
@@ -310,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);
@@ -437,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)
@@ -470,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();
        }
@@ -499,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);
@@ -547,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) {
@@ -563,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();
@@ -665,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) {
@@ -672,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);
 }