Rev 174 | Rev 177 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 174 | Rev 175 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | else if (wcschr (command_pathname, L' ') != NULL) |
57 | else if (wcschr (command_pathname, L' ') != NULL) |
58 | *wcschr (command_pathname, L' ') = 0; |
58 | *wcschr (command_pathname, L' ') = 0; |
59 | 59 | ||
60 | // build the bidirectional I/O pipe |
60 | // build the bidirectional I/O pipe |
61 | pipe = (pipe_t *) malloc (sizeof (pipe_t)); |
61 | pipe = (pipe_t *) malloc (sizeof (pipe_t)); |
- | 62 | memset (pipe, 0, sizeof (pipe_t)); |
|
62 | memset (&security_attributes, 0, sizeof (security_attributes)); // prepare the pipes' security attributes |
63 | memset (&security_attributes, 0, sizeof (security_attributes)); // prepare the pipes' security attributes |
63 | security_attributes.nLength = sizeof (SECURITY_ATTRIBUTES); |
64 | security_attributes.nLength = sizeof (SECURITY_ATTRIBUTES); |
64 | security_attributes.bInheritHandle = true; // set the bInheritHandle flag so pipe handles are inherited |
65 | security_attributes.bInheritHandle = true; // set the bInheritHandle flag so pipe handles are inherited |
65 | hStdIO[0][0] = hStdIO[0][1] = hStdIO[1][0] = hStdIO[1][1] = NULL; |
66 | hStdIO[0][0] = hStdIO[0][1] = hStdIO[1][0] = hStdIO[1][1] = NULL; |
66 | CreatePipe (&hStdIO[ME_TO_IT][RD], &hStdIO[ME_TO_IT][WR], &security_attributes, 0); // create a pipe for the child process's stdin |
67 | CreatePipe (&hStdIO[ME_TO_IT][RD], &hStdIO[ME_TO_IT][WR], &security_attributes, 0); // create a pipe for the child process's stdin |
Line 157... | Line 158... | ||
157 | { |
158 | { |
158 | // wrapper around ioctl() on pipes for systems that don't have it |
159 | // wrapper around ioctl() on pipes for systems that don't have it |
159 | 160 | ||
160 | #ifdef _WIN32 |
161 | #ifdef _WIN32 |
161 | DWORD exit_code; |
162 | DWORD exit_code; |
- | 163 | DWORD handle_flags; |
|
- | 164 | if (((pipe_t *) stream)->procinfo.hProcess == 0) |
|
- | 165 | return (1); // if the child process has not been fully started yet, assume the pipe is still alive |
|
- | 166 | else if (((pipe_t *) stream)->procinfo.hProcess == INVALID_HANDLE_VALUE) |
|
- | 167 | return (0); // if the child process handle has been explicitly marked invalid, assume it's already dead |
|
- | 168 | else if (GetHandleInformation (((pipe_t *) stream)->procinfo.hProcess, &handle_flags) == 0) |
|
- | 169 | { |
|
- | 170 | ((pipe_t *) stream)->procinfo.hProcess = INVALID_HANDLE_VALUE; |
|
- | 171 | return (0); // if the process handle is no longer valid but its handle is not marked as such, assume the child is dead |
|
- | 172 | } |
|
162 |
|
173 | else if (GetExitCodeProcess (((pipe_t *) stream)->procinfo.hProcess, &exit_code) == 0) |
- | 174 | return (1); // if GetExitCodeProcess() failed, *conservatively* assume the child is still alive |
|
- | 175 | return (exit_code == STILL_ACTIVE); |
|
163 | #else // !_WIN32 |
176 | #else // !_WIN32 |
164 | return (1); // UNIX doesn't provide a portable way for this |
177 | return (1); // UNIX doesn't provide a portable way for this |
165 | #endif // _WIN32 |
178 | #endif // _WIN32 |
166 | } |
179 | } |
167 | 180 |