Martin Storsjo : msvcrt: Implement _get_environ and _get_wenviron.

Alexandre Julliard julliard at winehq.org
Thu Apr 11 13:10:30 CDT 2019


Module: wine
Branch: master
Commit: f20be3b00cee829ada0c7b4ed67af8f63b6aeff3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f20be3b00cee829ada0c7b4ed67af8f63b6aeff3

Author: Martin Storsjo <martin at martin.st>
Date:   Wed Apr 10 15:51:55 2019 +0300

msvcrt: Implement _get_environ and _get_wenviron.

Signed-off-by: Martin Storsjo <martin at martin.st>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/environ.c       | 16 ++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |  4 ++--
 dlls/msvcrt/tests/environ.c | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c
index cce62bc..cc180e8 100644
--- a/dlls/msvcrt/environ.c
+++ b/dlls/msvcrt/environ.c
@@ -310,3 +310,19 @@ int CDECL _wgetenv_s(MSVCRT_size_t *pReturnValue, MSVCRT_wchar_t *buffer, MSVCRT
     strcpyW(buffer, e);
     return 0;
 }
+
+/*********************************************************************
+ *		_get_environ (MSVCRT.@)
+ */
+void CDECL MSVCRT__get_environ(char ***ptr)
+{
+    *ptr = MSVCRT__environ;
+}
+
+/*********************************************************************
+ *		_get_wenviron (MSVCRT.@)
+ */
+void CDECL MSVCRT__get_wenviron(MSVCRT_wchar_t ***ptr)
+{
+    *ptr = MSVCRT__wenviron;
+}
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 0c2881d..5be4b4c 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -501,7 +501,7 @@
 @ cdecl _gcvt_s(ptr long  double long) MSVCRT__gcvt_s
 @ cdecl _get_current_locale() MSVCRT__get_current_locale
 @ cdecl _get_doserrno(ptr)
-# stub _get_environ(ptr)
+@ cdecl _get_environ(ptr) MSVCRT__get_environ
 @ cdecl _get_errno(ptr)
 # stub _get_fileinfo(ptr)
 @ cdecl _get_fmode(ptr) MSVCRT__get_fmode
@@ -512,7 +512,7 @@
 @ cdecl _get_output_format() MSVCRT__get_output_format
 @ cdecl _get_pgmptr(ptr)
 @ cdecl _get_sbh_threshold()
-# stub _get_wenviron(ptr)
+@ cdecl _get_wenviron(ptr) MSVCRT__get_wenviron
 @ cdecl _get_winmajor(ptr) MSVCRT__get_winmajor
 @ cdecl _get_winminor(ptr) MSVCRT__get_winminor
 # stub _get_winver(ptr)
diff --git a/dlls/msvcrt/tests/environ.c b/dlls/msvcrt/tests/environ.c
index fdfe81f..11b79f0 100644
--- a/dlls/msvcrt/tests/environ.c
+++ b/dlls/msvcrt/tests/environ.c
@@ -47,6 +47,8 @@ void __cdecl __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, int *);
 
 static char ***(__cdecl *p__p__environ)(void);
 static WCHAR ***(__cdecl *p__p__wenviron)(void);
+static void (*p_get_environ)(char ***);
+static void (*p_get_wenviron)(WCHAR ***);
 
 static char ***p_environ;
 static WCHAR ***p_wenviron;
@@ -59,6 +61,8 @@ static void init(void)
     p__p__wenviron = (void *)GetProcAddress(hmod, "__p__wenviron");
     p_environ = (void *)GetProcAddress(hmod, "_environ");
     p_wenviron = (void *)GetProcAddress(hmod, "_wenviron");
+    p_get_environ = (void *)GetProcAddress(hmod, "_get_environ");
+    p_get_wenviron = (void *)GetProcAddress(hmod, "_get_wenviron");
 }
 
 static void test_system(void)
@@ -95,6 +99,16 @@ static void test__environ(void)
     else
         win_skip( "__p__environ() is not available\n" );
 
+    if (p_get_environ)
+    {
+        char **retptr;
+        p_get_environ(&retptr);
+        ok( retptr == *p_environ,
+            "Expected _environ pointers to be identical\n" );
+    }
+    else
+        win_skip( "_get_environ() is not available\n" );
+
     /* Note that msvcrt from Windows versions older than Vista
      * expects the mode pointer parameter to be valid.*/
     __getmainargs(&argc, &argv, &envp, 0, &mode);
@@ -151,6 +165,16 @@ static void test__wenviron(void)
     else
         win_skip( "__p__wenviron() is not available\n" );
 
+    if (p_get_wenviron)
+    {
+        WCHAR **retptr;
+        p_get_wenviron(&retptr);
+        ok( retptr == NULL,
+            "Expected _wenviron pointers to be NULL\n" );
+    }
+    else
+        win_skip( "_get_wenviron() is not available\n" );
+
     /* __getmainargs doesn't initialize _wenviron. */
     __getmainargs(&argc, &argv, &envp, 0, &mode);
 
@@ -191,6 +215,14 @@ static void test__wenviron(void)
             "Expected _wenviron pointers to be identical\n" );
     }
 
+    if (p_get_wenviron)
+    {
+        WCHAR **retptr;
+        p_get_wenviron(&retptr);
+        ok( retptr == *p_wenviron,
+            "Expected _wenviron pointers to be identical\n" );
+    }
+
     for (i = 0; ; i++)
     {
         if ((*p_wenviron)[i])




More information about the wine-cvs mailing list