aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2025-02-26 20:15:18 +0100
committerCorinna Vinschen <corinna@vinschen.de>2025-02-26 20:15:18 +0100
commit15b52ba69d643a2e9f675fbdfcb589a798d0be48 (patch)
treed93467b2047671f209605a2fa27fd8006abbd268
parent809c212093709d4f593fa301edbe2db119dd8afa (diff)
downloadnewlib-15b52ba69d643a2e9f675fbdfcb589a798d0be48.zip
newlib-15b52ba69d643a2e9f675fbdfcb589a798d0be48.tar.gz
newlib-15b52ba69d643a2e9f675fbdfcb589a798d0be48.tar.bz2
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 <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/fhandler/netdrive.cc29
1 files changed, 23 insertions, 6 deletions
diff --git a/winsup/cygwin/fhandler/netdrive.cc b/winsup/cygwin/fhandler/netdrive.cc
index 9fcbc82..58447ed 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'\\');