mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 00:07:36 +08:00
Cygwin: // and //server: add support for WSL
Root dirs of WSL installations are exposed via \\wsl$. Add support to expose \\wsl$. While at it, check if TERMSRV and P9 provider exist before exposing them. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
18b8a104ac
commit
178a8fca15
@ -42,6 +42,12 @@ details. */
|
||||
instead of the SMB shares. Un-be-lie-va-ble!
|
||||
FWIW, we reverted the SMB share enumeration using WNet. */
|
||||
|
||||
#ifndef WNNC_NET_9P
|
||||
#define WNNC_NET_9P 0x00480000
|
||||
#endif
|
||||
#define TERMSRV_DIR "tsclient"
|
||||
#define PLAN9_DIR "wsl$"
|
||||
|
||||
/* Define the required GUIDs here to avoid linking with libuuid.a */
|
||||
const GUID FOLDERID_NetworkFolder = {
|
||||
0xd20beec4, 0x5ca8, 0x4905,
|
||||
@ -319,10 +325,15 @@ thread_netdrive_wnet (void *arg)
|
||||
while ((wres = WNetEnumResourceW (dom, (cnt = 1, &cnt), nro,
|
||||
(size = NT_MAX_PATH, &size))) == NO_ERROR)
|
||||
{
|
||||
/* Skip server name and trailing backslash */
|
||||
wchar_t *name = nro->lpRemoteName + wcslen (srv_name) + 1;
|
||||
size_t cache_idx;
|
||||
|
||||
/* Skip server name and trailing backslash */
|
||||
wchar_t *name = nro->lpRemoteName + 2;
|
||||
name = wcschr (name, L'\\');
|
||||
if (!name)
|
||||
continue;
|
||||
++name;
|
||||
|
||||
if (ndi->provider == WNNC_NET_MS_NFS)
|
||||
{
|
||||
wchar_t *nm = name;
|
||||
@ -367,12 +378,19 @@ create_thread_and_wait (DIR *dir)
|
||||
/* For the Network root, fetch WSD info. */
|
||||
if (strlen (dir->__d_dirname) == 2)
|
||||
{
|
||||
WCHAR provider[256];
|
||||
DWORD size;
|
||||
|
||||
ndi.provider = WNNC_NET_SMB;
|
||||
ndi.sem = CreateSemaphore (&sec_none_nih, 0, 2, NULL);
|
||||
thr = new cygthread (thread_netdrive_wsd, &ndi, "netdrive_wsd");
|
||||
if (thr->detach (ndi.sem))
|
||||
ndi.err = EINTR;
|
||||
CloseHandle (ndi.sem);
|
||||
/* Add wsl$ if Plan 9 is installed */
|
||||
if (WNetGetProviderNameW (WNNC_NET_9P, provider, (size = 256, &size))
|
||||
== NO_ERROR)
|
||||
DIR_cache.add (__CONCAT(L,PLAN9_DIR));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -394,10 +412,12 @@ create_thread_and_wait (DIR *dir)
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Eventually, try SMB via WNet for share enumeration. */
|
||||
if (!strcmp (dir->__d_dirname + 2, "tsclient"))
|
||||
/* Eventually, try TERMSRV/P9/SMB via WNet for share enumeration,
|
||||
depending on "server" name. */
|
||||
if (!strcmp (dir->__d_dirname + 2, TERMSRV_DIR))
|
||||
ndi.provider = WNNC_NET_TERMSRV;
|
||||
else if (!strcmp (dir->__d_dirname + 2, PLAN9_DIR))
|
||||
ndi.provider = WNNC_NET_9P;
|
||||
else
|
||||
ndi.provider = WNNC_NET_SMB;
|
||||
ndi.sem = CreateSemaphore (&sec_none_nih, 0, 2, NULL);
|
||||
@ -419,15 +439,28 @@ fhandler_netdrive::exists ()
|
||||
wchar_t name[MAX_PATH];
|
||||
struct addrinfoW *ai;
|
||||
INT ret;
|
||||
DWORD protocol = 0;
|
||||
|
||||
/* Handle "tsclient" (Microsoft Terminal Services) and
|
||||
"wsl$" (Plan 9 Network Provider) explicitely.
|
||||
Both obviously don't resolve with GetAddrInfoW. */
|
||||
if (!strcmp (get_name () + 2, TERMSRV_DIR))
|
||||
protocol = WNNC_NET_TERMSRV;
|
||||
else if (!strcmp (get_name () + 2, PLAN9_DIR))
|
||||
protocol = WNNC_NET_9P;
|
||||
if (protocol)
|
||||
{
|
||||
WCHAR provider[256];
|
||||
DWORD size = 256;
|
||||
|
||||
if (WNetGetProviderNameW (protocol, provider, &size) == NO_ERROR)
|
||||
return virt_directory;
|
||||
return virt_none;
|
||||
}
|
||||
/* Hopefully we are allowed to assume an IP network with existing name
|
||||
resolution these days. Therefore, just try to resolve the name
|
||||
into IP addresses. This may take up to about 3 secs if the name
|
||||
doesn't exist, or about 8 secs if DNS is unavailable.
|
||||
|
||||
Don't ask for "tsclient", it doesn't resolve. Just assume it exists. */
|
||||
if (!strcmp (get_name () + 2, "tsclient"))
|
||||
return virt_directory;
|
||||
doesn't exist, or about 8 secs if DNS is unavailable. */
|
||||
sys_mbstowcs (name, CYG_MAX_PATH, get_name ());
|
||||
ret = GetAddrInfoW (name + 2, NULL, NULL, &ai);
|
||||
if (!ret)
|
||||
|
Loading…
x
Reference in New Issue
Block a user