mouse@mcgill-vision.UUCP (der Mouse) (11/21/87)
The copytape program posted to comp.sources.unix is a very nice and
extremely useful program.  However, when it was updated recently to fix
some bugs, some other bugs were introduced.  While it may be true that
% copytape /dev/rmt8 /dev/rmt9
or
% copytape /dev/rmt8 tempfile
(switch tapes)
% copytape tempfile /dev/rmt8
will work, it is not true that
% copytape < /dev/rmt8 | rsh othermachine copytape \> /dev/rmt8
works.  This is because an assumption about the nature of data files is
made that is valid for real files but not for network connections or
pipes....  When read(...,n,...) is done on a file, the system
guarantees that if (at least) n bytes remain before end-of-file, the
read will read all n.  With a pipe or a network connection, this is not
the case.  Here is a fix to copytape to make it work across network
connections or pipes:
*** copytape.c.original	Fri Nov 20 22:42:38 1987
--- copytape.c	Fri Nov 20 22:30:01 1987
***************
*** 193,199 ****
--- 193,234 ----
      exit(0);
  }
  
+ /* When reading from a file, read(...,n,...) is guaranteed to return
+    n bytes if they are present.  When reading from a pipe or a network
+    connection, this is not the case.  Hence.... */
+ int Read(fd,buf,n)
+ int fd;
+ char *buf;
+ int n;
+ {
+  int left;
+  char *bp;
+  int did;
+  int nr;
  
+  bp = buf;
+  left = n;
+  did = 0;
+  while (left > 0)
+   { nr = read(fd,bp,left);
+     if (nr < 0)
+      { if (did == 0)
+ 	{ did = -1;
+ 	}
+        break;
+      }
+     else if (nr == 0)
+      { break;
+      }
+     else
+      { did += nr;
+        bp += nr;
+        left -= nr;
+      }
+   }
+  return(did);
+ }
+ 
  /*
   * Input up to 256K from a file or tape. If input file is a tape, then
   * do markcount stuff.  Input record length will be supplied by the
***************
*** 229,249 ****
  	};
      }
      /* Input is really a data file. */
!     l2 = read(fd, header, 5);
      if (l2 != 5 || strncmp(header, "CPTP:", 5) != 0)
  	return FORMAT_ERROR;
  
!     l2 = read(fd, header, 4);
      if (strncmp(header, "BLK ", 4) == 0) {
! 	l2 = read(fd, header, 7);
  	if (l2 != 7)
  	    return FORMAT_ERROR;
  	header[6] = '\0';
  	len = atoi(header);
! 	l2 = read(fd, tapebuf, len);
  	if (l2 != len)
  	    return FORMAT_ERROR;
! 	read(fd, header, 1);	/* skip trailing newline */
      } else if (strncmp(header, "MRK\n", 4) == 0)
  	return TAPE_MARK;
      else if (strncmp(header, "EOT\n", 4) == 0)
--- 264,284 ----
  	};
      }
      /* Input is really a data file. */
!     l2 = Read(fd, header, 5);
      if (l2 != 5 || strncmp(header, "CPTP:", 5) != 0)
  	return FORMAT_ERROR;
  
!     l2 = Read(fd, header, 4);
      if (strncmp(header, "BLK ", 4) == 0) {
! 	l2 = Read(fd, header, 7);
  	if (l2 != 7)
  	    return FORMAT_ERROR;
  	header[6] = '\0';
  	len = atoi(header);
! 	l2 = Read(fd, tapebuf, len);
  	if (l2 != len)
  	    return FORMAT_ERROR;
! 	Read(fd, header, 1);	/* skip trailing newline */
      } else if (strncmp(header, "MRK\n", 4) == 0)
  	return TAPE_MARK;
      else if (strncmp(header, "EOT\n", 4) == 0)
					der Mouse
				(mouse@mcgill-vision.uucp)mkhaw@teknowledge-vaxc.ARPA (Mike Khaw) (11/24/87)
Has anyone been able to make copytape use the freeware remote magtape
routines from vol.2 issue 21 of the old mod.sources?  I followed the
directions from that package, but they appear not to have made any
difference; i.e., you're supposed to be able to do things like
	copytape /dev/rmt8 remote_host:/dev/rmt8
(instead of having to use a pipe to rsh), but copytape never seems to
get access to the remote tape drive.
Mike Khaw
-- 
internet:  mkhaw@teknowledge-vaxc.arpa
usenet:	   {uunet|sun|ucbvax|decwrl|uw-beaver}!mkhaw%teknowledge-vaxc.arpa
USnail:	   Teknowledge Inc, 1850 Embarcadero Rd, POB 10119, Palo Alto, CA 94303david@elroy.Jpl.Nasa.Gov (David Robinson) (11/25/87)
In article <19109@teknowledge-vaxc.ARPA>, mkhaw@teknowledge-vaxc.ARPA (Mike Khaw) writes: > Has anyone been able to make copytape use the freeware remote magtape > routines from vol.2 issue 21 of the old mod.sources? I followed the > directions from that package, but they appear not to have made any > difference; i.e., you're supposed to be able to do things like > copytape /dev/rmt8 remote_host:/dev/rmt8 > (instead of having to use a pipe to rsh), but copytape never seems to > get access to the remote tape drive. > Mike Khaw I have a version of copytape that runs with the rmtlib library that was posted quite a while ago. The version of copytape is not the latest but I have had no troubles. If there is enough interest I will post a copy. -- David Robinson elroy!david@csvax.caltech.edu ARPA david@elroy.jpl.nasa.gov ames!elroy!david UUCP Disclaimer: No one listens to me anyway!