agent: Tell pinentry the hostname the agent is running on.
[gnupg.git] / agent / call-pinentry.c
index fa00bf9..9931665 100644 (file)
@@ -31,6 +31,7 @@
 # include <sys/wait.h>
 # include <sys/types.h>
 # include <signal.h>
+# include <sys/utsname.h>
 #endif
 #include <npth.h>
 
@@ -540,8 +541,31 @@ start_pinentry (ctrl_t ctrl)
         }
     }
 
+  /* Tell Pinentry about our client.  */
+  if (ctrl->client_pid)
+    {
+      char *optstr;
+      const char *nodename = "";
+
+#ifndef HAVE_W32_SYSTEM
+      struct utsname utsbuf;
+      if (!uname (&utsbuf))
+        nodename = utsbuf.nodename;
+#endif /*!HAVE_W32_SYSTEM*/
+
+      if ((optstr = xtryasprintf ("OPTION owner=%lu %s",
+                                  ctrl->client_pid, nodename)))
+        {
+          assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+                           NULL);
+          /* We ignore errors because this is just a fancy thing and
+             older pinentries do not support this feature.  */
+          xfree (optstr);
+        }
+    }
+
 
-  /* Ask the pinentry for its version and flavor and streo that as a
+  /* Ask the pinentry for its version and flavor and store that as a
    * string in MB.  This information is useful for helping users to
    * figure out Pinentry problems.  */
   {
@@ -555,6 +579,10 @@ start_pinentry (ctrl_t ctrl)
     if (assuan_transact (entry_ctx, "GETINFO version",
                          put_membuf_cb, &mb, NULL, NULL, NULL, NULL))
       put_membuf_str (&mb, "unknown");
+    put_membuf_str (&mb, " ");
+    if (assuan_transact (entry_ctx, "GETINFO ttyinfo",
+                         put_membuf_cb, &mb, NULL, NULL, NULL, NULL))
+      put_membuf_str (&mb, "? ? ?");
     put_membuf (&mb, "", 1);
     flavor_version = get_membuf (&mb, NULL);
   }