[gnu.utils.bug] GNU tar 1.05 bugs and fix

bart@videovax.tv.Tek.com (Bart Massey) (05/19/89)

GNU tar is great!  I'm really impressed -- it contains every feature I was
thinking about hacking into Berkeley tar!

But, I've had a few problems...

PROGRAM: GNU tar
VERSION: 1.05
MACHINE: VAX 750
OS: 4.3BSD "Tahoe"

PROBLEM:
	Archive creation leaks memory, eventually causing a premature
	out-of-memory exit.
REPEAT-BY:
	Find a machine with 1.5g of disk.  cd to the root, and
	say "find . ! -type d -print > /tmp/list".  Then say
	"cat /tmp/list | tar cT -".  Then wait.  And wait.
SUGGESTED-FIX:
	Somebody needs to run it with a allocation-tracking malloc.  I
	will get around to this if no one else is enthused.


PROBLEM:
	The W option doesn't use MTIOCTOP to rewind the tape drive, even
	on machines that support it.  Also, this option prints "Verify"
	for each file, which is really annoying.
REPEAT-BY:
	tar cWf /dev/tape-drive-that-requires-MTIOCTOP .
	Watch for the error message(s).
FIX:
	Insert some forgotten includes into diffarch.c, and comment
	out the annoying message.
	*** /tmp/,RCSt1027805	Thu May 18 17:56:22 1989
	--- diffarch.c	Tue May 16 18:34:55 1989
	***************
	*** 34,39 ****
	--- 34,46 ----
	  #include <sys/file.h>
	  #endif
	  
	+ #ifndef MSDOS
	+ #include <sys/ioctl.h>
	+ #ifndef USG
	+ #include <sys/mtio.h>
	+ #endif
	+ #endif
	+ 
	  #ifdef USG
	  #include <fcntl.h>
	  #endif
	***************
	*** 120,127 ****
	--- 127,136 ----
	  	userec(head);			/* And go past it in the archive */
	  	decode_header(head, &hstat, &head_standard, 1);	/* Snarf fields */
	  
	+ #if 0
	  	if(now_verifying)
	  		fprintf(msg_file,"Verify ");
	+ #endif
	  	/* Print the record from 'head' and 'hstat' */
	  	if (f_verbose)
	  		print_header();
	

PROBLEM:
	On a reasonable sized screen, the usage message scrolls the
	error message off the top.
REPEAT-BY:
	tar qqq
FIX:
	The following patches make the usage message appear only when
	the "-help" switch is given.
	*** /tmp/,RCSt1027993	Thu May 18 19:27:15 1989
	--- tar.c	Thu May 18 16:38:43 1989
	***************
	*** 168,174 ****
	  	case CMD_NONE:
	  		fprintf (stderr,
	  "%s: you must specify exactly one of the r, c, t, x, or d options\n", tar);
	- 		describe();
	  		exit(EX_ARGSBAD);
	  	}
	  	exit(0);
	--- 168,173 ----
	***************
	*** 274,282 ****
	  
	  		case 'h':
	  			if(optind && argv[optind] && !strcmp(argv[optind],"-help")) {
	! 				printf("This is GNU tar, the tape archiving program.\n");
	  				describe();
	! 				printf("For a more complete description of how to use tar, type 'info util tar'\n");
	  				exit(1);
	  			} else
	  				f_follow_links++;	/* follow symbolic links */
	--- 273,281 ----
	  
	  		case 'h':
	  			if(optind && argv[optind] && !strcmp(argv[optind],"-help")) {
	! 				fprintf(stderr,"This is GNU tar, the tape archiving program.\n");
	  				describe();
	! 				fprintf(stderr,"For a more complete description of how to use tar, type 'info util tar'\n");
	  				exit(1);
	  			} else
	  				f_follow_links++;	/* follow symbolic links */
	***************
	*** 418,424 ****
	  
	  		case '?':
	  		badopt:
	! 			describe();
	  			exit(EX_ARGSBAD);
	  
	  		}
	--- 417,423 ----
	  
	  		case '?':
	  		badopt:
	! 			fprintf(stderr, "%s: bad option -- try -help\n", tar);
	  			exit(EX_ARGSBAD);
	  
	  		}