https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=78fb13d21f4f8bdfcd34127140c5f347d123a457
commit 78fb13d21f4f8bdfcd34127140c5f347d123a457 Author: Jeremy Drake via Cygwin-patches <[email protected]> AuthorDate: Tue Feb 18 17:51:41 2025 -0800 Commit: Corinna Vinschen <[email protected]> CommitDate: Wed Feb 19 20:11:40 2025 +0100 Cygwin: skip floppy drives in cygdrive_getmntent. This was previously done, but was lost when the function was updated to list all Windows mount points, not just drive letters. Fixes: 04a5b072940cc ("Cygwin: expose all windows volume mount points.") Signed-off-by: Jeremy Drake <[email protected]> Diff: --- winsup/cygwin/external.cc | 2 +- winsup/cygwin/fhandler/process.cc | 2 +- winsup/cygwin/local_includes/mount.h | 8 +++++++- winsup/cygwin/mount.cc | 23 +++++++++++++++++------ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index 6dfd11c44470..50a5af24f911 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -576,7 +576,7 @@ cygwin_internal (cygwin_getinfo_types t, ...) case CW_ALLOC_DRIVE_MAP: { - dos_drive_mappings *ddm = new dos_drive_mappings (); + dos_drive_mappings *ddm = new dos_drive_mappings (WITH_FLOPPIES); res = (uintptr_t) ddm; } break; diff --git a/winsup/cygwin/fhandler/process.cc b/winsup/cygwin/fhandler/process.cc index 550da2a82068..8fae9be5f678 100644 --- a/winsup/cygwin/fhandler/process.cc +++ b/winsup/cygwin/fhandler/process.cc @@ -887,7 +887,7 @@ format_process_maps (void *data, char *&destbuf) } cur = {{{'\0'}}, (char *)1, 0, 0}; MEMORY_BASIC_INFORMATION mb; - dos_drive_mappings drive_maps; + dos_drive_mappings drive_maps (WITH_FLOPPIES); heap_info heaps (p->dwProcessId); thread_info threads (p->dwProcessId, proc); struct stat st; diff --git a/winsup/cygwin/local_includes/mount.h b/winsup/cygwin/local_includes/mount.h index 3049de8ba364..163b47551fcb 100644 --- a/winsup/cygwin/local_includes/mount.h +++ b/winsup/cygwin/local_includes/mount.h @@ -23,6 +23,7 @@ enum disk_type DT_SHARE_NFS }; +disk_type get_device_type (LPCWSTR); disk_type get_disk_type (LPCWSTR); /* Don't add new fs types without adding them to fs_names in mount.cc! @@ -219,6 +220,11 @@ class mount_info struct mntent *cygdrive_getmntent (); }; +enum { + NO_FLOPPIES = false, + WITH_FLOPPIES = true +}; + class dos_drive_mappings { struct mapping @@ -236,7 +242,7 @@ class dos_drive_mappings mapping::dosmount *cur_dos; public: - dos_drive_mappings (); + dos_drive_mappings (bool with_floppies); ~dos_drive_mappings (); wchar_t *fixup_if_match (wchar_t *path); const wchar_t *next_dos_mount (); diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc index ab07c5abef87..1cfee5c41571 100644 --- a/winsup/cygwin/mount.cc +++ b/winsup/cygwin/mount.cc @@ -1746,7 +1746,7 @@ mount_info::cygdrive_getmntent () char *win32_path, *posix_path; if (!_my_tls.locals.drivemappings) - _my_tls.locals.drivemappings = new dos_drive_mappings (); + _my_tls.locals.drivemappings = new dos_drive_mappings (NO_FLOPPIES); wide_path = _my_tls.locals.drivemappings->next_dos_mount (); if (wide_path) @@ -1899,11 +1899,9 @@ cygwin_umount (const char *path, unsigned flags) #define is_dev(d,s) wcsncmp((d),(s),sizeof(s) - 1) disk_type -get_disk_type (LPCWSTR dos) +get_device_type (LPCWSTR dev) { - WCHAR dev[MAX_PATH], *d = dev; - if (!QueryDosDeviceW (dos, dev, MAX_PATH)) - return DT_NODISK; + const WCHAR *d = dev; if (is_dev (dev, L"\\Device\\")) { d += 8; @@ -1934,6 +1932,15 @@ get_disk_type (LPCWSTR dos) return DT_NODISK; } +disk_type +get_disk_type (LPCWSTR dos) +{ + WCHAR dev[MAX_PATH]; + if (!QueryDosDeviceW (dos, dev, MAX_PATH)) + return DT_NODISK; + return get_device_type (dev); +} + extern "C" FILE * setmntent (const char *filep, const char *) { @@ -2020,7 +2027,7 @@ resolve_dos_device (const wchar_t *dosname, wchar_t *devpath) return false; } -dos_drive_mappings::dos_drive_mappings () +dos_drive_mappings::dos_drive_mappings (bool with_floppies) : mappings(0) , cur_mapping(0) , cur_dos(0) @@ -2044,6 +2051,8 @@ dos_drive_mappings::dos_drive_mappings () mount[--len] = L'\0'; /* Drop trailing backslash */ if (resolve_dos_device (mount, devpath)) { + if (!with_floppies && get_device_type (devpath) == DT_FLOPPY) + continue; mapping *m = new mapping (); if (m) { @@ -2088,6 +2097,8 @@ dos_drive_mappings::dos_drive_mappings () *wcsrchr (vol, L'\\') = L'\0'; if (resolve_dos_device (vol + 4, devpath)) { + if (!with_floppies && get_device_type (devpath) == DT_FLOPPY) + continue; mapping *m = new mapping (); bool hadrootmount = false; if (m)
