| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the mingw-w64 runtime package. |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| */ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <errno.h> |
| |
| static errno_t __cdecl emu_getenv_s(size_t *pReturnValue, char *dstBuf, rsize_t dstSize, const char *varName) |
| { |
| const char *value; |
| size_t size; |
| |
| /* Only below parameter validation sets errno to EINVAL. */ |
| |
| if (!pReturnValue) |
| return errno = EINVAL; |
| |
| if ((!dstBuf && dstSize > 0) || (dstBuf && !dstSize)) { |
| *pReturnValue = 0; |
| return errno = EINVAL; |
| } |
| |
| if (!varName) { |
| *pReturnValue = 0; |
| if (dstBuf) |
| dstBuf[0] = '\0'; |
| return errno = EINVAL; |
| } |
| |
| /* After passing parameter validation, the errno is not changed. */ |
| |
| value = getenv(varName); |
| if (!value) { |
| *pReturnValue = 0; |
| if (dstBuf) |
| dstBuf[0] = '\0'; |
| return 0; |
| } |
| |
| size = strlen(value)+1; |
| *pReturnValue = size; |
| |
| if (dstBuf) { |
| if (size > dstSize) { |
| dstBuf[0] = '\0'; |
| return ERANGE; |
| } |
| memcpy(dstBuf, value, size); |
| } |
| |
| return 0; |
| } |
| |
| #define RETT errno_t |
| #define FUNC getenv_s |
| #define ARGS size_t *pReturnValue, char *dstBuf, rsize_t dstSize, const char *varName |
| #define CALL pReturnValue, dstBuf, dstSize, varName |
| #include "msvcrt_or_emu_glue.h" |