#define Win32_Winsock
#endif
#include <windows.h>
+#ifndef __MINGW32__ /* GCC/Mingw32-2.95.2 forgot the WINAPI on CommandLineToArgvW() */
+# include <shellapi.h>
+#else
+ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCommandLine, int * pNumArgs);
+#endif
#include <winnt.h>
#include <io.h>
#endif
#include <string.h>
#include <stdarg.h>
-#include <stdlib.h> /* get a real declaration of sys_nerr */
#include <float.h>
#include <time.h>
#if defined(_MSC_VER) || defined(__MINGW32__)
#else
#include <utime.h>
#endif
-
#ifdef __GNUC__
/* Mingw32 defaults to globing command line
* So we turn it off like this:
GetSystemInfo(&info);
#if defined(__BORLANDC__) || defined(__MINGW32__)
-#ifndef _STRUCT_NAME
-# define _STRUCT_NAME(s) s
-# define _UNION_NAME(u) u
-#endif
- switch (info._UNION_NAME(u.)_STRUCT_NAME(s.)wProcessorArchitecture) {
+ switch (info.u.s.wProcessorArchitecture) {
#else
switch (info.wProcessorArchitecture) {
#endif
long child = find_pseudo_pid(-pid);
if (child >= 0) {
HANDLE hThread = w32_pseudo_child_handles[child];
- DWORD waitcode = WaitForSingleObject(hThread, INFINITE);
- if (waitcode != WAIT_FAILED) {
+ DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
+ DWORD waitcode = WaitForSingleObject(hThread, timeout);
+ if (waitcode == WAIT_TIMEOUT) {
+ return 0;
+ }
+ else if (waitcode != WAIT_FAILED) {
if (GetExitCodeThread(hThread, &waitcode)) {
*status = (int)((waitcode & 0xff) << 8);
retval = (int)w32_pseudo_child_pids[child];
remove_dead_pseudo_process(child);
- return retval;
+ return -retval;
}
}
else
long child = find_pid(pid);
if (child >= 0) {
HANDLE hProcess = w32_child_handles[child];
- DWORD waitcode = WaitForSingleObject(hProcess, INFINITE);
- if (waitcode != WAIT_FAILED) {
- if (GetExitCodeProcess(hProcess, &waitcode)) {
- *status = (int)((waitcode & 0xff) << 8);
- retval = (int)w32_child_pids[child];
- remove_dead_process(child);
- return retval;
- }
+ DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
+ DWORD waitcode = WaitForSingleObject(hProcess, timeout);
+ if (waitcode == WAIT_TIMEOUT) {
+ return 0;
+ }
+ else if (waitcode != WAIT_FAILED) {
+ if (GetExitCodeProcess(hProcess, &waitcode)) {
+ *status = (int)((waitcode & 0xff) << 8);
+ retval = (int)w32_child_pids[child];
+ remove_dead_process(child);
+ return retval;
+ }
}
else
errno = ECHILD;
*status = (int)((exitcode & 0xff) << 8);
retval = (int)w32_pseudo_child_pids[i];
remove_dead_pseudo_process(i);
- return retval;
+ return -retval;
}
}
}
DllExport char *
win32_strerror(int e)
{
+#ifndef __BORLANDC__ /* Borland intolerance */
+ extern int sys_nerr;
+#endif
DWORD source = 0;
if (e < 0 || e > sys_nerr) {
StreamId.dwStreamAttributes = 0;
StreamId.dwStreamNameSize = 0;
#if defined(__BORLANDC__) || defined(__MINGW32__)
- StreamId.Size._UNION_NAME(u.)HighPart = 0;
- StreamId.Size._UNION_NAME(u.)LowPart = dwLen;
+ StreamId.Size.u.HighPart = 0;
+ StreamId.Size.u.LowPart = dwLen;
#else
StreamId.Size.HighPart = 0;
StreamId.Size.LowPart = dwLen;
}
}
-typedef LPWSTR* (WINAPI CLTARGVW)(LPCWSTR lpCommandLine, int * pNumArgs);
-/* load shell32.dll on demand (reduces number of DLLs loaded on startup by 1/3)
- -- BKS 5-28-2000 */
void
win32_argv2utf8(int argc, char** argv)
{
dTHXo;
char* psz;
int length, wargc;
- HANDLE hDll = LoadLibraryA("shell32.dll");
- CLTARGVW *pCommandLineToArgvW = NULL;
- LPWSTR* lpwStr = NULL;
- if (hDll && (pCommandLineToArgvW = (CLTARGVW*)GetProcAddress(hDll, "CommandLineToArgvW"))) {
- lpwStr = (*pCommandLineToArgvW)(GetCommandLineW(), &wargc);
- }
+ LPWSTR* lpwStr = CommandLineToArgvW(GetCommandLineW(), &wargc);
if (lpwStr && argc) {
while (argc--) {
length = WideCharToMultiByte(CP_UTF8, 0, lpwStr[--wargc], -1, NULL, 0, NULL, NULL);
}
call_atexit(win32_free_argvw, argv);
}
- if (hDll)
- FreeLibrary(hDll);
GlobalFree((HGLOBAL)lpwStr);
}
+