From b0c3dc35a8118bfbe9847d0b5024f9ad380adff1 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Sun, 7 Nov 2010 19:11:26 +0100 Subject: [PATCH] msvcrt: Implemented the _(w)getenv_s functions. --- dlls/msvcr100/msvcr100.spec | 4 ++-- dlls/msvcr80/msvcr80.spec | 4 ++-- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/environ.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/msvcrt.spec | 4 ++-- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 0356f07d6bd..0a608b59de1 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1356,7 +1356,7 @@ @ cdecl _wgetdcwd(long wstr long) msvcrt._wgetdcwd @ stub _wgetdcwd_nolock @ cdecl _wgetenv(wstr) msvcrt._wgetenv -@ stub _wgetenv_s +@ cdecl _wgetenv_s(ptr ptr long wstr) msvcrt._wgetenv_s @ cdecl _wmakepath(ptr wstr wstr wstr wstr) msvcrt._wmakepath @ cdecl _wmakepath_s(ptr long wstr wstr wstr wstr) msvcrt._wmakepath_s @ cdecl _wmkdir(wstr) msvcrt._wmkdir @@ -1483,7 +1483,7 @@ @ cdecl getc(ptr) msvcrt.getc @ cdecl getchar() msvcrt.getchar @ cdecl getenv(str) msvcrt.getenv -@ stub getenv_s +@ cdecl getenv_s(ptr ptr long str) msvcrt.getenv_s @ cdecl gets(str) msvcrt.gets @ stub gets_s @ cdecl getwc(ptr) msvcrt.getwc diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index a1adb18fac7..d29fad18680 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1209,7 +1209,7 @@ @ cdecl _wgetdcwd(long wstr long) msvcrt._wgetdcwd @ stub _wgetdcwd_nolock @ cdecl _wgetenv(wstr) msvcrt._wgetenv -@ stub _wgetenv_s +@ cdecl _wgetenv_s(ptr ptr long wstr) msvcrt._wgetenv_s @ extern _winmajor msvcrt._winmajor @ extern _winminor msvcrt._winminor @ extern _winver msvcrt._winver @@ -1339,7 +1339,7 @@ @ cdecl getc(ptr) msvcrt.getc @ cdecl getchar() msvcrt.getchar @ cdecl getenv(str) msvcrt.getenv -@ stub getenv_s +@ cdecl getenv_s(ptr ptr long str) msvcrt.getenv_s @ cdecl gets(str) msvcrt.gets @ stub gets_s @ cdecl getwc(ptr) msvcrt.getwc diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 8ec604ac9ef..cc822da75c0 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1196,7 +1196,7 @@ @ cdecl _wgetdcwd(long wstr long) msvcrt._wgetdcwd @ stub _wgetdcwd_nolock @ cdecl _wgetenv(wstr) msvcrt._wgetenv -@ stub _wgetenv_s +@ cdecl _wgetenv_s(ptr ptr long wstr) msvcrt._wgetenv_s @ cdecl _wmakepath(ptr wstr wstr wstr wstr) msvcrt._wmakepath @ cdecl _wmakepath_s(ptr long wstr wstr wstr wstr) msvcrt._wmakepath_s @ cdecl _wmkdir(wstr) msvcrt._wmkdir diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c index 99efd4b4ea4..49e4885bdbd 100644 --- a/dlls/msvcrt/environ.c +++ b/dlls/msvcrt/environ.c @@ -261,3 +261,58 @@ int _wdupenv_s(MSVCRT_wchar_t **buffer, MSVCRT_size_t *numberOfElements, if (numberOfElements) *numberOfElements = sz; return 0; } + +/****************************************************************** + * getenv_s (MSVCRT.@) + */ +int getenv_s(MSVCRT_size_t *pReturnValue, char* buffer, MSVCRT_size_t numberOfElements, const char *varname) +{ + char* e; + + if (!MSVCRT_CHECK_PMT(pReturnValue != NULL) || + !MSVCRT_CHECK_PMT(!(buffer == NULL && numberOfElements > 0)) || + !MSVCRT_CHECK_PMT(varname != NULL)) + { + return *MSVCRT__errno() = MSVCRT_EINVAL; + } + if (!(e = MSVCRT_getenv(varname))) + { + *pReturnValue = 0; + return *MSVCRT__errno() = MSVCRT_EINVAL; + } + *pReturnValue = strlen(e) + 1; + if (numberOfElements < *pReturnValue) + { + return *MSVCRT__errno() = MSVCRT_ERANGE; + } + strcpy(buffer, e); + return 0; +} + +/****************************************************************** + * _wgetenv_s (MSVCRT.@) + */ +int _wgetenv_s(MSVCRT_size_t *pReturnValue, MSVCRT_wchar_t *buffer, MSVCRT_size_t numberOfElements, + const MSVCRT_wchar_t *varname) +{ + MSVCRT_wchar_t* e; + + if (!MSVCRT_CHECK_PMT(pReturnValue != NULL) || + !MSVCRT_CHECK_PMT(!(buffer == NULL && numberOfElements > 0)) || + !MSVCRT_CHECK_PMT(varname != NULL)) + { + return *MSVCRT__errno() = MSVCRT_EINVAL; + } + if (!(e = _wgetenv(varname))) + { + *pReturnValue = 0; + return *MSVCRT__errno() = MSVCRT_EINVAL; + } + *pReturnValue = strlenW(e) + 1; + if (numberOfElements < *pReturnValue) + { + return *MSVCRT__errno() = MSVCRT_ERANGE; + } + strcpyW(buffer, e); + return 0; +} diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 871023ba6b6..42c2469e408 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1128,7 +1128,7 @@ @ cdecl _wgetcwd(wstr long) @ cdecl _wgetdcwd(long wstr long) @ cdecl _wgetenv(wstr) -# stub _wgetenv_s +@ cdecl _wgetenv_s(ptr ptr long wstr) @ extern _winmajor MSVCRT__winmajor @ extern _winminor MSVCRT__winminor # stub _winput_s @@ -1273,7 +1273,7 @@ @ cdecl getc(ptr) MSVCRT_getc @ cdecl getchar() MSVCRT_getchar @ cdecl getenv(str) MSVCRT_getenv -# stub getenv_s +@ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar -- 2.11.4.GIT