static char sccsid
[] = "@(#)ar.c 4.1 %G%";
* ar - portable (ascii) format version
typedef unsigned short ushort
;
char *man
= { "mrxtdpq" };
char *opt
= { "uvnbail" };
int signum
[] = {SIGHUP
, SIGINT
, SIGQUIT
, 0};
char *tmpnam
= { "/tmp/vXXXXX" };
char *tmp1nam
= { "/tmp/v1XXXXX" };
char *tmp2nam
= { "/tmp/v2XXXXX" };
if(signal(signum
[i
], SIG_IGN
) != SIG_IGN
)
signal(signum
[i
], sigdone
);
for(cp
= argv
[1]; *cp
; cp
++)
fprintf(stderr
, "ar: bad option `%c'\n", *cp
);
if(flg
['a'-'a'] || flg
['b'-'a']) {
fprintf(stderr
, "ar: one of [%s] must be specified\n", man
);
fprintf(stderr
, "ar: only one of [%s] allowed\n", man
);
if(namc
== 0 || match()) {
fprintf(stderr
, "ar: cannot open %s\n", file
);
if(stbuf
.st_mtime
<= larbuf
.lar_date
) {
copyfil(af
, -1, IODD
+SKIP
);
copyfil(af
, tf
, IODD
+OODD
+HEAD
);
copyfil(af
, -1, IODD
+SKIP
);
copyfil(af
, tf
, IODD
+OODD
+HEAD
);
if(namc
== 0 || match()) {
f
= creat(file
, larbuf
.lar_mode
& 0777);
fprintf(stderr
, "ar: %s cannot create\n", file
);
copyfil(af
, -1, IODD
+SKIP
);
if (namc
> 0 && !morefil())
if(namc
== 0 || match()) {
printf("\n<%s>\n\n", file
);
copyfil(af
, -1, IODD
+SKIP
);
tf2nam
= mktemp(tmp2nam
);
close(creat(tf2nam
, 0600));
fprintf(stderr
, "ar: cannot create third temp\n");
copyfil(af
, tf2
, IODD
+OODD
+HEAD
);
copyfil(af
, tf
, IODD
+OODD
+HEAD
);
if(namc
== 0 || match()) {
printf("%s\n", trim(file
));
copyfil(af
, -1, IODD
+SKIP
);
if (flg
['a'-'a'] || flg
['b'-'a']) {
fprintf(stderr
, "ar: abi not allowed with q\n");
signal(signum
[i
], SIG_IGN
);
fprintf(stderr
, "ar: %s cannot open\n", file
);
close(creat(tfnam
, 0600));
fprintf(stderr
, "ar: cannot create temp file\n");
if (write(tf
, ARMAG
, SARMAG
) != SARMAG
)
if (read(af
, mbuf
, SARMAG
) != SARMAG
|| strncmp(mbuf
, ARMAG
, SARMAG
)) {
fprintf(stderr
, "ar: %s not in archive format\n", arnam
);
if ((qf
= open(arnam
, 2)) < 0) {
fprintf(stderr
, "ar: creating %s\n", arnam
);
if ((qf
= creat(arnam
, 0666)) < 0) {
fprintf(stderr
, "ar: cannot create %s\n", arnam
);
if (write(qf
, ARMAG
, SARMAG
) != SARMAG
)
} else if (read(qf
, mbuf
, SARMAG
) != SARMAG
|| strncmp(mbuf
, ARMAG
, SARMAG
)) {
fprintf(stderr
, "ar: %s not in archive format\n", arnam
);
printf("usage: ar [%s][%s] archive files ...\n", opt
, man
);
fprintf(stderr
, "ar: %s does not exist\n", arnam
);
fprintf(stderr
, "ar: %s not found\n", namv
[i
]);
fprintf(stderr
, "ar: %s cannot open\n", file
);
signal(signum
[i
], SIG_IGN
);
fprintf(stderr
, "ar: creating %s\n", arnam
);
fprintf(stderr
, "ar: cannot create %s\n", arnam
);
while((i
= read(tf
, buf
, BUFSIZ
)) > 0)
if (write(af
, buf
, i
) != i
)
while((i
= read(tf2
, buf
, BUFSIZ
)) > 0)
if (write(af
, buf
, i
) != i
)
while((i
= read(tf1
, buf
, BUFSIZ
)) > 0)
if (write(af
, buf
, i
) != i
)
* into the temporary file
char buf
[sizeof(arbuf
)+1];
sprintf(buf
, "%-16s%-12ld%-6u%-6u%-8o%-10ld%-2s",
strncpy((char *)&arbuf
, buf
, sizeof(arbuf
));
larbuf
.lar_size
= stbuf
.st_size
;
copyfil(f
, tf
, OODD
+HEAD
);
if(fstat(f
, &stbuf
) < 0) {
for (i
=sizeof(arbuf
.ar_name
)-1; i
>=0; i
--) {
if (arbuf
.ar_name
[i
]==' ')
else if (arbuf
.ar_name
[i
]=='\0')
if (write(fo
, (char *)&arbuf
, sizeof arbuf
) != sizeof arbuf
)
while(larbuf
.lar_size
> 0) {
if(larbuf
.lar_size
< i
) {
if(read(fi
, buf
, i
) != i
)
if (write(fo
, buf
, o
) != o
)
larbuf
.lar_size
-= BUFSIZ
;
i
= read(af
, (char *)&arbuf
, sizeof arbuf
);
if (strncmp(arbuf
.ar_fmag
, ARFMAG
, sizeof(arbuf
.ar_fmag
))) {
fprintf(stderr
, "ar: malformed archive (at %ld)\n", lseek(af
, 0L, 1));
cp
= arbuf
.ar_name
+ sizeof(arbuf
.ar_name
);
strncpy(name
, arbuf
.ar_name
, sizeof(arbuf
.ar_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
);
if(strcmp(trim(namv
[i
]), file
) == 0) {
if(strcmp(file
, ponam
) != 0)
tf1nam
= mktemp(tmp1nam
);
close(creat(tf1nam
, 0600));
fprintf(stderr
, "ar: cannot create second temp\n");
fprintf(stderr
, "ar: phase error on %s\n", file
);
if(c
!= 'c' || flg
['v'-'a'] > 1)
printf("%c - %s\n", c
, file
);
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);
int m1
[] = { 1, ROWN
, 'r', '-' };
int m2
[] = { 1, WOWN
, 'w', '-' };
int m3
[] = { 2, SUID
, 's', XOWN
, 'x', '-' };
int m4
[] = { 1, RGRP
, 'r', '-' };
int m5
[] = { 1, WGRP
, 'w', '-' };
int m6
[] = { 2, SGID
, 's', XGRP
, 'x', '-' };
int m7
[] = { 1, ROTH
, 'r', '-' };
int m8
[] = { 1, WOTH
, 'w', '-' };
int m9
[] = { 2, STXT
, 't', XOTH
, 'x', '-' };
int *m
[] = { m1
, m2
, m3
, m4
, m5
, m6
, m7
, m8
, m9
};
for (mp
= &m
[0]; mp
< &m
[9];)
while (--n
>=0 && (larbuf
.lar_mode
&*ap
++)==0)
perror("ar write error");