enum GNUNET_OS_InheritStdioFlags std_inheritance,
struct GNUNET_DISK_PipeHandle *pipe_stdin,
struct GNUNET_DISK_PipeHandle *pipe_stdout,
+ struct GNUNET_DISK_PipeHandle *pipe_stderr,
const SOCKTYPE *lsocks,
const char *filename,
char *const argv[])
unsigned int ls;
int fd_stdout_write;
int fd_stdout_read;
+ int fd_stderr_write;
+ int fd_stderr_read;
int fd_stdin_read;
int fd_stdin_write;
(pipe_stdin, GNUNET_DISK_PIPE_END_WRITE),
&fd_stdin_write, sizeof (int)));
}
+ if (NULL != pipe_stderr)
+ {
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_DISK_internal_file_handle_ (GNUNET_DISK_pipe_handle
+ (pipe_stderr,
+ GNUNET_DISK_PIPE_END_READ),
+ &fd_stderr_read, sizeof (int)));
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_DISK_internal_file_handle_ (GNUNET_DISK_pipe_handle
+ (pipe_stderr,
+ GNUNET_DISK_PIPE_END_WRITE),
+ &fd_stderr_write, sizeof (int)));
+ }
lscp = NULL;
ls = 0;
if (NULL != lsocks)
GNUNET_break (0 == close (1));
open_dev_null (1, O_WRONLY);
}
- if (0 == (std_inheritance & GNUNET_OS_INHERIT_STD_ERR))
+ if (NULL != pipe_stderr)
+ {
+ GNUNET_break (0 == close (fd_stderr_read));
+ if (-1 == dup2 (fd_stderr_write, 2))
+ LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "dup2");
+ GNUNET_break (0 == close (fd_stderr_write));
+ }
+ else if (0 == (std_inheritance & GNUNET_OS_INHERIT_STD_ERR))
{
GNUNET_break (0 == close (2));
open_dev_null (2, O_WRONLY);
DWORD stdif, stdof, stdef;
BOOL bresult;
DWORD error_code;
+ DWORD create_no_window;
if (GNUNET_SYSERR == GNUNET_OS_check_helper_binary (filename, GNUNET_NO, NULL))
return NULL; /* not executable */
return NULL;
}
+ create_no_window = 0;
+ {
+ HANDLE console_input = CreateFile ("CONIN$", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
+ if (INVALID_HANDLE_VALUE == console_input)
+ create_no_window = CREATE_NO_WINDOW;
+ else
+ CloseHandle (console_input);
+ }
+
bresult = CreateProcessW (wpath, wcmd, NULL, NULL, GNUNET_YES,
- CREATE_NO_WINDOW | CREATE_SUSPENDED, env_block, NULL, &start, &proc);
+ create_no_window | CREATE_SUSPENDED, env_block, NULL, &start, &proc);
error_code = GetLastError ();
if ((NULL == pipe_stdin) && (stdih))
}
-
-
/**
* Start a process.
*
* @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags
* @param pipe_stdin pipe to use to send input to child process (or NULL)
* @param pipe_stdout pipe to use to get output from child process (or NULL)
+ * @param pipe_stderr pipe to use to get output from child process (or NULL)
* @param filename name of the binary
* @param argv NULL-terminated array of arguments to the process
* @return pointer to process structure of the new process, NULL on error
enum GNUNET_OS_InheritStdioFlags std_inheritance,
struct GNUNET_DISK_PipeHandle *pipe_stdin,
struct GNUNET_DISK_PipeHandle *pipe_stdout,
+ struct GNUNET_DISK_PipeHandle *pipe_stderr,
const char *filename,
char *const argv[])
{
std_inheritance,
pipe_stdin,
pipe_stdout,
+ pipe_stderr,
NULL,
filename,
argv);
* @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags
* @param pipe_stdin pipe to use to send input to child process (or NULL)
* @param pipe_stdout pipe to use to get output from child process (or NULL)
+ * @param pipe_stderr pipe to use to get output from child process (or NULL)
* @param filename name of the binary
* @param va NULL-terminated list of arguments to the process
* @return pointer to process structure of the new process, NULL on error
enum GNUNET_OS_InheritStdioFlags std_inheritance,
struct GNUNET_DISK_PipeHandle *pipe_stdin,
struct GNUNET_DISK_PipeHandle *pipe_stdout,
+ struct GNUNET_DISK_PipeHandle *pipe_stderr,
const char *filename, va_list va)
{
struct GNUNET_OS_Process *ret;
std_inheritance,
pipe_stdin,
pipe_stdout,
+ pipe_stderr,
filename,
argv);
GNUNET_free (argv);
enum GNUNET_OS_InheritStdioFlags std_inheritance,
struct GNUNET_DISK_PipeHandle *pipe_stdin,
struct GNUNET_DISK_PipeHandle *pipe_stdout,
+ struct GNUNET_DISK_PipeHandle *pipe_stderr,
const char *filename, ...)
{
struct GNUNET_OS_Process *ret;
va_list ap;
va_start (ap, filename);
- ret = GNUNET_OS_start_process_va (pipe_control, std_inheritance, pipe_stdin,
- pipe_stdout, filename, ap);
+ ret = GNUNET_OS_start_process_va (pipe_control,
+ std_inheritance,
+ pipe_stdin,
+ pipe_stdout,
+ pipe_stderr,
+ filename,
+ ap);
va_end (ap);
return ret;
}
std_inheritance,
NULL,
NULL,
+ NULL,
lsocks,
filename,
argv);
return NULL;
va_start (ap, binary);
/* redirect stdout, don't inherit stderr/stdin */
- eip = GNUNET_OS_start_process_va (GNUNET_NO, 0, NULL, opipe, binary, ap);
+ eip = GNUNET_OS_start_process_va (GNUNET_NO, 0, NULL, opipe, NULL, binary, ap);
va_end (ap);
if (NULL == eip)
{