* fhandler.h (class fhandler_dev_raw): Add drive information members

drive_size, current_position and bytes_per_sector.
	(fhandler_dev_floppy::get_drive_info): Declare.
	* fhandler_floppy.cc (fhandler_dev_floppy::is_eom): Define ERROR_SEEK
	and ERROR_SECTOR_NOT_FOUND as end-of-medium conditions.
	(fhandler_dev_floppy::get_drive_info): New method to have one function
	retrieving drive info.
	(fhandler_dev_floppy::open): Call get_drive_info to get drive
	information right from the start.
	(fhandler_dev_floppy::lseek): Use and set drive information members.
	Especially keep track of current_position.
	(fhandler_dev_floppy::ioctl): Ditto.
	* fhandler_raw.cc (fhandler_dev_raw::write_file): Keep track of
	current_position.
	(fhandler_dev_raw::read_file): Ditto.
	(fhandler_dev_raw::raw_read): Never try to read beyond end-of-medium.
	(fhandler_dev_raw::dup): Handle new drive information members.
This commit is contained in:
Corinna Vinschen
2005-09-26 14:55:40 +00:00
parent d5f4ee62b7
commit b470a0e81f
4 changed files with 126 additions and 150 deletions

View File

@@ -51,6 +51,8 @@ fhandler_dev_raw::write_file (const void *buf, DWORD to_write,
*err = 0;
if (!(ret = WriteFile (get_handle (), buf, to_write, written, 0)))
*err = GetLastError ();
else
current_position += *written;
syscall_printf ("%d (err %d) = WriteFile (%d, %d, write %d, written %d, 0)",
ret, *err, get_handle (), buf, to_write, *written);
return ret;
@@ -64,6 +66,8 @@ fhandler_dev_raw::read_file (void *buf, DWORD to_read, DWORD *read, int *err)
*err = 0;
if (!(ret = ReadFile (get_handle (), buf, to_read, read, 0)))
*err = GetLastError ();
else
current_position += *read;
syscall_printf ("%d (err %d) = ReadFile (%d, %d, to_read %d, read %d, 0)",
ret, *err, get_handle (), buf, to_read, *read);
return ret;
@@ -188,7 +192,9 @@ fhandler_dev_raw::raw_read (void *ptr, size_t& ulen)
{
if (len >= devbufsiz)
{
bytes_to_read = (len / 512) * 512;
bytes_to_read = (len / bytes_per_sector) * bytes_per_sector;
if (current_position + bytes_to_read >= drive_size)
bytes_to_read = drive_size - current_position;
tgt = p;
debug_printf ("read %d bytes direct from file",bytes_to_read);
}
@@ -196,9 +202,17 @@ fhandler_dev_raw::raw_read (void *ptr, size_t& ulen)
{
tgt = devbuf;
bytes_to_read = devbufsiz;
if (current_position + bytes_to_read >= drive_size)
bytes_to_read = drive_size - current_position;
debug_printf ("read %d bytes from file into buffer",
bytes_to_read);
}
if (!bytes_to_read)
{
eom_detected (true);
break;
}
if (!read_file (tgt, bytes_to_read, &read2, &ret))
{
if (!is_eof (ret) && !is_eom (ret))
@@ -315,6 +329,9 @@ fhandler_dev_raw::dup (fhandler_base *child)
{
fhandler_dev_raw *fhc = (fhandler_dev_raw *) child;
fhc->drive_size = drive_size;
fhc->current_position = current_position;
fhc->bytes_per_sector = bytes_per_sector;
fhc->devbufsiz = devbufsiz;
if (devbufsiz > 1L)
fhc->devbuf = new char [devbufsiz];
@@ -368,7 +385,7 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
mop.mt_count = op->rd_parm;
ret = ioctl (MTIOCTOP, &mop);
}
else if (op->rd_parm % 512)
else if (op->rd_parm % bytes_per_sector)
ret = ERROR_INVALID_PARAMETER;
else if (devbuf && op->rd_parm < devbufend - devbufstart)
ret = ERROR_INVALID_PARAMETER;