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'\\');

Reply via email to