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-28 23:33:18 +0400
committerCorinna Vinschen <corinna@vinschen.de>2005-09-28 23:33:18 +0400
commitf098767559e00c93c86060b4e0894484b7d7dd67 (patch)
tree2bff26a7169199e774b432625d8bb0ed95c71859 /winsup/cygwin/fhandler_raw.cc
parentdcb091caaf9e00e840520141c1a74fb3f0eeb1d2 (diff)
* fhandler.h (class fhandler_dev_raw): Delete current_position and
eof_detected status flag. Delete is_eom and is_eof methods. Move drive_size, bytes_per_sector, eom_detected status flag, as well as the methods read_file, write_file, raw_read and raw_write to ... (class fhandler_dev_floppy): ... here. Remove is_eom and is_eof methods. Add dup method. * fhandler_floppy.cc (IS_EOM): New macro. (fhandler_dev_floppy::is_eom): Remove. (fhandler_dev_floppy::is_eof): Remove. (fhandler_dev_floppy::fhandler_dev_floppy): Initialize status flags. (fhandler_dev_floppy::get_drive_info): Only call EX functions on systems supporting them and stop suffering strange delays. (fhandler_dev_floppy::read_file): Move here, drop setting current_position. (fhandler_dev_floppy::write_file): Move here, drop setting current_position. (fhandler_dev_floppy::open): Rearrange comment. (fhandler_dev_floppy::dup): New method. (fhandler_dev_floppy::get_current_position): New inline method. Use instead of former current_position were appropriate. (fhandler_dev_floppy::raw_read): Move here. Drop EOF handling. (fhandler_dev_floppy::raw_write): Move here. Drop EOF handling. (fhandler_dev_floppy::lseek): Remove useless conditions. Convert sector_aligned_offset to LARGE_INTEGER to improve SetFilePointer call. (fhandler_dev_floppy::ioctl): Move blocksize check in RDSETBLK case to here. * fhandler_raw.cc (fhandler_dev_raw::is_eom): Remove. (fhandler_dev_raw::is_eof): Remove. (fhandler_dev_raw::write_file): Remove. (fhandler_dev_raw::read_file): Remove. (fhandler_dev_raw::raw_read): Remove. (fhandler_dev_raw::raw_write): Remove. (fhandler_dev_raw::dup): Drop copying removed members. (fhandler_dev_raw::ioctl): Drop blocksize testing. * wincap.h: Implement has_disk_ex_ioctls throughout. * wincap.cc: Ditto. (wincap_vista): Preliminary wincaps for Windows Vista/Longhorn. (wincapc::init): Add Vista/Longhorn handling.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r--winsup/cygwin/fhandler_raw.cc235
1 files changed, 1 insertions, 234 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index fe27bbd91..c5a8ab074 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -27,52 +27,6 @@
/**********************************************************************/
/* fhandler_dev_raw */
-int
-fhandler_dev_raw::is_eom (int win_error)
-{
- return 0;
-}
-
-int
-fhandler_dev_raw::is_eof (int)
-{
- return 0;
-}
-
-
-/* Wrapper functions to simplify error handling. */
-
-BOOL
-fhandler_dev_raw::write_file (const void *buf, DWORD to_write,
- DWORD *written, int *err)
-{
- BOOL ret;
-
- *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;
-}
-
-BOOL
-fhandler_dev_raw::read_file (void *buf, DWORD to_read, DWORD *read, int *err)
-{
- BOOL ret;
-
- *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;
-}
-
fhandler_dev_raw::fhandler_dev_raw ()
: fhandler_base (), status ()
{
@@ -140,205 +94,20 @@ fhandler_dev_raw::open (int flags, mode_t)
return res;
}
-void
-fhandler_dev_raw::raw_read (void *ptr, size_t& ulen)
-{
- DWORD bytes_read = 0;
- DWORD read2;
- DWORD bytes_to_read;
- int ret;
- size_t len = ulen;
- char *tgt;
- char *p = (char *) ptr;
-
- /* Checking a previous end of file */
- if (eof_detected () && !lastblk_to_read ())
- {
- eof_detected (false);
- ulen = 0;
- return;
- }
-
- /* Checking a previous end of media */
- if (eom_detected () && !lastblk_to_read ())
- {
- set_errno (ENOSPC);
- goto err;
- }
-
- if (devbuf)
- {
- while (len > 0)
- {
- if (devbufstart < devbufend)
- {
- bytes_to_read = min (len, devbufend - devbufstart);
- debug_printf ("read %d bytes from buffer (rest %d)",
- bytes_to_read,
- devbufend - devbufstart - bytes_to_read);
- memcpy (p, devbuf + devbufstart, bytes_to_read);
- len -= bytes_to_read;
- p += bytes_to_read;
- bytes_read += bytes_to_read;
- devbufstart += bytes_to_read;
-
- if (lastblk_to_read ())
- {
- lastblk_to_read (false);
- break;
- }
- }
- if (len > 0)
- {
- if (len >= devbufsiz)
- {
- 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);
- }
- else
- {
- 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))
- {
- __seterrno ();
- goto err;
- }
-
- if (is_eof (ret))
- eof_detected (true);
- else
- eom_detected (true);
-
- if (!read2)
- {
- if (!bytes_read && is_eom (ret))
- {
- debug_printf ("return -1, set errno to ENOSPC");
- set_errno (ENOSPC);
- goto err;
- }
- break;
- }
- lastblk_to_read (true);
- }
- if (!read2)
- break;
- if (tgt == devbuf)
- {
- devbufstart = 0;
- devbufend = read2;
- }
- else
- {
- len -= read2;
- p += read2;
- bytes_read += read2;
- }
- }
- }
- }
- else if (!read_file (p, len, &bytes_read, &ret))
- {
- if (!is_eof (ret) && !is_eom (ret))
- {
- __seterrno ();
- goto err;
- }
- if (bytes_read)
- {
- if (is_eof (ret))
- eof_detected (true);
- else
- eom_detected (true);
- }
- else if (is_eom (ret))
- {
- debug_printf ("return -1, set errno to ENOSPC");
- set_errno (ENOSPC);
- goto err;
- }
- }
-
- ulen = (size_t) bytes_read;
- return;
-
-err:
- ulen = (size_t) -1;
-}
-
-int
-fhandler_dev_raw::raw_write (const void *ptr, size_t len)
-{
- DWORD bytes_written = 0;
- char *p = (char *) ptr;
- int ret;
-
- /* Checking a previous end of media on tape */
- if (eom_detected ())
- {
- set_errno (ENOSPC);
- return -1;
- }
-
- /* Invalidate buffer. */
- devbufstart = devbufend = 0;
-
- if (len > 0)
- {
- if (!write_file (p, len, &bytes_written, &ret))
- {
- if (!is_eom (ret))
- {
- __seterrno ();
- return -1;
- }
- eom_detected (true);
- if (!bytes_written)
- {
- set_errno (ENOSPC);
- return -1;
- }
- }
- }
- return bytes_written;
-}
-
int
fhandler_dev_raw::dup (fhandler_base *child)
{
int ret = fhandler_base::dup (child);
- if (! ret)
+ if (!ret)
{
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];
fhc->devbufstart = 0;
fhc->devbufend = 0;
- fhc->eom_detected (eom_detected ());
- fhc->eof_detected (eof_detected ());
fhc->lastblk_to_read (false);
}
return ret;
@@ -385,8 +154,6 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
mop.mt_count = op->rd_parm;
ret = ioctl (MTIOCTOP, &mop);
}
- else if (op->rd_parm % bytes_per_sector)
- ret = ERROR_INVALID_PARAMETER;
else if (devbuf && op->rd_parm < devbufend - devbufstart)
ret = ERROR_INVALID_PARAMETER;
else if (!devbuf || op->rd_parm != devbufsiz)