Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-09-26 18:55:40 +0400
committerCorinna Vinschen <corinna@vinschen.de>2005-09-26 18:55:40 +0400
commitb470a0e81fb3e56dfd7886e0099e7b6b7c148101 (patch)
tree75fc2d28a97ca8e2b1af8ab3431177d199343ebb /winsup/cygwin/fhandler_raw.cc
parentd5f4ee62b706f7cfe22a92fd796dc36382690950 (diff)
* 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.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r--winsup/cygwin/fhandler_raw.cc21
1 files changed, 19 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index 24525ef40..fe27bbd91 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -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;