mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
common: New flags for gnupg_spawn_process
* common/exechelp.h (GNUPG_SPAWN_KEEP_STDIN): New. (GNUPG_SPAWN_KEEP_STDOUT): New. (GNUPG_SPAWN_KEEP_STDERR): New. * common/exechelp-posix.c (do_exec): Add arg flags and implement new flags. * common/exechelp-w32.c (gnupg_spawn_process): Implement new flags.
This commit is contained in:
parent
d94b411f12
commit
6d6438a361
3 changed files with 29 additions and 9 deletions
|
@ -277,16 +277,21 @@ get_all_open_fds (void)
|
|||
static void
|
||||
do_exec (const char *pgmname, const char *argv[],
|
||||
int fd_in, int fd_out, int fd_err,
|
||||
int *except, void (*preexec)(void) )
|
||||
int *except, void (*preexec)(void), unsigned int flags)
|
||||
{
|
||||
char **arg_list;
|
||||
int i, j;
|
||||
int fds[3];
|
||||
int nodevnull[3];
|
||||
|
||||
fds[0] = fd_in;
|
||||
fds[1] = fd_out;
|
||||
fds[2] = fd_err;
|
||||
|
||||
nodevnull[0] = !!(flags & GNUPG_SPAWN_KEEP_STDIN);
|
||||
nodevnull[1] = !!(flags & GNUPG_SPAWN_KEEP_STDOUT);
|
||||
nodevnull[2] = !!(flags & GNUPG_SPAWN_KEEP_STDERR);
|
||||
|
||||
/* Create the command line argument array. */
|
||||
i = 0;
|
||||
if (argv)
|
||||
|
@ -305,7 +310,9 @@ do_exec (const char *pgmname, const char *argv[],
|
|||
/* Assign /dev/null to unused FDs. */
|
||||
for (i=0; i <= 2; i++)
|
||||
{
|
||||
if (fds[i] == -1 )
|
||||
if (nodevnull[i])
|
||||
continue;
|
||||
if (fds[i] == -1)
|
||||
{
|
||||
fds[i] = open ("/dev/null", i? O_WRONLY : O_RDONLY);
|
||||
if (fds[i] == -1)
|
||||
|
@ -317,6 +324,8 @@ do_exec (const char *pgmname, const char *argv[],
|
|||
/* Connect the standard files. */
|
||||
for (i=0; i <= 2; i++)
|
||||
{
|
||||
if (nodevnull[i])
|
||||
continue;
|
||||
if (fds[i] != i && dup2 (fds[i], i) == -1)
|
||||
log_fatal ("dup2 std%s failed: %s\n",
|
||||
i==0?"in":i==1?"out":"err", strerror (errno));
|
||||
|
@ -535,7 +544,7 @@ gnupg_spawn_process (const char *pgmname, const char *argv[],
|
|||
es_fclose (outfp);
|
||||
es_fclose (errfp);
|
||||
do_exec (pgmname, argv, inpipe[0], outpipe[1], errpipe[1],
|
||||
except, preexec);
|
||||
except, preexec, flags);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
|
@ -585,7 +594,7 @@ gnupg_spawn_process_fd (const char *pgmname, const char *argv[],
|
|||
{
|
||||
gcry_control (GCRYCTL_TERM_SECMEM);
|
||||
/* Run child. */
|
||||
do_exec (pgmname, argv, infd, outfd, errfd, NULL, NULL);
|
||||
do_exec (pgmname, argv, infd, outfd, errfd, NULL, NULL, 0);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
|
@ -884,7 +893,7 @@ gnupg_spawn_process_detached (const char *pgmname, const char *argv[],
|
|||
for (i=0; envp[i]; i++)
|
||||
putenv (xstrdup (envp[i]));
|
||||
|
||||
do_exec (pgmname, argv, -1, -1, -1, NULL, NULL);
|
||||
do_exec (pgmname, argv, -1, -1, -1, NULL, NULL, 0);
|
||||
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue