diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5bfab9ffb..93e70cef3 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2001-10-16 Corinna Vinschen + + * fhandler_raw.cc (fhandler_dev_raw::open): Eliminate compatibility + code since no Win32 device names are used anymore. + * fhandler_tape.cc (fhandler_dev_tape::tape_set_blocksize): Allow + 0 as blocksize to indicate variable blocksize. + * path.cc (win32_device_name): Generate NT internal device names + using upper/lower case names for readability. + Generate \DosDevices\: device name for mount table + compatibility devices. + 2001-10-16 Corinna Vinschen * fhandler_tape.cc (fhandler_dev_tape::tape_status): Report diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc index 3e73850e2..18d2a617c 100644 --- a/winsup/cygwin/fhandler_raw.cc +++ b/winsup/cygwin/fhandler_raw.cc @@ -154,42 +154,32 @@ fhandler_dev_raw::open (path_conv *real_path, int flags, mode_t) flags &= ~(O_CREAT | O_TRUNC); flags |= O_BINARY; - if (get_device () == FH_FLOPPY && get_unit () >= 224) + DWORD access = GENERIC_READ | SYNCHRONIZE; + if (get_device () == FH_TAPE + || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY + || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDWR) + access |= GENERIC_WRITE; + + extern void str2buf2uni (UNICODE_STRING &, WCHAR *, const char *); + UNICODE_STRING dev; + WCHAR devname[MAX_PATH + 1]; + str2buf2uni (dev, devname, real_path->get_win32 ()); + OBJECT_ATTRIBUTES attr; + InitializeObjectAttributes (&attr, &dev, OBJ_CASE_INSENSITIVE, NULL, NULL); + + HANDLE h; + IO_STATUS_BLOCK io; + NTSTATUS status = NtOpenFile (&h, access, &attr, &io, wincap.shared (), + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS (status)) { - /* Compatibility mode for old mount table device mapping. */ - if (!fhandler_base::open (real_path, flags)) - return 0; - } - else - { - DWORD access = GENERIC_READ | SYNCHRONIZE; - if (get_device () == FH_TAPE - || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY - || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDWR) - access |= GENERIC_WRITE; - - extern void str2buf2uni (UNICODE_STRING &, WCHAR *, const char *); - UNICODE_STRING dev; - WCHAR devname[MAX_PATH + 1]; - str2buf2uni (dev, devname, real_path->get_win32 ()); - OBJECT_ATTRIBUTES attr; - InitializeObjectAttributes(&attr, &dev, OBJ_CASE_INSENSITIVE, NULL, NULL); - - HANDLE h; - IO_STATUS_BLOCK io; - NTSTATUS status = NtOpenFile (&h, access, &attr, &io, wincap.shared (), - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS (status)) - { - set_errno (RtlNtStatusToDosError (status)); - debug_printf ("NtOpenFile: NTSTATUS: %d, Win32: %E", status); - return 0; - } - - set_io_handle (h); - set_flags (flags); + set_errno (RtlNtStatusToDosError (status)); + debug_printf ("NtOpenFile: NTSTATUS: %d, Win32: %E", status); + return 0; } + set_io_handle (h); + set_flags (flags); set_r_binary (O_BINARY); set_w_binary (O_BINARY); diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc index 19631373b..cb0ebf9d4 100644 --- a/winsup/cygwin/fhandler_tape.cc +++ b/winsup/cygwin/fhandler_tape.cc @@ -692,7 +692,7 @@ fhandler_dev_tape::tape_set_blocksize (long count) if (lasterr) return lasterr; - if (count < min || count > max) + if (count != 0 && (count < min || count > max)) return tape_error (ERROR_INVALID_PARAMETER, "tape_set_blocksize"); mp.BlockSize = count; diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index e0d39b8dc..317b3a6d7 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1010,18 +1010,18 @@ win32_device_name (const char *src_path, char *win32_path, __small_sprintf (win32_path, devfmt, unit == 8 ? "" : "u"); break; case FH_TAPE: - __small_sprintf (win32_path, "\\device\\tape%d", unit % 128); + __small_sprintf (win32_path, "\\Device\\Tape%d", unit % 128); break; case FH_FLOPPY: if (unit < 16) - __small_sprintf (win32_path, "\\device\\floppy%d", unit); + __small_sprintf (win32_path, "\\Device\\Floppy%d", unit); else if (unit < 32) - __small_sprintf (win32_path, "\\device\\cdrom%d", unit - 16); + __small_sprintf (win32_path, "\\Device\\CdRom%d", unit - 16); else if (unit < 224) - __small_sprintf (win32_path, "\\device\\harddisk%d\\partition%d", + __small_sprintf (win32_path, "\\Device\\Harddisk%d\\Partition%d", (unit - 32) / 16, unit % 16); else - __small_sprintf (win32_path, "\\\\.\\%c:", unit - 224 + 'A'); + __small_sprintf (win32_path, "\\DosDevices\\%c:", unit - 224 + 'A'); break; default: __small_sprintf (win32_path, devfmt, unit);