1 static char sccsid[] = "@(#)arcv.c 4.1 10/01/80"; 2 /* 3 * arcv - convert old to new archive format 4 */ 5 6 #include <signal.h> 7 #include <ar.h> 8 #define OARMAG 0177545 9 struct oar_hdr { 10 char oar_name[14]; 11 long oar_date; 12 char oar_uid; 13 char oar_gid; 14 int oar_mode; 15 long oar_size; 16 }; 17 18 struct ar_hdr nh; 19 struct oar_hdr oh; 20 char *tmp; 21 char *mktemp(); 22 int f; 23 char buf[512]; 24 int tf; 25 main(argc, argv) 26 char *argv[]; 27 { 28 register i; 29 30 if (argc>1 && strcmp(argv[1], "-t")==0) { 31 tmp = mktemp("/usr/tmp/arcXXXXXX"); 32 argc--; 33 argv++; 34 } else 35 tmp = mktemp("/tmp/arcXXXXXX"); 36 for(i=1; i<4; i++) 37 signal(i, SIG_IGN); 38 for(i=1; i<argc; i++) { 39 if (argc>1) 40 printf("%s:\n", argv[i]); 41 conv(argv[i]); 42 } 43 unlink(tmp); 44 return(0); 45 } 46 47 conv(fil) 48 char *fil; 49 { 50 int oldmagic; 51 long n; 52 unsigned i; 53 54 f = open(fil, 2); 55 if(f < 0) { 56 printf("arcv: cannot open %s\n", fil); 57 return; 58 } 59 close(creat(tmp, 0600)); 60 tf = open(tmp, 2); 61 if(tf < 0) { 62 printf("arcv: cannot open temp\n"); 63 close(f); 64 return; 65 } 66 oldmagic = 0; 67 read(f, (char *)&oldmagic, sizeof(oldmagic)); 68 if(oldmagic != 0177545) { 69 printf("arcv: %s not old archive format\n", fil); 70 close(tf); 71 close(f); 72 return; 73 } 74 chkwrite(tf, ARMAG, SARMAG); 75 loop: 76 i = read(f, (char *)&oh, sizeof(oh)); 77 if(i != sizeof(oh)) 78 goto out; 79 80 sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s", 81 oh.oar_name, 82 oh.oar_date, 83 oh.oar_uid, 84 oh.oar_gid, 85 (unsigned short)oh.oar_mode, 86 oh.oar_size, 87 ARFMAG); 88 strncpy((char *)&nh, buf, sizeof(nh)); 89 n = oh.oar_size; 90 chkwrite(tf, (char *)&nh, sizeof(nh)); 91 while(n > 0) { 92 i = 512; 93 if (n<i) 94 i = n; 95 read(f, buf, i&01? i+1:i); 96 if (i&01) { 97 buf[i] = '\n'; 98 i++; 99 } 100 chkwrite(tf, buf, i); 101 n -= i; 102 } 103 goto loop; 104 out: 105 lseek(f, 0L, 0); 106 lseek(tf, 0L, 0); 107 while((i=read(tf, buf, 512)) > 0) 108 chkwrite(f, buf, i); 109 close(f); 110 close(tf); 111 } 112 113 chkwrite(f, b, n) 114 char *b; 115 { 116 if (write(f, b, n) != n) { 117 printf("arcv: write error\n"); 118 unlink(tmp); 119 exit(1); 120 } 121 } 122