X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/2b84abb596f52ab2068d52108adc96838ad4340a..31cef89cb428866f787983e68246030321893df4:/usr/src/cmd/ar.c diff --git a/usr/src/cmd/ar.c b/usr/src/cmd/ar.c index 3d98efb6f1..1932e45019 100644 --- a/usr/src/cmd/ar.c +++ b/usr/src/cmd/ar.c @@ -1,10 +1,24 @@ +static char sccsid[] = "@(#)ar.c 4.1 10/1/80"; +/* + * ar - portable (ascii) format version + */ #include #include #include #include #include + +typedef unsigned short ushort; 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 @@ -111,7 +125,7 @@ char *argv[]; tmpnam = "vXXXXX"; tmp1nam = "v1XXXXX"; tmp2nam = "v2XXXXX"; - } + } 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']) - if(stbuf.st_mtime <= arbuf.ar_date) { + if(stbuf.st_mtime <= larbuf.lar_date) { close(f); goto cp; } @@ -205,7 +219,7 @@ xcmd() 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; @@ -313,7 +327,6 @@ qcmd() init() { - static mbuf = ARMAG; tfnam = mktemp(tmpnam); close(creat(tfnam, 0600)); @@ -322,18 +335,18 @@ init() 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() { - int mbuf; + char mbuf[SARMAG]; 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); } @@ -342,22 +355,19 @@ getaf() getqf() { - int mbuf; + char mbuf[SARMAG]; 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); } - mbuf = ARMAG; - if (write(qf, (char *)&mbuf, sizeof(int)) != sizeof(int)) + if (write(qf, ARMAG, SARMAG) != SARMAG) 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); } @@ -478,18 +488,18 @@ install() */ 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); } @@ -517,15 +527,25 @@ copyfil(fi, fo, flag) 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(); + } pe = 0; - while(arbuf.ar_size > 0) { + while(larbuf.lar_size > 0) { 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) { + buf[i] = '\n'; 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(); - arbuf.ar_size -= BUFSIZ; + larbuf.lar_size -= BUFSIZ; } if(pe) phserr(); @@ -545,6 +565,7 @@ copyfil(fi, fo, flag) getdir() { + register char *cp; register i; i = read(af, (char *)&arbuf, sizeof arbuf); @@ -556,9 +577,22 @@ getdir() } 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; + 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); } @@ -660,9 +694,9 @@ longt() 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); } @@ -693,7 +727,7 @@ int *pairp; ap = pairp; n = *ap++; - while (--n>=0 && (arbuf.ar_mode&*ap++)==0) + while (--n>=0 && (larbuf.lar_mode&*ap++)==0) ap++; putchar(*ap); }