-
- /* Make pipes to be passed to the spawned process as in/out/err */
- if ( _pipe ( fdOutPipe, 512, O_TEXT | O_NOINHERIT ) == -1 ) return (HANDLE)-1;
- if ( _pipe ( fdInPipe, 512, O_TEXT | O_NOINHERIT ) == -1 ) return (HANDLE)-1;
- if ( _pipe ( fdErrPipe, 512, O_TEXT | O_NOINHERIT ) == -1 ) return (HANDLE)-1;
-
- /* Duplicate and save original in/out/err handles */
- fdOut = _dup ( out );
- fdIn = _dup ( in );
- fdErr = _dup ( err );
-
- /* Duplicate write end of new pipes to current out/err handles,
- * read to in */
- if ( _dup2 ( fdOutPipe[WRITE_HANDLE], out ) != 0 ) return (HANDLE)-1;
- if ( _dup2 ( fdInPipe[READ_HANDLE], in ) != 0 ) return (HANDLE)-1;
- if ( _dup2 ( fdErrPipe[WRITE_HANDLE], err ) != 0 ) return (HANDLE)-1;
-
-
- /* Close the duplicated handles to the new pipes */
- close ( fdOutPipe[WRITE_HANDLE] );
- close ( fdInPipe[READ_HANDLE] );
- close ( fdErrPipe[WRITE_HANDLE] );
+ HANDLE hReturn;
+
+ /* Duplicate and save the original stdin/out/err handles. */
+ stdout_backup = _dup ( _fileno ( stdout ) );
+ stdin_backup = _dup ( _fileno ( stdin ) );
+ stderr_backup = _dup ( _fileno ( stderr ) );
+
+ /* If we are not using stdin/out/err
+ * then duplicate the new pipes to current stdin/out/err handles.
+ *
+ * Default std fds are used if in, out or err parameters
+ * are -1. */
+
+ hReturn = (HANDLE)-1;
+ hProcess = (HANDLE)-1;
+ if ( ( out >= 0 ) && ( out != _fileno ( stdout ) ) ) {
+ if ( _dup2 ( out, _fileno ( stdout ) ) != 0 ) goto error_exit;
+ }
+ if ( ( in >= 0 ) && ( in != _fileno ( stdin ) ) ) {
+ if ( _dup2 ( in, _fileno ( stdin ) ) != 0 ) goto error_exit_out;
+ }
+ if ( ( err >= 0 ) && ( err != _fileno ( stderr ) ) ) {
+ if ( _dup2 ( err, _fileno ( stderr ) ) != 0 ) goto error_exit_in;
+ }