Locate engine names only at runtime and prefer GnuPG-2.
[gpgme.git] / src / assuan-support.c
index cd9cbc4..d06518a 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <assert.h>
 #include <stdlib.h>
+#include <errno.h>
 
 #include "assuan.h"
 
@@ -40,11 +41,21 @@ my_usleep (assuan_context_t ctx, unsigned int usec)
   __assuan_usleep (ctx, usec);
 }
 
+
 /* Create a pipe with an inheritable end.  */
 static int
 my_pipe (assuan_context_t ctx, assuan_fd_t fds[2], int inherit_idx)
 {
-  return _gpgme_io_pipe (fds, inherit_idx);
+  int res;
+  int gfds[2];
+
+  res = _gpgme_io_pipe (gfds, inherit_idx);
+
+  /* For now... */
+  fds[0] = (assuan_fd_t) gfds[0];
+  fds[1] = (assuan_fd_t) gfds[1];
+
+  return res;
 }
 
 
@@ -53,21 +64,21 @@ my_pipe (assuan_context_t ctx, assuan_fd_t fds[2], int inherit_idx)
 static int
 my_close (assuan_context_t ctx, assuan_fd_t fd)
 {
-  return _gpgme_io_close (fd);
+  return _gpgme_io_close ((int) fd);
 }
 
 
-static ssize_t
+static gpgme_ssize_t
 my_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size)
 {
-  return _gpgme_io_read (fd, buffer, size);
+  return _gpgme_io_read ((int) fd, buffer, size);
 }
 
 
-static ssize_t
+static gpgme_ssize_t
 my_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, size_t size)
 {
-  return _gpgme_io_write (fd, buffer, size);
+  return _gpgme_io_write ((int) fd, buffer, size);
 }
 
 
@@ -76,9 +87,10 @@ my_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg,
            int flags)
 {
 #ifdef HAVE_W32_SYSTEM
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+  gpg_err_set_errno (ENOSYS);
+  return -1;
 #else
-  return _gpgme_io_recvmsg (fd, msg, flags);
+  return _gpgme_io_recvmsg ((int) fd, msg, flags);
 #endif
 }
 
@@ -89,9 +101,10 @@ my_sendmsg (assuan_context_t ctx, assuan_fd_t fd, const assuan_msghdr_t msg,
            int flags)
 {
 #ifdef HAVE_W32_SYSTEM
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+  gpg_err_set_errno (ENOSYS);
+  return -1;
 #else
-  return _gpgme_io_sendmsg (fd, msg, flags);
+  return _gpgme_io_sendmsg ((int) fd, msg, flags);
 #endif
 }
 
@@ -107,54 +120,67 @@ my_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
          void (*atfork) (void *opaque, int reserved),
          void *atforkvalue, unsigned int flags)
 {
-  gpg_error_t err;
+  int err;
   struct spawn_fd_item_s *fd_items;
   int i;
 
   assert (name);
 
   if (! name)
-    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+    {
+      gpg_err_set_errno (ENOSYS);
+      return -1;
+    }
 
   i = 0;
-  while (fd_child_list[i] != ASSUAN_INVALID_FD)
-    i++;
+  if (fd_child_list)
+    {
+      while (fd_child_list[i] != ASSUAN_INVALID_FD)
+       i++;
+    }
   /* fd_in, fd_out, terminator */
   i += 3;
-  fd_items = malloc (sizeof (struct spawn_fd_item_s) * i);
+  fd_items = calloc (i, sizeof (struct spawn_fd_item_s));
   if (! fd_items)
-    return gpg_error_from_syserror ();
+    return -1;
   i = 0;
-  while (fd_child_list[i] != ASSUAN_INVALID_FD)
+  if (fd_child_list)
     {
-      fd_items[i].fd = fd_child_list[i];
-      fd_items[i].dup_to = -1;
-      i++;
+      while (fd_child_list[i] != ASSUAN_INVALID_FD)
+       {
+         fd_items[i].fd = (int) fd_child_list[i];
+         fd_items[i].dup_to = -1;
+         i++;
+       }
     }
   if (fd_in != ASSUAN_INVALID_FD)
     {
-      fd_items[i].fd = fd_in;
+      fd_items[i].fd = (int) fd_in;
       fd_items[i].dup_to = 0;
       i++;
     }
   if (fd_out != ASSUAN_INVALID_FD)
     {
-      fd_items[i].fd = fd_out;
+      fd_items[i].fd = (int) fd_out;
       fd_items[i].dup_to = 1;
       i++;
     }
   fd_items[i].fd = -1;
   fd_items[i].dup_to = -1;
 
-  err = _gpgme_io_spawn (name, argv, 0, fd_items, r_pid);
+  err = _gpgme_io_spawn (name, (char*const*)argv, IOSPAWN_FLAG_NOCLOSE,
+                        fd_items, atfork, atforkvalue, r_pid);
   if (! err)
     {
       i = 0;
 
-      while (fd_child_list[i] != ASSUAN_INVALID_FD)
+      if (fd_child_list)
        {
-         fd_child_list[i] = fd_items[i].peer_name;
-         i++;
+         while (fd_child_list[i] != ASSUAN_INVALID_FD)
+           {
+             fd_child_list[i] = (assuan_fd_t) fd_items[i].peer_name;
+             i++;
+           }
        }
     }
   free (fd_items);
@@ -174,7 +200,7 @@ my_waitpid (assuan_context_t ctx, pid_t pid,
      NOWAIT in POSIX systems just means the caller already did the
      waitpid for this child.  */
   if (! nowait)
-    return _gpgme_ath_waitpid (pid, status, options); 
+    return _gpgme_ath_waitpid (pid, status, options);
 #endif
   return 0;
 }
@@ -186,8 +212,28 @@ static int
 my_socketpair (assuan_context_t ctx, int namespace, int style,
               int protocol, assuan_fd_t filedes[2])
 {
-  assert ("Should never happen.");
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+#ifdef HAVE_W32_SYSTEM
+  gpg_err_set_errno (ENOSYS);
+  return -1;
+#else
+  /* FIXME: Debug output missing.  */
+  return __assuan_socketpair (ctx, namespace, style, protocol, filedes);
+#endif
+}
+
+
+static int
+my_socket (assuan_context_t ctx, int namespace, int style, int protocol)
+{
+  return _gpgme_io_socket (namespace, style, protocol);
+}
+
+
+static int
+my_connect (assuan_context_t ctx, int sock, struct sockaddr *addr,
+           socklen_t length)
+{
+  return _gpgme_io_connect (sock, addr, length);
 }
 
 
@@ -203,6 +249,8 @@ struct assuan_system_hooks _gpgme_assuan_system_hooks =
     my_sendmsg,
     my_spawn,
     my_waitpid,
-    my_socketpair
+    my_socketpair,
+    my_socket,
+    my_connect
   };