dpb@SUN.COM (Don Bennett 433-3311, 408) (03/26/89)
Running tar-1.05 on a sun-3, Sun-os 3.5 running tar, /etc/rmt on Sun-os 4.0, but I hope that doesn't matter: 1) Reblocking code doesn't right when writing a compressed tar file to a remote tape drive. When writing the last block, at least to the device /dev/rst8, the number of bytes written must be a multiple of 512. Recreate the problem via: tar cvzf poplar:/dev/rst8 ./stuff 2) When unpacking a compressed tar file from disc, tar decides it has reached the end of the archive and closes the pipe while compress is still writing some garbage into it. Included are patches I use to fix these problems. *** tar-1.05/buffer.c.orig Thu Mar 2 09:56:32 1989 --- tar-1.05/buffer.c Thu Mar 23 14:19:00 1989 *************** *** 402,408 **** } } else { for(;;) { ! int n; char *ptr; n=blocksize; --- 402,408 ---- } } else { for(;;) { ! int n, partialBlock; char *ptr; n=blocksize; *************** *** 416,426 **** } /* EOF */ if(err==0) { ! blocksize-=n; ! err=rmtwrite(archive,ar_block->charptr,blocksize); ! if(err!=(blocksize)) writeerror(err); - blocksize+=n; break; } if(n) { --- 416,426 ---- } /* EOF */ if(err==0) { ! partialBlock=blocksize-n; ! partialBlock = (partialBlock+511)&(~0x1ff); ! err=rmtwrite(archive,ar_block->charptr,partialBlock); ! if(err!=(partialBlock)) writeerror(err); break; } if(n) { *************** *** 1031,1037 **** } if(f_verify) verify_volume(); ! (void) rmtclose(archive); #ifndef MSDOS if (childpid) { --- 1031,1043 ---- } if(f_verify) verify_volume(); ! ! if (ar_reading && f_reblock) { ! static char junkbuf[1024]; ! while (read(archive, junkbuf, 1024) > 0) ! ; ! } else ! (void) rmtclose(archive); #ifndef MSDOS if (childpid) {