diff options
Diffstat (limited to 'winsup/cygwin/external.cc')
-rw-r--r-- | winsup/cygwin/external.cc | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index d818cbc78..35f0f0909 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -132,12 +132,12 @@ check_ntsec (const char *filename) } /* Copy cygwin environment variables to the Windows environment. */ -static void -sync_winenv () +static PWCHAR +create_winenv (const char * const *env) { int unused_envc; PWCHAR envblock = NULL; - char **envp = build_env (cur_environ (), envblock, unused_envc, false); + char **envp = build_env (env ?: cur_environ (), envblock, unused_envc, false); PWCHAR p = envblock; if (envp) @@ -146,8 +146,12 @@ sync_winenv () cfree (*e); cfree (envp); } + /* If we got an env block, just return pointer to win env. */ + if (env) + return envblock; + /* Otherwise sync win env of current process with its posix env. */ if (!p) - return; + return NULL; while (*p) { PWCHAR eq = wcschr (p, L'='); @@ -160,6 +164,7 @@ sync_winenv () p = wcschr (p, L'\0') + 1; } free (envblock); + return NULL; } /* @@ -419,7 +424,7 @@ cygwin_internal (cygwin_getinfo_types t, ...) try_to_debug (); break; case CW_SYNC_WINENV: - sync_winenv (); + create_winenv (NULL); res = 0; break; case CW_CYGTLS_PADSIZE: @@ -516,6 +521,13 @@ cygwin_internal (cygwin_getinfo_types t, ...) } break; + case CW_CVT_ENV_TO_WINENV: + { + char **posix_env = va_arg (arg, char **); + res = (uintptr_t) create_winenv (posix_env); + } + break; + default: set_errno (ENOSYS); } |