On Sun, 24 Oct 2004, Ethan Dicks wrote:
  On Sun, Oct 24, 2004 at 03:11:33PM -0500, Doc Shipley
wrote:
    Linux has the Unix-standard mt command, too,
which allows setting the
 blocksize the system device uses, either explicitly or to a variable
 blocksize. 
 Ah... I have never used that facet of 'mt' before (but I use mt on Linux
 all the time, practically daily, with our SDLTs). 
You dont need 'mt' (under
any UNIX system) to read non-local tape
formats.  It doesn't even work that way: by using 'mt' to set the
block size, you only set its *reblocking* factor.
When reading raw tapes (meaning: read them, as they come), you need
to tell the driver exactly that: no cooking up block sizes, just
give the user whatever comes in.
Usually, this is handled by opening the "raw" mode device for that
tape.  I don't use Linux, but assuming it at least TRIES to adhere
to a standard, you should be able to use
        /dev/r{nameoftape}{unitnumber}
as in
        /dev/rst0
for the first detected tape unit on the SCSI bus.
This causes the driver to disable reblocking, and allocate a large
buffer space so it can cope with whatever comes its way.  Older
systems had a limit of 16KB in that buffer, this is probably more
like 64KB nowadays.
So, your program does
        fd = open("/dev/rst0", READ)
and then enters a loop, reading blocks from the tape:
        for(;;) {
                len = read(fd, mybuff, sizeof(mybuff))
                if (len < 0)
                        /* we have problems, scotty, beam us up! */
                /* len now has the size of the block we just read */
        }
where usually, a length of 0 indicates an EOF (end of logical file,
aka "first tape mark detected") or EOT (end of tape, aka "second
consequtive tape mark detected") situation.
--f