+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>
+
+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
tmpnam = "vXXXXX";
tmp1nam = "v1XXXXX";
tmp2nam = "v2XXXXX";
- }
+ }
if(flg['i'-'a'])
flg['b'-'a']++;
if(flg['a'-'a'] || flg['b'-'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;
}
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;
init()
{
- static mbuf = ARMAG;
tfnam = mktemp(tmpnam);
close(creat(tfnam, 0600));
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);
}
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);
}
*/
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);
}
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)
if((flag & SKIP) == 0)
if (write(fo, buf, o) != o)
wrerr();
- arbuf.ar_size -= BUFSIZ;
+ larbuf.lar_size -= BUFSIZ;
}
if(pe)
phserr();
getdir()
{
+ register char *cp;
register i;
i = read(af, (char *)&arbuf, sizeof arbuf);
}
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);
}
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);
}
ap = pairp;
n = *ap++;
- while (--n>=0 && (arbuf.ar_mode&*ap++)==0)
+ while (--n>=0 && (larbuf.lar_mode&*ap++)==0)
ap++;
putchar(*ap);
}