Add winsymlinks:wslstrict, so we have a spanning set of values for winsymlinks. --- winsup/cygwin/environ.cc | 3 +++ winsup/cygwin/globals.cc | 1 + winsup/cygwin/path.cc | 7 +++++++ winsup/doc/cygwinenv.xml | 15 ++++++++++++++- 4 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc index a7a52feeb..b53b018fd 100644 --- a/winsup/cygwin/environ.cc +++ b/winsup/cygwin/environ.cc @@ -88,6 +88,9 @@ set_winsymlinks (const char *buf) else if (ascii_strncasematch (buf, "native", 6)) allow_winsymlinks = ascii_strcasematch (buf + 6, "strict") ? WSYM_nativestrict : WSYM_native; + else if (ascii_strncasematch (buf, "wsl", 3)) + allow_winsymlinks = ascii_strcasematch (buf + 3, "strict") + ? WSYM_wslstrict : WSYM_default; } /* The structure below is used to set up an array which is used to diff --git a/winsup/cygwin/globals.cc b/winsup/cygwin/globals.cc index b15980bb3..9459d8bcb 100644 --- a/winsup/cygwin/globals.cc +++ b/winsup/cygwin/globals.cc @@ -59,6 +59,7 @@ enum winsym_t WSYM_nativestrict, WSYM_nfs, WSYM_magic, + WSYM_wslstrict, }; exit_states NO_COPY exit_state; diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index edb3b27ee..57ec8be72 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2062,12 +2062,19 @@ symlink_worker (const char *oldpath, path_conv &win32_newpath, bool isdevice) wsym_type = WSYM_default; fallthrough; case WSYM_default: + case WSYM_wslstrict: if (win32_newpath.fs_flags () & FILE_SUPPORTS_REPARSE_POINTS) { res = symlink_wsl (oldpath, win32_newpath); if (!res) __leave; } + /* Strictly wsl? */ + if (wsym_type == WSYM_wslstrict) + { + __seterrno (); + __leave; + } /* On FSes not supporting reparse points, or in case of an error creating the WSL symlink, fall back to creating the plain old SYSTEM file symlink. */ diff --git a/winsup/doc/cygwinenv.xml b/winsup/doc/cygwinenv.xml index 496088292..b98e27243 100644 --- a/winsup/doc/cygwinenv.xml +++ b/winsup/doc/cygwinenv.xml @@ -76,7 +76,7 @@ in addition to the normal UNIX argv list. Defaults to not set.</para> </listitem> <listitem> -<para><envar>winsymlinks:{lnk,magic,native,nativestrict}</envar></para> +<para><envar>winsymlinks:{lnk,magic,native,nativestrict,wsl,wslstrict}</envar></para> <itemizedlist mark="square"> <listitem> @@ -105,6 +105,19 @@ with <literal>winsymlinks:native</literal>, while with <literal>winsymlinks:nativestrict</literal> the <literal>symlink(2)</literal> system call will immediately fail.</para> </listitem> + +<listitem> +<para>If set to <literal>winsymlinks:wsl</literal> or +<literal>winsymlinks:wslstrict</literal>, Cygwin creates symlinks as special +reparse points, defined by WSL.</para> + +<para>With <literal>winsymlinks:wsl</literal>, if Cygwin fails to create a WSL +symlink for some reason, it will fall back to creating a Cygwin magic cookie +symlink, while with <literal>winsymlinks:wslstrict</literal> the +<literal>symlink(2)</literal> system call will immediately fail.</para> + +<para><literal>winsymlinks:wsl</literal> is the default behaviour.</para> +</listitem> </itemizedlist> <para>For more information on symbolic links, see -- 2.32.0