agent: Add include files.
[gnupg.git] / agent / command-ssh.c
index 79b8f85..382f9e6 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <assert.h>
+#ifndef HAVE_W32_SYSTEM
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif /*!HAVE_W32_SYSTEM*/
+#ifdef HAVE_UCRED_H
+#include <ucred.h>
+#endif
 
 #include "agent.h"
 
@@ -2393,13 +2400,12 @@ card_key_list (ctrl_t ctrl, char **r_serialno, strlist_t *result)
   err = agent_card_serialno (ctrl, r_serialno, NULL);
   if (err)
     {
-      if (gpg_err_code (err) == GPG_ERR_ENODEV)
-        return 0;               /* Nothing available.  */
-
-      if (opt.verbose)
+      if (gpg_err_code (err) != GPG_ERR_ENODEV && opt.verbose)
         log_info (_("error getting serial number of card: %s\n"),
                   gpg_strerror (err));
-      return err;
+
+      /* Nothing available.  */
+      return 0;
     }
 
   err = agent_card_cardlist (ctrl, result);
@@ -2568,7 +2574,6 @@ ssh_handler_request_identities (ctrl_t ctrl,
   gpg_error_t err;
   int ret;
   ssh_control_file_t cf = NULL;
-  char *cardsn;
   gpg_error_t ret_err;
 
   (void)request;
@@ -2601,21 +2606,21 @@ ssh_handler_request_identities (ctrl_t ctrl,
           if (opt.verbose)
             log_info (_("error getting list of cards: %s\n"),
                       gpg_strerror (err));
-          goto out;
+          goto scd_out;
         }
 
       for (sl = card_list; sl; sl = sl->next)
         {
           char *serialno0;
+          char *cardsn;
+
           err = agent_card_serialno (ctrl, &serialno0, sl->d);
           if (err)
             {
               if (opt.verbose)
                 log_info (_("error getting serial number of card: %s\n"),
                           gpg_strerror (err));
-              xfree (serialno);
-              free_strlist (card_list);
-              goto out;
+              continue;
             }
 
           xfree (serialno0);
@@ -2640,6 +2645,7 @@ ssh_handler_request_identities (ctrl_t ctrl,
       free_strlist (card_list);
     }
 
+ scd_out:
   /* Then look at all the registered and non-disabled keys. */
   err = open_control_file (&cf, 0);
   if (err)
@@ -3557,31 +3563,39 @@ ssh_request_process (ctrl_t ctrl, estream_t stream_sock)
 }
 
 
-/* Return the peer's pid.  Stripped down code from libassuan.  */
+/* Return the peer's pid.  */
 static unsigned long
 get_client_pid (int fd)
 {
   pid_t client_pid = (pid_t)(-1);
 
-#ifdef HAVE_SO_PEERCRED
+#ifdef SO_PEERCRED
   {
+#ifdef HAVE_STRUCT_SOCKPEERCRED_PID
+    struct sockpeercred cr;
+#else
     struct ucred cr;
+#endif
     socklen_t cl = sizeof cr;
 
     if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl))
-      client_pid = cr.pid;
+      {
+#if defined (HAVE_STRUCT_SOCKPEERCRED_PID) || defined (HAVE_STRUCT_UCRED_PID)
+        client_pid = cr.pid;
+#elif defined (HAVE_STRUCT_UCRED_CR_PID)
+        client_pid = cr.cr_pid;
+#else
+#error "Unknown SO_PEERCRED struct"
+#endif
+      }
   }
-#elif defined (HAVE_GETPEERUCRED)
+#elif defined (LOCAL_PEERPID)
   {
-    ucred_t *ucred = NULL;
+    socklen_t len = sizeof (pid_t);
 
-    if (getpeerucred (fd, &ucred) != -1)
-      {
-       client_pid= ucred_getpid (ucred);
-       ucred_free (ucred);
-      }
+    getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &client_pid, &len);
   }
-#elif defined (HAVE_LOCAL_PEEREID)
+#elif defined (LOCAL_PEEREID)
   {
     struct unpcbid unp;
     socklen_t unpl = sizeof unp;
@@ -3589,6 +3603,16 @@ get_client_pid (int fd)
     if (getsockopt (fd, 0, LOCAL_PEEREID, &unp, &unpl) != -1)
       client_pid = unp.unp_pid;
   }
+#elif defined (HAVE_GETPEERUCRED)
+  {
+    ucred_t *ucred = NULL;
+
+    if (getpeerucred (fd, &ucred) != -1)
+      {
+        client_pid= ucred_getpid (ucred);
+        ucred_free (ucred);
+      }
+  }
 #endif
 
   return client_pid == (pid_t)(-1)? 0 : (unsigned long)client_pid;