| 1 | static char sccsid[] = "@(#)arcv.c 4.1 %G%"; |
| 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 | } |