diff -urd taper-6.8.4.orig/backup.c taper-6.8.4/backup.c
--- taper-6.8.4.orig/backup.c	Thu Mar  5 01:29:19 1998
+++ taper-6.8.4/backup.c	Mon Mar  9 07:37:44 1998
@@ -497,12 +497,15 @@
 
     char s[200], s1[200], s2[200], s3[200];
     time_t t_elapsed;
+static int prop= 0;
+static char propchar[] = "-/|\\";
     
     signal(SIGALRM, SIG_IGN);	 /* reset alarm */
     if (!other_mes) {
 	t_elapsed=s_tcurrent-s_tstart;
 	status_box(s_mes, s_idata.name, 0, FALSE, 1);
-	sprintf(s, "File %d of %d",  s_count, s_noarchive);
+	sprintf(s, "File %d of %d (%c)",  s_count, s_noarchive, propchar[prop]);
+        prop++; prop &=3;
 	status_box(s_mes, s, 2, FALSE, 1);
 	sprintf(s, "Processed %s of %s", print_kb(s2, bytes_processed), 
 		print_kb(s3, total_selected));
@@ -540,6 +543,7 @@
 	}
     }
     signal(SIGALRM, backup_alarm);	 /* reset alarm */
+    retrigger_alarm();
 }
 
 
Only in taper-6.8.4: backup.c.orig
Only in taper-6.8.4: backup.c.rej
diff -urd taper-6.8.4.orig/common.c taper-6.8.4/common.c
--- taper-6.8.4.orig/common.c	Tue Mar  3 04:34:51 1998
+++ taper-6.8.4/common.c	Mon Mar  9 07:26:16 1998
@@ -2312,6 +2312,7 @@
 
 void set_1s_timer()
 {
+#ifdef BSD_SIGNALS
     /* Sets a 1 second timer */    
     struct itimerval itv1;
     struct timeval itv, val;
@@ -2323,11 +2324,15 @@
     itv1.it_value = val;
     itv1.it_interval = itv;
     setitimer(ITIMER_REAL, &itv1, NULL);
+#else
+    alarm(1);
+#endif
 }
 
 
 void reset_timer()
 {
+#ifdef BSD_SIGNALS
     /* Clears timer * - all resets signal handler */
     struct itimerval itv1;
     struct timeval itv, val;
@@ -2339,7 +2344,18 @@
     itv1.it_value = val;
     itv1.it_interval = itv;
     setitimer(ITIMER_REAL, &itv1, NULL);
+#else
+    alarm(0);
+#endif
     signal(SIGALRM, SIG_DFL);
+}
+
+
+void retrigger_alarm()
+{
+#ifndef BSD_SIGNALS
+    alarm(1);
+#endif
 }
 
 
Only in taper-6.8.4: common.c.orig
diff -urd taper-6.8.4.orig/common.h taper-6.8.4/common.h
--- taper-6.8.4.orig/common.h	Mon Aug 11 13:31:46 1997
+++ taper-6.8.4/common.h	Mon Mar  9 07:26:16 1998
@@ -84,6 +84,7 @@
 extern _errstat write_u32(int fd, _u32 *x);
 extern void set_1s_timer();
 extern void reset_timer();
+extern void retrigger_alarm();
 
 /* Info file struff */
 extern _errstat read_volume_info();
Only in taper-6.8.4: common.h.orig
diff -urd taper-6.8.4.orig/mkinfo.c taper-6.8.4/mkinfo.c
--- taper-6.8.4.orig/mkinfo.c	Tue Mar  3 04:34:52 1998
+++ taper-6.8.4/mkinfo.c	Mon Mar  9 07:26:16 1998
@@ -113,6 +113,7 @@
 	status_box(s_mes_box, scr, 7, FALSE, 1);
     }
     signal(SIGALRM, mkinfo_alarm);
+    retrigger_alarm();
 }
 
 PUBLIC _errstat mkinfoce(struct file_info *fi, char *fn)
Only in taper-6.8.4: mkinfo.c.orig
diff -urd taper-6.8.4.orig/tapeio.c taper-6.8.4/tapeio.c
--- taper-6.8.4.orig/tapeio.c	Sat Aug  9 01:52:17 1997
+++ taper-6.8.4/tapeio.c	Mon Mar  9 07:26:17 1998
@@ -234,7 +234,7 @@
     _s32 tb;
     char s[200];
     
-    if (!can_seek) return -1;			 /* can't seek */
+    if (!can_seek && !can_fsr) return -1;	 /* can't seek or fsr */
     if (is_regfile(dv)) {
 	if (log_level > 2) write_log("File seek to correct block");
 	if (toblock < blocks_passed) return 0;
@@ -258,12 +258,25 @@
 	sprintf(s, "tell returned %d", tb);
 	write_log(s);
     }
-    if (log_level > 2) write_log("ioctl seek");
-    m.mt_op = MTSEEK;
-    m.mt_count = toblock+(tb-blocks_passed);
-    if (tb-blocks_passed) {
-      sprintf(s, "seek is adjusting %d", tb-blocks_passed);
-      if (log_level > 2) write_log(s);
+    if( can_fsr )
+    {
+	if (log_level > 2) write_log("ioctl fsr");
+	m.mt_op = MTFSR;
+	m.mt_count = toblock-blocks_passed;
+	if (toblock-blocks_passed) {
+	  sprintf(s, "fsr by %d records", toblock-blocks_passed);
+	  if (log_level > 2) write_log(s);
+	}
+    }
+    else if( can_seek )
+    {
+	if (log_level > 2) write_log("ioctl seek");
+	m.mt_op = MTSEEK;
+	m.mt_count = toblock+(tb-blocks_passed);
+	if (tb-blocks_passed) {
+	  sprintf(s, "seek is adjusting %d", tb-blocks_passed);
+	  if (log_level > 2) write_log(s);
+	}
     }
     if (rmtioctl(dv, MTIOCTOP, (char *) &m) != -1) {
 	blocks_passed = toblock;
@@ -629,17 +642,41 @@
     char s[100];
     _s32 obs;
 
-    if (get_blksize) {
-	if (log_level > 2) write_log("Getting block size");
+    if (is_regfile(x)) return 0;
+
+    if (get_blksize && tape_type == TAPE_TYPE_ZFTAPE) {
+	if (log_level > 2) write_log("Getting zftape block size");
 	m.mt_blksz = block_size;
 	obs = block_size;
-	err = (is_regfile(x)) ? 0 : rmtioctl(x, MTIOC_ZFTAPE_GETBLKSZ, (char *) &m);
+	err = rmtioctl(x, MTIOC_ZFTAPE_GETBLKSZ, (char *) &m);
 	if (err == -1) 
 	 do_exit(ERROR_GETTING_BLKSIZE);
 	else
 	  block_size = m.mt_blksz;
 	sprintf(s, "Got block size %d", block_size);
 	if (log_level > 2) write_log(s);
+	if (block_size < 1025) {		 /* if got block size <1025, means that */
+	    block_size = obs;			 /* block size hasn't been set for this */
+	    tape_set_blk_size();		 /* volume - so set it */
+	}
+	else
+	  if (init_buffers(1) == -1) return -1;	 /* reallocate buffer sizes */
+    }
+    else if (get_blksize) {
+        struct mtget status;
+	if (log_level > 2) write_log("Getting standard block size");
+
+	obs = block_size;
+	err = rmtioctl(x, MTIOCGET, &status);
+	if (err == -1) 
+	 do_exit(ERROR_GETTING_BLKSIZE);
+	else
+	 block_size =
+	     ((status.mt_dsreg & MT_ST_BLKSIZE_MASK) >> MT_ST_BLKSIZE_SHIFT);
+
+	sprintf(s, "Got block size %d", block_size);
+	if (log_level > 2) write_log(s);
+
 	if (block_size < 1025) {		 /* if got block size <1025, means that */
 	    block_size = obs;			 /* block size hasn't been set for this */
 	    tape_set_blk_size();		 /* volume - so set it */
Only in taper-6.8.4: tapeio.c.orig
diff -urd taper-6.8.4.orig/taper.c taper-6.8.4/taper.c
--- taper-6.8.4.orig/taper.c	Sun Dec 28 06:48:24 1997
+++ taper-6.8.4/taper.c	Mon Mar  9 07:26:17 1998
@@ -563,6 +563,7 @@
 	if (*ntape == -1) strcpy(ntape, FTAPE_DEFAULT_NTAPE);
 	if (fast_fsf == -1) fast_fsf = 0;
 	if (can_seek == -1) can_seek = 0;
+	if (can_fsr == -1) can_fsr = 0;
 	if (set_blksize == -1) set_blksize = 0;
 	if (get_blksize == -1) get_blksize = 0;
 	if (illegal_eot == -1) illegal_eot = 0;
@@ -578,6 +579,7 @@
 	if (set_blksize == -1) set_blksize = 1;
 	if (get_blksize == -1) get_blksize = 1;
 	if (can_seek == -1) can_seek = 1;
+	if (can_fsr == -1) can_fsr = 0;
 	if (illegal_eot == -1) illegal_eot = 0;
 	have_rewind = 1;
 	have_fsf = 1;
@@ -589,6 +591,7 @@
 	if (*ntape == -1) strcpy(ntape, SCSI_DEFAULT_NTAPE);
 	if (fast_fsf == -1) fast_fsf = 1;
 	if (can_seek == -1) can_seek = 1;
+	if (can_fsr == -1) can_fsr = 1;
 	if (set_blksize == -1) set_blksize = 0;
 	if (get_blksize == -1) get_blksize = 0;
 	if (illegal_eot == -1) illegal_eot = 0;
@@ -601,6 +604,7 @@
 	if (*tape == -1) strcpy(tape, "");
 	if (*ntape == -1) strcpy(ntape, "");
 	can_seek = 1;
+	can_fsr = 0;
 	fast_fsf = 0;
 	set_blksize = 0;
 	get_blksize = 0;
@@ -615,6 +619,7 @@
 	if (*ntape == -1) strcpy(ntape, REMOVABLE_DEFAULT_NTAPE);
 	fast_fsf = 0;
 	if (can_seek == -1) can_seek = 0;
+	if (can_fsr == -1) can_fsr = 0;
 	if (illegal_eot == -1) illegal_eot = 0;
 	set_blksize = 0;
 	get_blksize = 0;
@@ -628,6 +633,7 @@
 	if (*ntape == -1) strcpy(ntape, IDE_DEFAULT_NTAPE);
 	if (fast_fsf == -1) fast_fsf = 1;
 	if (can_seek == -1) can_seek = 0;
+	if (can_fsr == -1) can_fsr = 0;
 	if (set_blksize == -1) set_blksize = 0;
 	if (get_blksize == -1) get_blksize = 0;
 	if (illegal_eot == -1) illegal_eot = 0;
@@ -659,7 +665,7 @@
 }
 
 
-PRIVATE void num_to_string(_s32 num, int rev, int top, int line, char *strings[])
+PRIVATE void num_to_string(_s32 num, int rev, int top, int step, int line, char *strings[])
 {
 /* Converts an option to a string. Num is the string assumed to
  * be selected. Strings points to an array of strings which is
@@ -686,14 +692,14 @@
 	    if (rev)
 	      wattron(win_main, A_REVERSE);
 	}
-	mvwaddstr(win_main, top+line*2, sp[c1], strings[c1]);
+	mvwaddstr(win_main, top+line*step, sp[c1], strings[c1]);
 	wattroff(win_main, A_UNDERLINE);
 	wattroff(win_main, A_REVERSE);
     }
 }
 
 
-PRIVATE void print_pref_line(struct pref_info options[], int c, int top, int rev)
+PRIVATE void print_pref_line(struct pref_info options[], int c, int top, int step, int rev)
 {
     char *py[]={"NO", "YES", NULL};
     char *pS[]={"LINK", "FILE", NULL};
@@ -705,45 +711,45 @@
     switch(options[c].type) {
        case 'I':				 /* integer */
 	if (rev) wattron(win_main, A_REVERSE);
-	mvwprintw(win_main, top+c*2, 33, "%02d", *((_s32 *) (options[c].opt))) ; 
+	mvwprintw(win_main, top+c*step, 33, "%02d", *((_s32 *) (options[c].opt))) ; 
 	wattroff(win_main, A_REVERSE);
 	break;
        case 'B':				 /* block size */
         if (rev) wattron(win_main, A_REVERSE);
-	mvwprintw(win_main, top+c*2, 33, "%03dK", *((_s32 *) (options[c].opt))/1024) ; 
+	mvwprintw(win_main, top+c*step, 33, "%03dK", *((_s32 *) (options[c].opt))/1024) ; 
 	wattroff(win_main, A_REVERSE);
 	break;
      case 'Y':				 /* yes/no */
-	num_to_string(*((char *) options[c].opt), rev, top, c, py);
+	num_to_string(*((char *) options[c].opt), rev, top, step, c, py);
 	break;
     case 's':
-	num_to_string(*((char *) options[c].opt), rev, top, c, pS);
+	num_to_string(*((char *) options[c].opt), rev, top, step, c, pS);
 	break;
      case 'L':				 /* log level */
-	num_to_string(*((char *) options[c].opt), rev, top, c, pl);
+	num_to_string(*((char *) options[c].opt), rev, top, step, c, pl);
 	break;
      case 'C':				 /* compression type */
-	num_to_string(*((char *) options[c].opt), rev, top, c, pc);
+	num_to_string(*((char *) options[c].opt), rev, top, step, c, pc);
 	break;
        case 'O':				 /* overwrite level */
-	num_to_string(*((char *) options[c].opt), rev, top, c, po);
+	num_to_string(*((char *) options[c].opt), rev, top, step, c, po);
 	break;
      case 'T':
-	 num_to_string(*((char *) options[c].opt), rev, top, c, pt);
+	 num_to_string(*((char *) options[c].opt), rev, top, step, c, pt);
 	break;
     }
 }
 
 
-PRIVATE void print_option_screen(struct pref_info *options, int top, int count, int allab)
+PRIVATE void print_option_screen(struct pref_info *options, int top, int count, int allab, int step)
 {
     int c;
     
     for (c=0; c<count; c++) {
 	wattron(win_main, A_BOLD);
-	mvwaddstr(win_main, top+c*2, 30-strlen(options[c].name), options[c].name);
+	mvwaddstr(win_main, top+c*step, 30-strlen(options[c].name), options[c].name);
 	wattroff(win_main, A_BOLD);
-	print_pref_line(options, c, top, 0);
+	print_pref_line(options, c, top, step, 0);
     }
     (allab) ?
       centre(win_main, win_main->_maxy-1, "Arrow keys to move, F5 abort, ESC finish", COLOR_FORM) :
@@ -760,14 +766,14 @@
     if (*c<0) *c=max;
 }
 
-PRIVATE void change_tt_defaults(struct pref_info *options, int top, _s8 allab, FIELD *fields[])
+PRIVATE void change_tt_defaults(struct pref_info *options, int top, _s8 allab, int step, FIELD *fields[])
 {
 /* See if user wants new defaults based on this tape drive */    
     int c=0, c1;
 
     while (options[c].name)			 /* count # options */
 	c++;
-    print_option_screen(options, top, c, allab);
+    print_option_screen(options, top, c, allab, step);
     if (!message_box("Change to type defaults", MB_YESNO))
       return;
     erase_tape = -1; block_size = -1;
@@ -783,17 +789,17 @@
     fast_fsf = -1; set_blksize = -1;
     get_blksize = -1;
     fill_in_defaults();				 /* reset defaults */
-    print_option_screen(options, top, c, allab);
+    print_option_screen(options, top, c, allab, step);
     touchwin(win_main); wrefresh(win_main);
 }
 
 
-PRIVATE void option_left(struct pref_info *options, _s32 op, int top, _s8 allab, FIELD *fields[])
+PRIVATE void option_left(struct pref_info *options, _s32 op, int top, _s8 allab,int step, FIELD *fields[])
 {
     switch(options[op].type) {
      case 'T':
 	do_left(options[op].opt, 3);
-	change_tt_defaults(options, top, allab, fields);
+	change_tt_defaults(options, top, allab, step, fields);
 	break;
      case 'L':
 	do_left(options[op].opt, 5);
@@ -821,7 +827,7 @@
 	  *((_s32 *) options[op].opt) = 99;
 	break;
     }
-    print_pref_line(options, op, top, 1);
+    print_pref_line(options, op, top, step, 1);
 }
 
 	  
@@ -834,12 +840,12 @@
     if (*c>max) *c=0;
 }
       
-PRIVATE void option_right(struct pref_info *options, _s32 op, int top, _s8 allab, FIELD *fields[])
+PRIVATE void option_right(struct pref_info *options, _s32 op, int top, _s8 allab, int step, FIELD *fields[])
 {
     switch(options[op].type) {
      case 'T':
 	do_right(options[op].opt, 3);
-	change_tt_defaults(options, top, allab, fields);
+	change_tt_defaults(options, top, allab, step, fields);
 	break;
      case 'L':
 	do_right(options[op].opt, 4);
@@ -867,7 +873,7 @@
 	  *((_s32 *) options[op].opt) = 0;
 	break;
     }
-    print_pref_line(options, op, top, 1);
+    print_pref_line(options, op, top, step, 1);
 }
 
 	
@@ -925,17 +931,20 @@
     FORM *form;
     char  tmp[100];
     int   *intp;
+    int   step = 2;
 
     count=0;					 /* count number options */
     while (options[count].name) {
 	count++;
     }
     
-    top = (win_main->_maxy - (count * 2)) / 2;	 /* print screen template */
+    top = (win_main->_maxy - (count * step)) / 2;	 /* print screen template */
+    if( top < 0 ) step = 1;
+    top = (win_main->_maxy - (count * step)) / 2;	 /* print screen template */
     k1=0;
     for (c=0; c<count;c++) {			 /* now setup forms fields */
 	if (options[c].type == 'S') {
-	    fields[k1] = new_field(1, 40, top+c*2, 33, 15, 0);
+	    fields[k1] = new_field(1, 40, top+c*step, 33, 15, 0);
 	    field_opts_off(fields[k1], O_STATIC); 
 	    set_field_back(fields[k1], COLOR_PAIR(COLOR_FORM)|A_REVERSE);
 	    set_max_field(fields[k1], 0); 
@@ -943,7 +952,7 @@
 	    k1++;
 	}
 	if (options[c].type == 'N') {
-	    fields[k1] = new_field(1, 40, top+c*2, 33, 1, 0);
+	    fields[k1] = new_field(1, 40, top+c*step, 33, 1, 0);
 	    field_opts_off(fields[k1], O_STATIC); 
 	    set_field_back(fields[k1], COLOR_PAIR(COLOR_FORM)|A_REVERSE);
 	    set_max_field(fields[k1], 0); 
@@ -959,19 +968,19 @@
     set_form_win(form, win_main);  
     my_werase(win_main, COLOR_FORM); 
     post_form(form);
-    print_option_screen(options, top, count, allab);
+    print_option_screen(options, top, count, allab, step);
     c=0;
-    print_pref_line(options, c, top, 1);
+    print_pref_line(options, c, top, step, 1);
     curs_set( ((options[c].type == 'S') || (options[c].type == 'N')) ? 1: 0);
     wrefresh(win_main);
-    wmove(win_main, top+c*2, 33);
+    wmove(win_main, top+c*step, 33);
     while (1) {
 	k = wgetch(win_main);
 	if ( ((options[c].type == 'S') || (options[c].type == 'N')) && 
 	    (k != EXIT_KEY))
 	  if (do_form_driver(form, fields, k, c, count, options) == -1)
 	    continue;				 /* processed key */
-	print_pref_line(options, c, top, 0);
+	print_pref_line(options, c, top, step, 0);
 	switch(k) {
 	 case KEY_DOWN:
 	 case '\n':
@@ -1010,9 +1019,9 @@
 	    curs_set(0);
 	    return 1;
 	 case KEY_LEFT:
-	    option_left(options, c, top, allab, fields); break;
+	    option_left(options, c, top, allab, step, fields); break;
 	 case KEY_RIGHT:
-	    option_right(options, c, top, allab, fields); break;
+	    option_right(options, c, top, allab, step, fields); break;
 	 default:
 	      help = my_newwin(13, curscr->_maxx-10,
 			       (curscr->_maxy-13)/2,
@@ -1032,7 +1041,7 @@
 	      wrefresh(help);
 	      wgetch(help);
 	      my_delwin(help);
-	      print_option_screen(options, top, count, allab);
+	      print_option_screen(options, top, count, allab, step);
 	      touchwin(win_main); wrefresh(win_main);
 	      break;
 	}
@@ -1040,8 +1049,8 @@
 	if (c==count) c= 0;
 	
 	curs_set( ((options[c].type == 'S') || (options[c].type == 'N')) ? 1: 0);
-	wmove(win_main, top+c*2, 33);
-	print_pref_line(options, c, top, 1);
+	wmove(win_main, top+c*step, 33);
+	print_pref_line(options, c, top, step, 1);
 	wrefresh(win_main);
     }
     return -1;                         /* Should never get here */
@@ -1258,11 +1267,12 @@
 	"Restore/Mkinfo preferences", "Unattended preferences",
 	"Back to main menu", NULL};
     struct pref_info tapedrive_options[] = {
-/*	{"Tape drive tape", &tape_type, 'T', 0}, */
+  	/* {"Tape drive tape", &tape_type, 'T', 0}, */
 	{"Rewinding device", tape, 'S', MAX_FNAME},
 	{"Non-rewinding device", ntape, 'S', MAX_FNAME},
 	{"Have fast fsf", &fast_fsf, 'Y', 0},
 	{"Can seek", &can_seek, 'Y', 0},  
+	{"Can fsr", &can_fsr, 'Y', 0}, 
 	{"Set block size", &set_blksize, 'Y', 0},
 	{"Get block size", &get_blksize, 'Y', 0},
 	{"Block size", &block_size, 'B', 0},
Only in taper-6.8.4: taper.c.orig
diff -urd taper-6.8.4.orig/vars.c taper-6.8.4/vars.c
--- taper-6.8.4.orig/vars.c	Tue Mar  3 04:34:52 1998
+++ taper-6.8.4/vars.c	Mon Mar  9 07:26:17 1998
@@ -28,6 +28,7 @@
     {"--auto-descend", 'D', &auto_descend, NULL, 'Y', TRUE},
     {"--prompt-archive", 'e', &prompt_archive, NULL, 'Y', TRUE},	 
     {"--can-seek", 'E', &can_seek, NULL, 'Y', FALSE},  
+    {"--can-fsr", 'E', &can_fsr, NULL, 'Y', FALSE},  
     {"--tape-name", 'f', tape, NULL, 'S', FALSE},
     {"--exclude-files", 'F', exclude_files, NULL, 'S', TRUE},
     {"--volume-title", 'g', volume_title, NULL, 'S', TRUE},
@@ -189,6 +190,7 @@
 signed int  fast_fsf=-1;			 /*   drive selected */
 signed int  block_size=-1;			 /* is used for reading/writing data to/from tape device */
 signed int  can_seek=-1;			 /* whether tape drive can seek or not */
+signed int  can_fsr=-1;			 	 /* does the tape understand fsr&bsr ?  */
 signed int  illegal_eot=-1;			 /* how to handle end of tape */
 
 
Only in taper-6.8.4: vars.c.orig
diff -urd taper-6.8.4.orig/vars.h taper-6.8.4/vars.h
--- taper-6.8.4.orig/vars.h	Tue Mar  3 04:34:52 1998
+++ taper-6.8.4/vars.h	Mon Mar  9 07:26:17 1998
@@ -115,6 +115,7 @@
 extern signed int   have_rewind;			 
 extern signed int   have_fsf;
 extern signed int   can_seek;
+extern signed int   can_fsr;
 extern signed int illegal_eot;			 /* end of tape handling */
 
 /* File counts and archive size counts */
