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
<= arbuf
.ar_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
, arbuf
.ar_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
, (char *)&mbuf
, sizeof(int)) != sizeof(int))
if (read(af
, (char *)&mbuf
, sizeof(int)) != sizeof(int) || mbuf
!=ARMAG
) {
fprintf(stderr
, "ar: %s not in archive format\n", arnam
);
if ((qf
= open(arnam
, 2)) < 0) {
fprintf(stderr
, "ar: creating %s\n", arnam
);
close(creat(arnam
, 0666));
if ((qf
= open(arnam
, 2)) < 0) {
fprintf(stderr
, "ar: cannot create %s\n", arnam
);
if (write(qf
, (char *)&mbuf
, sizeof(int)) != sizeof(int))
else if (read(qf
, (char *)&mbuf
, sizeof(int)) != sizeof(int)
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
, 512)) > 0)
if (write(af
, buf
, i
) != i
)
while((i
= read(tf2
, buf
, 512)) > 0)
if (write(af
, buf
, i
) != i
)
while((i
= read(tf1
, buf
, 512)) > 0)
if (write(af
, buf
, i
) != i
)
* into the temporary file
if(arbuf
.ar_name
[i
] = *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
;
copyfil(f
, tf
, OODD
+HEAD
);
if(fstat(f
, &stbuf
) < 0) {
if (write(fo
, (char *)&arbuf
, sizeof arbuf
) != sizeof arbuf
)
while(arbuf
.ar_size
> 0) {
if(read(fi
, buf
, i
) != i
)
if (write(fo
, buf
, o
) != o
)
i
= read(af
, (char *)&arbuf
, sizeof arbuf
);
name
[i
] = arbuf
.ar_name
[i
];
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", arbuf
.ar_uid
, arbuf
.ar_gid
);
printf("%7D", arbuf
.ar_size
);
cp
= ctime(&arbuf
.ar_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 && (arbuf
.ar_mode
&*ap
++)==0)
perror("ar write error");