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