aboutsummaryrefslogtreecommitdiffstats
path: root/src/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/src/system.c b/src/system.c
index c6f0b3d..0327abf 100644
--- a/src/system.c
+++ b/src/system.c
@@ -34,6 +34,8 @@
#include <fcntl.h>
#endif
+#include <gpg-error.h>
+
#include "assuan-defs.h"
#include "debug.h"
@@ -293,15 +295,21 @@ _assuan_sendmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg,
FD_CHILD_LIST as given (no remapping), which must be inheritable.
On Unix, call ATFORK with ATFORKVALUE after fork and before exec. */
int
-_assuan_spawn (assuan_context_t ctx, assuan_pid_t *r_pid, const char *name,
- const char **argv,
+_assuan_spawn (assuan_context_t ctx, const char *name, const char **argv,
assuan_fd_t fd_in, assuan_fd_t fd_out,
assuan_fd_t *fd_child_list,
- void (*atfork) (void *opaque, int reserved),
+ void (*atfork) (void *opaque),
void *atforkvalue, unsigned int flags)
{
int res;
int i;
+ gpgrt_spawn_actions_t act = NULL;
+ unsigned int spawn_flags;
+ gpg_err_code_t ec;
+ gpgrt_process_t proc = NULL;
+ int keep_stderr = 0;
+ assuan_fd_t *fdp;
+
TRACE_BEG6 (ctx, ASSUAN_LOG_CTX, "_assuan_spawn", ctx,
"name=%s,fd_in=0x%x,fd_out=0x%x,"
"atfork=%p,atforkvalue=%p,flags=%i",
@@ -327,17 +335,45 @@ _assuan_spawn (assuan_context_t ctx, assuan_pid_t *r_pid, const char *name,
}
}
- res = __assuan_spawn (ctx, r_pid, name, argv, fd_in, fd_out,
- fd_child_list, atfork, atforkvalue, flags);
+ spawn_flags = GPGRT_PROCESS_STDIN_PIPE|GPGRT_PROCESS_STDOUT_PIPE;
+ if ((flags & ASSUAN_SPAWN_DETACHED))
+ spawn_flags |= GPGRT_PROCESS_NO_CONSOLE;
- if (name)
+ if (fd_child_list)
+ {
+ for (fdp = fd_child_list; *fdp != ASSUAN_INVALID_FD; fdp++)
+ if (*fdp == (assuan_fd_t)STDERR_FILENO)
+ {
+ keep_stderr = 1;
+ break;
+ }
+ }
+ if (keep_stderr)
+ spawn_flags |= GPGRT_PROCESS_STDERR_KEEP;
+
+ ec = gpgrt_spawn_actions_new (&act);
+ if (ec)
{
- TRACE_LOG1 ("pid = 0x%x", *r_pid);
+ return -1;
}
- else
+
+#ifdef HAVE_W32_SYSTEM
+ /*FIXME*/
+ gpgrt_spawn_actions_set_inherit_handles (act, fd_child_list);
+ gpgrt_spawn_actions_set_redirect (act, fd_in, fd_out, -1);
+#else
+ gpgrt_spawn_actions_set_inherit_fds (act, fd_child_list);
+ gpgrt_spawn_actions_set_redirect (act, fd_in, fd_out, -1);
+ gpgrt_spawn_actions_set_atfork (act, atfork, atforkvalue);
+#endif
+ ec = gpgrt_process_spawn (name, argv+1, spawn_flags, act, &proc);
+ gpgrt_spawn_actions_release (act);
+ if (ec)
{
- TRACE_LOG2 ("pid = 0x%x (%s)", *r_pid, *argv);
+ return -1;
}
+ ctx->server_proc = proc;
+ res = 0;
return TRACE_SYSERR (res);
}