78 lines
1.9 KiB
Diff
78 lines
1.9 KiB
Diff
--- src/util.c
|
|
+++ src/util.c
|
|
@@ -188,8 +188,15 @@ tape_fill_input_buffer (int in_des, int
|
|
input_size = rmtread (in_des, input_buffer, num_bytes);
|
|
if (input_size == 0 && input_is_special)
|
|
{
|
|
- get_next_reel (in_des);
|
|
+ if (!tape_eof (in_des))
|
|
+ get_next_reel (in_des);
|
|
input_size = rmtread (in_des, input_buffer, num_bytes);
|
|
+ if (input_size == 0)
|
|
+ {
|
|
+ if (tape_eod (in_des))
|
|
+ get_next_reel (in_des);
|
|
+ input_size = rmtread (in_des, input_buffer, num_bytes);
|
|
+ }
|
|
}
|
|
if (input_size < 0)
|
|
error (1, errno, _("read error"));
|
|
@@ -354,8 +361,15 @@ tape_buffered_peek (char *peek_buf, int
|
|
{
|
|
if (input_is_special)
|
|
{
|
|
- get_next_reel (in_des);
|
|
+ if (!tape_eof (in_des))
|
|
+ get_next_reel (in_des);
|
|
tmp_input_size = rmtread (in_des, append_buf, io_block_size);
|
|
+ if (tmp_input_size == 0)
|
|
+ {
|
|
+ if (tape_eod (in_des))
|
|
+ get_next_reel (in_des);
|
|
+ tmp_input_size = rmtread (in_des, append_buf, io_block_size);
|
|
+ }
|
|
}
|
|
else
|
|
break;
|
|
@@ -828,6 +842,40 @@ tape_offline (int tape_des)
|
|
#endif
|
|
}
|
|
|
|
+int
|
|
+tape_eof( int tape_des)
|
|
+{
|
|
+ struct mtget status;
|
|
+
|
|
+ if (rmtioctl (tape_des, MTIOCGET, (char*)&status) == -1) {
|
|
+ error (1, errno, "Cannot get tape status");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ if (GMT_EOF(status.mt_gstat)) {
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int
|
|
+tape_eod( int tape_des)
|
|
+{
|
|
+ struct mtget status;
|
|
+
|
|
+ if (rmtioctl (tape_des, MTIOCGET, (char*)&status) == -1) {
|
|
+ error (1, errno, "Cannot get tape status");
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ if (GMT_EOD(status.mt_gstat)) {
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
/* The file on file descriptor TAPE_DES is assumed to be magnetic tape
|
|
(or floppy disk or other device) and the end of the medium
|
|
has been reached. Ask the user for to mount a new "tape" to continue
|