https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=15b52ba69d643a2e9f675fbdfcb589a798d0be48
commit 15b52ba69d643a2e9f675fbdfcb589a798d0be48 Author: Corinna Vinschen <[email protected]> AuthorDate: Wed Feb 26 20:15:18 2025 +0100 Commit: Corinna Vinschen <[email protected]> CommitDate: Wed Feb 26 20:15:18 2025 +0100 Cygwin: fhandler_netdrive: support enumerating connected disks Some providers don't implement share enumeration. Allow to find the server's connected resources in this case. Enable this feature for the WNNC_NET_DAV provider. Signed-off-by: Corinna Vinschen <[email protected]> Diff: --- winsup/cygwin/fhandler/netdrive.cc | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/fhandler/netdrive.cc b/winsup/cygwin/fhandler/netdrive.cc index 9fcbc8243426..58447ed5aaab 100644 --- a/winsup/cygwin/fhandler/netdrive.cc +++ b/winsup/cygwin/fhandler/netdrive.cc @@ -311,6 +311,9 @@ thread_netdrive_wnet (void *arg) DIR *dir = ndi->dir; DWORD wres; + DWORD connected_only = false; + size_t srv_len = 0; + size_t entry_cache_size = DIR_cache.count (); WCHAR provider[256], *dummy = NULL; wchar_t srv_name[CYG_MAX_PATH]; @@ -396,10 +399,12 @@ thread_netdrive_wnet (void *arg) } break; case WNNC_NET_DAV: - /* FIXME: WebDAV enumeration isn't supported, but we could try - to find the connected shares by enumerating all remembered - connections. */ - goto out; + /* WebDAV enumeration isn't supported, by the provider, but we can + find the connected shares of the server by enumerating all connected + disk resources. */ + connected_only = true; + srv_len = wcslen (srv_name); + break; case WNNC_NET_RDR2SAMPLE: /* Lots of OSS drivers uses this provider. No idea yet, what to do with them. */ @@ -408,8 +413,11 @@ thread_netdrive_wnet (void *arg) break; } - wres = WNetOpenEnumW (RESOURCE_GLOBALNET, RESOURCETYPE_DISK, - RESOURCEUSAGE_ALL, nro, &dom); + if (connected_only) + wres = WNetOpenEnumW (RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, NULL, &dom); + else + wres = WNetOpenEnumW (RESOURCE_GLOBALNET, RESOURCETYPE_DISK, + RESOURCEUSAGE_ALL, nro, &dom); if (wres != NO_ERROR) { ndi->err = geterrno_from_win_error (wres); @@ -421,6 +429,15 @@ thread_netdrive_wnet (void *arg) { size_t cache_idx; + /* Skip unrelated entries in connection list. */ + if (connected_only) + { + if (wcsncasecmp (srv_name, nro->lpRemoteName, srv_len) + || wcslen (nro->lpRemoteName) <= srv_len + || nro->lpRemoteName[srv_len] != L'\\') + continue; + } + /* Skip server name and trailing backslash */ wchar_t *name = nro->lpRemoteName + 2; name = wcschr (name, L'\\');
