BSD 4 release
[unix-history] / usr / src / cmd / ar.c
index 3d98efb..1932e45 100644 (file)
@@ -1,10 +1,24 @@
+static char sccsid[] = "@(#)ar.c 4.1 10/1/80";
+/*
+ * ar - portable (ascii) format version
+ */
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <ar.h>
 #include <signal.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <ar.h>
 #include <signal.h>
+
+typedef        unsigned short ushort;
 struct stat    stbuf;
 struct ar_hdr  arbuf;
 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;
+       long    lar_size;
+} larbuf;
 
 #define        SKIP    1
 #define        IODD    2
 
 #define        SKIP    1
 #define        IODD    2
@@ -111,7 +125,7 @@ char *argv[];
                tmpnam = "vXXXXX";
                tmp1nam = "v1XXXXX";
                tmp2nam = "v2XXXXX";
                tmpnam = "vXXXXX";
                tmp1nam = "v1XXXXX";
                tmp2nam = "v2XXXXX";
-               }
+       }
        if(flg['i'-'a'])
                flg['b'-'a']++;
        if(flg['a'-'a'] || flg['b'-'a']) {
        if(flg['i'-'a'])
                flg['b'-'a']++;
        if(flg['a'-'a'] || flg['b'-'a']) {
@@ -163,7 +177,7 @@ rcmd()
                                goto cp;
                        }
                        if(flg['u'-'a'])
                                goto cp;
                        }
                        if(flg['u'-'a'])
-                               if(stbuf.st_mtime <= arbuf.ar_date) {
+                               if(stbuf.st_mtime <= larbuf.lar_date) {
                                        close(f);
                                        goto cp;
                                }
                                        close(f);
                                        goto cp;
                                }
@@ -205,7 +219,7 @@ xcmd()
                noar();
        while(!getdir()) {
                if(namc == 0 || match()) {
                noar();
        while(!getdir()) {
                if(namc == 0 || match()) {
-                       f = creat(file, arbuf.ar_mode & 0777);
+                       f = creat(file, larbuf.lar_mode & 0777);
                        if(f < 0) {
                                fprintf(stderr, "ar: %s cannot create\n", file);
                                goto sk;
                        if(f < 0) {
                                fprintf(stderr, "ar: %s cannot create\n", file);
                                goto sk;
@@ -313,7 +327,6 @@ qcmd()
 
 init()
 {
 
 init()
 {
-       static mbuf = ARMAG;
 
        tfnam = mktemp(tmpnam);
        close(creat(tfnam, 0600));
 
        tfnam = mktemp(tmpnam);
        close(creat(tfnam, 0600));
@@ -322,18 +335,18 @@ init()
                fprintf(stderr, "ar: cannot create temp file\n");
                done(1);
        }
                fprintf(stderr, "ar: cannot create temp file\n");
                done(1);
        }
-       if (write(tf, (char *)&mbuf, sizeof(int)) != sizeof(int))
+       if (write(tf, ARMAG, SARMAG) != SARMAG)
                wrerr();
 }
 
 getaf()
 {
                wrerr();
 }
 
 getaf()
 {
-       int mbuf;
+       char mbuf[SARMAG];
 
        af = open(arnam, 0);
        if(af < 0)
                return(1);
 
        af = open(arnam, 0);
        if(af < 0)
                return(1);
-       if (read(af, (char *)&mbuf, sizeof(int)) != sizeof(int) || mbuf!=ARMAG) {
+       if (read(af, mbuf, SARMAG) != SARMAG || strncmp(mbuf, ARMAG, SARMAG)) {
                fprintf(stderr, "ar: %s not in archive format\n", arnam);
                done(1);
        }
                fprintf(stderr, "ar: %s not in archive format\n", arnam);
                done(1);
        }
@@ -342,22 +355,19 @@ getaf()
 
 getqf()
 {
 
 getqf()
 {
-       int mbuf;
+       char mbuf[SARMAG];
 
        if ((qf = open(arnam, 2)) < 0) {
                if(!flg['c'-'a'])
                        fprintf(stderr, "ar: creating %s\n", arnam);
 
        if ((qf = open(arnam, 2)) < 0) {
                if(!flg['c'-'a'])
                        fprintf(stderr, "ar: creating %s\n", arnam);
-               close(creat(arnam, 0666));
-               if ((qf = open(arnam, 2)) < 0) {
+               if ((qf = creat(arnam, 0666)) < 0) {
                        fprintf(stderr, "ar: cannot create %s\n", arnam);
                        done(1);
                }
                        fprintf(stderr, "ar: cannot create %s\n", arnam);
                        done(1);
                }
-               mbuf = ARMAG;
-               if (write(qf, (char *)&mbuf, sizeof(int)) != sizeof(int))
+               if (write(qf, ARMAG, SARMAG) != SARMAG)
                        wrerr();
                        wrerr();
-       }
-       else if (read(qf, (char *)&mbuf, sizeof(int)) != sizeof(int)
-               || mbuf!=ARMAG) {
+       } else if (read(qf, mbuf, SARMAG) != SARMAG
+               || strncmp(mbuf, ARMAG, SARMAG)) {
                fprintf(stderr, "ar: %s not in archive format\n", arnam);
                done(1);
        }
                fprintf(stderr, "ar: %s not in archive format\n", arnam);
                done(1);
        }
@@ -478,18 +488,18 @@ install()
  */
 movefil(f)
 {
  */
 movefil(f)
 {
-       register char *cp;
-       register i;
-
-       cp = trim(file);
-       for(i=0; i<14; i++)
-               if(arbuf.ar_name[i] = *cp)
-                       cp++;
-       arbuf.ar_size = stbuf.st_size;
-       arbuf.ar_date = stbuf.st_mtime;
-       arbuf.ar_uid = stbuf.st_uid;
-       arbuf.ar_gid = stbuf.st_gid;
-       arbuf.ar_mode = stbuf.st_mode;
+       char buf[sizeof(arbuf)+1];
+
+       sprintf(buf, "%-16s%-12ld%-6u%-6u%-8o%-10ld%-2s",
+          trim(file),
+          stbuf.st_mtime,
+          stbuf.st_uid,
+          stbuf.st_gid,
+          stbuf.st_mode,
+          stbuf.st_size,
+          ARFMAG);
+       strncpy((char *)&arbuf, buf, sizeof(arbuf));
+       larbuf.lar_size = stbuf.st_size;
        copyfil(f, tf, OODD+HEAD);
        close(f);
 }
        copyfil(f, tf, OODD+HEAD);
        close(f);
 }
@@ -517,15 +527,25 @@ copyfil(fi, fo, flag)
        register i, o;
        int pe;
 
        register i, o;
        int pe;
 
-       if(flag & HEAD)
+       if(flag & HEAD) {
+               for (i=sizeof(arbuf.ar_name)-1; i>=0; i--) {
+                       if (arbuf.ar_name[i]==' ')
+                               continue;
+                       else if (arbuf.ar_name[i]=='\0')
+                               arbuf.ar_name[i] = ' ';
+                       else
+                               break;
+               }
                if (write(fo, (char *)&arbuf, sizeof arbuf) != sizeof arbuf)
                        wrerr();
                if (write(fo, (char *)&arbuf, sizeof arbuf) != sizeof arbuf)
                        wrerr();
+       }
        pe = 0;
        pe = 0;
-       while(arbuf.ar_size > 0) {
+       while(larbuf.lar_size > 0) {
                i = o = BUFSIZ;
                i = o = BUFSIZ;
-               if(arbuf.ar_size < i) {
-                       i = o = arbuf.ar_size;
+               if(larbuf.lar_size < i) {
+                       i = o = larbuf.lar_size;
                        if(i&1) {
                        if(i&1) {
+                               buf[i] = '\n';
                                if(flag & IODD)
                                        i++;
                                if(flag & OODD)
                                if(flag & IODD)
                                        i++;
                                if(flag & OODD)
@@ -537,7 +557,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();
-               arbuf.ar_size -= BUFSIZ;
+               larbuf.lar_size -= BUFSIZ;
        }
        if(pe)
                phserr();
        }
        if(pe)
                phserr();
@@ -545,6 +565,7 @@ copyfil(fi, fo, flag)
 
 getdir()
 {
 
 getdir()
 {
+       register char *cp;
        register i;
 
        i = read(af, (char *)&arbuf, sizeof arbuf);
        register i;
 
        i = read(af, (char *)&arbuf, sizeof arbuf);
@@ -556,9 +577,22 @@ getdir()
                }
                return(1);
        }
                }
                return(1);
        }
-       for(i=0; i<14; i++)
-               name[i] = arbuf.ar_name[i];
+       if (strncmp(arbuf.ar_fmag, ARFMAG, sizeof(arbuf.ar_fmag))) {
+               fprintf(stderr, "ar: malformed archive (at %ld)\n", lseek(af, 0L, 1));
+               done(1);
+       }
+       cp = arbuf.ar_name + sizeof(arbuf.ar_name);
+       while (*--cp==' ')
+               ;
+       *++cp = '\0';
+       strncpy(name, arbuf.ar_name, sizeof(arbuf.ar_name));
        file = name;
        file = name;
+       strncpy(larbuf.lar_name, name, sizeof(larbuf.lar_name));
+       sscanf(arbuf.ar_date, "%ld", &larbuf.lar_date);
+       sscanf(arbuf.ar_uid, "%hd", &larbuf.lar_uid);
+       sscanf(arbuf.ar_gid, "%hd", &larbuf.lar_gid);
+       sscanf(arbuf.ar_mode, "%ho", &larbuf.lar_mode);
+       sscanf(arbuf.ar_size, "%ld", &larbuf.lar_size);
        return(0);
 }
 
        return(0);
 }
 
@@ -660,9 +694,9 @@ longt()
        register char *cp;
 
        pmode();
        register char *cp;
 
        pmode();
-       printf("%3d/%1d", arbuf.ar_uid, arbuf.ar_gid);
-       printf("%7D", arbuf.ar_size);
-       cp = ctime(&arbuf.ar_date);
+       printf("%3d/%1d", larbuf.lar_uid, larbuf.lar_gid);
+       printf("%7ld", larbuf.lar_size);
+       cp = ctime(&larbuf.lar_date);
        printf(" %-12.12s %-4.4s ", cp+4, cp+20);
 }
 
        printf(" %-12.12s %-4.4s ", cp+4, cp+20);
 }
 
@@ -693,7 +727,7 @@ int *pairp;
 
        ap = pairp;
        n = *ap++;
 
        ap = pairp;
        n = *ap++;
-       while (--n>=0 && (arbuf.ar_mode&*ap++)==0)
+       while (--n>=0 && (larbuf.lar_mode&*ap++)==0)
                ap++;
        putchar(*ap);
 }
                ap++;
        putchar(*ap);
 }