summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/assuan-support.c58
1 files changed, 53 insertions, 5 deletions
diff --git a/src/assuan-support.c b/src/assuan-support.c
index 8c331c68..3c3a3cbf 100644
--- a/src/assuan-support.c
+++ b/src/assuan-support.c
@@ -158,7 +158,7 @@ my_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
void (*atfork) (void *opaque, int reserved),
void *atforkvalue, unsigned int flags)
{
- int err;
+ int err = 0;
struct spawn_fd_item_s *fd_items;
int i;
@@ -209,10 +209,58 @@ my_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
fd_items[i].fd = -1;
fd_items[i].dup_to = -1;
- err = _gpgme_io_spawn (name, (char*const*)argv,
- (IOSPAWN_FLAG_NOCLOSE | IOSPAWN_FLAG_DETACHED),
- fd_items, atfork, atforkvalue, r_pid);
- if (! err)
+#ifdef HAVE_W32_SYSTEM
+ /* Fix up a potential logger fd so that on windows the fd
+ * translation can work through gpgme-w32spawn.
+ *
+ * We do this here as a hack because we would
+ * otherwise have to change assuan_api and the current
+ * plan in 2019 is to change away from this to gpgrt
+ * based IPC. */
+ if (argv)
+ {
+ int loc = 0;
+ while (argv[loc])
+ {
+ if (!strcmp ("--logger-fd", argv[loc]))
+ {
+ long logger_fd = -1;
+ char *tail;
+ int k = 0;
+ loc++;
+ if (!argv[loc])
+ {
+ err = GPG_ERR_INV_ARG;
+ break;
+ }
+ logger_fd = strtoul (argv[loc], &tail, 10);
+ if (tail == argv[loc] || logger_fd <= 0)
+ {
+ err = GPG_ERR_INV_ARG;
+ break;
+ }
+ while (fd_items[k++].fd != -1)
+ {
+ if (fd_items[k].fd == logger_fd)
+ {
+ fd_items[k].arg_loc = loc;
+ break;
+ }
+ }
+ break;
+ }
+ loc++;
+ }
+ }
+#endif
+
+ if (!err)
+ {
+ err = _gpgme_io_spawn (name, (char*const*)argv,
+ (IOSPAWN_FLAG_NOCLOSE | IOSPAWN_FLAG_DETACHED),
+ fd_items, atfork, atforkvalue, r_pid);
+ }
+ if (!err)
{
i = 0;