nSize = GetEnvironmentVariableA("PATH", NULL, 0);
if (!nSize)
- return application;
+ return _strdup(application);
lpSystemPath = (LPSTR) malloc(nSize);
if (!lpSystemPath)
sigfillset(&set);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+ if (lpStartupInfo)
+ {
+ int handle_fd;
+
+ handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdOutput);
+ if (handle_fd != -1)
+ dup2(handle_fd, STDOUT_FILENO);
+
+ handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdError);
+ if (handle_fd != -1)
+ dup2(handle_fd, STDERR_FILENO);
+
+ handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdInput);
+ if (handle_fd != -1)
+ dup2(handle_fd, STDIN_FILENO);
+ }
+
+
#ifdef __sun
- closefrom(3);
+ closefrom(3);
#else
#ifdef F_MAXFD // on some BSD derivates
- maxfd = fcntl(0, F_MAXFD);
+ maxfd = fcntl(0, F_MAXFD);
#else
- maxfd = sysconf(_SC_OPEN_MAX);
+ maxfd = sysconf(_SC_OPEN_MAX);
#endif
- for(fd=3; fd<maxfd; fd++)
- close(fd);
+ for(fd=3; fd<maxfd; fd++)
+ close(fd);
#endif // __sun
if (token)
#include <winpr/synch.h>
#include <winpr/thread.h>
#include <winpr/environment.h>
+#include <winpr/pipe.h>
+
+#define TESTENV "TEST_PROCESS=oyeah"
int TestThreadCreateProcess(int argc, char* argv[])
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
LPTCH lpszEnvironmentBlock;
+ HANDLE pipe_read = NULL;
+ HANDLE pipe_write = NULL;
+ char buf[255];
+ DWORD read_bytes;
+ int ret = 0;
lpszEnvironmentBlock = GetEnvironmentStrings();
return 1;
}
+
+ WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
+
+ exitCode = 0;
+ status = GetExitCodeProcess(ProcessInformation.hProcess, &exitCode);
+
+ printf("GetExitCodeProcess status: %d\n", status);
+ printf("Process exited with code: 0x%08X\n", exitCode);
+
+ CloseHandle(ProcessInformation.hProcess);
+ CloseHandle(ProcessInformation.hThread);
FreeEnvironmentStrings(lpszEnvironmentBlock);
+ /* Test stdin,stdout,stderr redirection */
+ ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
+ StartupInfo.cb = sizeof(STARTUPINFO);
+ ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
+
+ if (!CreatePipe(&pipe_read, &pipe_write, NULL, 0))
+ {
+ printf("Pipe creation failed. error=%d\n", GetLastError());
+ return 1;
+ }
+ StartupInfo.hStdOutput = pipe_write;
+ StartupInfo.hStdError = pipe_write;
+
+ lpEnvironment = calloc(1, sizeof(TESTENV) + 1);
+ strncpy(lpEnvironment, TESTENV, strlen(TESTENV));
+ lpCommandLine = _T("printenv");
+
+ status = CreateProcess(lpApplicationName,
+ lpCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandles,
+ dwCreationFlags,
+ lpEnvironment,
+ lpCurrentDirectory,
+ &StartupInfo,
+ &ProcessInformation);
+
+ free(lpEnvironment);
+
+ if (!status)
+ {
+ CloseHandle(pipe_read);
+ CloseHandle(pipe_write);
+ printf("CreateProcess failed. error=%d\n", GetLastError());
+ return 1;
+ }
+
+ if (WaitForSingleObject(pipe_read, 200) != WAIT_OBJECT_0)
+ {
+ printf("pipe wait failed.\n");
+ ret = 1;
+ }
+ else
+ {
+ ReadFile(pipe_read, buf, 255, &read_bytes, NULL);
+ if (read_bytes < strlen(TESTENV))
+ {
+ printf("pipe read problem?!\n");
+ ret = 1;
+ }
+ }
+
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
+ CloseHandle(pipe_read);
+ CloseHandle(pipe_write);
+
exitCode = 0;
status = GetExitCodeProcess(ProcessInformation.hProcess, &exitCode);
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
- return 0;
+ return ret;
}