| /** | |
| * 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 <internal.h> | |
| /* Define __getmainargs() function via msvcrt.dll __getmainargs() function */ | |
| _CRTIMP int __cdecl __msvcrt_getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, _startupinfo *startup_info); | |
| int __cdecl __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, _startupinfo *startup_info) | |
| { | |
| /* | |
| * ABI of msvcrt.dll __getmainargs() function was changed in Windows XP. | |
| * In Windows 2000 and older versions of msvcrt.dll, including the original | |
| * Visual C++ 6.0 msvcrt.dll version, __getmainargs() has void return type | |
| * and it terminate process on failure. Since Windows XP this function has | |
| * int return value and returns -1 on failure. It is up to the caller to | |
| * terminate process. As int return value on i386 is stored in the eax | |
| * register we can call this function from C even with wrong return value in | |
| * declaration and ignoring it return value. This function does not touch | |
| * argc/argv/envp arguments on error, so we can use this fact to detect | |
| * failure independently of return value ABI. | |
| * | |
| * In the same way was changed also ABI of msvcrt40.dll __getmainargs() | |
| * function. In the original Visual C++ 4.0/4.1 version and in Windows 9x | |
| * versions, it had void return type. But in all Windows NT versions, | |
| * it is just redirect to the msvcrt.dll __getmainargs() function. And | |
| * since Windows XP, this function has int return type. | |
| */ | |
| int local_argc = -1; | |
| char **local_argv = NULL; | |
| char **local_envp = NULL; | |
| (void)__msvcrt_getmainargs(&local_argc, &local_argv, &local_envp, expand_wildcards, startup_info); | |
| if (local_argc == -1 || local_argv == NULL || local_envp == NULL) | |
| return -1; | |
| *argc = local_argc; | |
| *argv = local_argv; | |
| *envp = local_envp; | |
| return 0; | |
| } | |
| int __cdecl (*__MINGW_IMP_SYMBOL(__getmainargs))(int *, char ***, char ***, int, _startupinfo *) = __getmainargs; |