1*c4c3f2a9Sbostic static char sccsid[] = "@(#)arcv.c 4.2 10/21/88";
201ab68c2Sbill /*
301ab68c2Sbill * arcv - convert old to new archive format
401ab68c2Sbill */
501ab68c2Sbill
601ab68c2Sbill #include <signal.h>
77a00fe69Sbill #include <ar.h>
801ab68c2Sbill #define OARMAG 0177545
901ab68c2Sbill struct oar_hdr {
1001ab68c2Sbill char oar_name[14];
1101ab68c2Sbill long oar_date;
1201ab68c2Sbill char oar_uid;
1301ab68c2Sbill char oar_gid;
1401ab68c2Sbill int oar_mode;
1501ab68c2Sbill long oar_size;
1601ab68c2Sbill };
1701ab68c2Sbill
1801ab68c2Sbill struct ar_hdr nh;
1901ab68c2Sbill struct oar_hdr oh;
20*c4c3f2a9Sbostic char tmp[] = "/usr/tmp/arcXXXXXX";
2101ab68c2Sbill char *mktemp();
2201ab68c2Sbill int f;
2301ab68c2Sbill char buf[512];
2401ab68c2Sbill int tf;
main(argc,argv)2501ab68c2Sbill main(argc, argv)
2601ab68c2Sbill char *argv[];
2701ab68c2Sbill {
2801ab68c2Sbill register i;
2901ab68c2Sbill
3001ab68c2Sbill if (argc>1 && strcmp(argv[1], "-t")==0) {
3101ab68c2Sbill argc--;
3201ab68c2Sbill argv++;
33*c4c3f2a9Sbostic } else {
34*c4c3f2a9Sbostic strcpy(tmp, "/tmp/arcXXXXXX");
35*c4c3f2a9Sbostic }
36*c4c3f2a9Sbostic mktemp(tmp);
3701ab68c2Sbill for(i=1; i<4; i++)
3801ab68c2Sbill signal(i, SIG_IGN);
3901ab68c2Sbill for(i=1; i<argc; i++) {
4001ab68c2Sbill if (argc>1)
4101ab68c2Sbill printf("%s:\n", argv[i]);
4201ab68c2Sbill conv(argv[i]);
4301ab68c2Sbill }
4401ab68c2Sbill unlink(tmp);
4501ab68c2Sbill return(0);
4601ab68c2Sbill }
4701ab68c2Sbill
conv(fil)4801ab68c2Sbill conv(fil)
4901ab68c2Sbill char *fil;
5001ab68c2Sbill {
5101ab68c2Sbill int oldmagic;
5201ab68c2Sbill long n;
5301ab68c2Sbill unsigned i;
5401ab68c2Sbill
5501ab68c2Sbill f = open(fil, 2);
5601ab68c2Sbill if(f < 0) {
5701ab68c2Sbill printf("arcv: cannot open %s\n", fil);
5801ab68c2Sbill return;
5901ab68c2Sbill }
6001ab68c2Sbill close(creat(tmp, 0600));
6101ab68c2Sbill tf = open(tmp, 2);
6201ab68c2Sbill if(tf < 0) {
6301ab68c2Sbill printf("arcv: cannot open temp\n");
6401ab68c2Sbill close(f);
6501ab68c2Sbill return;
6601ab68c2Sbill }
6701ab68c2Sbill oldmagic = 0;
6801ab68c2Sbill read(f, (char *)&oldmagic, sizeof(oldmagic));
6901ab68c2Sbill if(oldmagic != 0177545) {
7001ab68c2Sbill printf("arcv: %s not old archive format\n", fil);
7101ab68c2Sbill close(tf);
7201ab68c2Sbill close(f);
7301ab68c2Sbill return;
7401ab68c2Sbill }
7501ab68c2Sbill chkwrite(tf, ARMAG, SARMAG);
7601ab68c2Sbill loop:
7701ab68c2Sbill i = read(f, (char *)&oh, sizeof(oh));
7801ab68c2Sbill if(i != sizeof(oh))
7901ab68c2Sbill goto out;
8001ab68c2Sbill
8101ab68c2Sbill sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s",
8201ab68c2Sbill oh.oar_name,
8301ab68c2Sbill oh.oar_date,
8401ab68c2Sbill oh.oar_uid,
8501ab68c2Sbill oh.oar_gid,
8601ab68c2Sbill (unsigned short)oh.oar_mode,
8701ab68c2Sbill oh.oar_size,
8801ab68c2Sbill ARFMAG);
8901ab68c2Sbill strncpy((char *)&nh, buf, sizeof(nh));
9001ab68c2Sbill n = oh.oar_size;
9101ab68c2Sbill chkwrite(tf, (char *)&nh, sizeof(nh));
9201ab68c2Sbill while(n > 0) {
9301ab68c2Sbill i = 512;
9401ab68c2Sbill if (n<i)
9501ab68c2Sbill i = n;
9601ab68c2Sbill read(f, buf, i&01? i+1:i);
9701ab68c2Sbill if (i&01) {
9801ab68c2Sbill buf[i] = '\n';
9901ab68c2Sbill i++;
10001ab68c2Sbill }
10101ab68c2Sbill chkwrite(tf, buf, i);
10201ab68c2Sbill n -= i;
10301ab68c2Sbill }
10401ab68c2Sbill goto loop;
10501ab68c2Sbill out:
10601ab68c2Sbill lseek(f, 0L, 0);
10701ab68c2Sbill lseek(tf, 0L, 0);
10801ab68c2Sbill while((i=read(tf, buf, 512)) > 0)
10901ab68c2Sbill chkwrite(f, buf, i);
11001ab68c2Sbill close(f);
11101ab68c2Sbill close(tf);
11201ab68c2Sbill }
11301ab68c2Sbill
chkwrite(f,b,n)11401ab68c2Sbill chkwrite(f, b, n)
11501ab68c2Sbill char *b;
11601ab68c2Sbill {
11701ab68c2Sbill if (write(f, b, n) != n) {
11801ab68c2Sbill printf("arcv: write error\n");
11901ab68c2Sbill unlink(tmp);
12001ab68c2Sbill exit(1);
12101ab68c2Sbill }
12201ab68c2Sbill }
123