diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-09-28 19:33:18 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-09-28 19:33:18 +0000 |
commit | f098767559e00c93c86060b4e0894484b7d7dd67 (patch) | |
tree | 2bff26a7169199e774b432625d8bb0ed95c71859 /winsup/cygwin/fhandler_raw.cc | |
parent | dcb091caaf9e00e840520141c1a74fb3f0eeb1d2 (diff) | |
download | cygnal-f098767559e00c93c86060b4e0894484b7d7dd67.tar.gz cygnal-f098767559e00c93c86060b4e0894484b7d7dd67.tar.bz2 cygnal-f098767559e00c93c86060b4e0894484b7d7dd67.zip |
* 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.cc | 235 |
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) |