From c5c7bee68730c9f66a27f9bb0d023480623a2bfb Mon Sep 17 00:00:00 2001
From: Werner Koch <wk@gnupg.org>
Date: Thu, 1 Dec 2016 09:10:08 +0100
Subject: [PATCH] Fix linkage problem in tty and emacs pinentries.

* emacs/pinentry-emacs.c (curses_cmd_handler): Remove var.
* tty/pinentry-tty.c (curses_cmd_handler): Remove var.
* pinentry/pinentry.c (flavor_flag): New local var.
(pinentry_set_flavor_flag): New function.
(cmd_getinfo): Use FLAVOR_FLAG for the "flavor" sub-command.
* gnome3/pinentry-gnome3.c (main): Call pinentry_set_flavor_flag.
* gtk+-2/pinentry-gtk-2.c (main): Ditto.
* pinentry/pinentry-emacs.c (initial_emacs_cmd_handler): Ditto.
* qt/main.cpp (main): Ditto.
--

Fixes-commit: e4e3a9cc88704dcffac660d0b92fd1ed8abecc11
Fixes-commit: d126036671e7dd631babc118cb4113f723f15748
Signed-off-by: Werner Koch <wk@gnupg.org>
---
 emacs/pinentry-emacs.c    |  4 ----
 gnome3/pinentry-gnome3.c  |  3 +++
 gtk+-2/pinentry-gtk-2.c   | 10 ++++++++--
 pinentry/pinentry-emacs.c |  5 ++++-
 pinentry/pinentry.c       | 34 ++++++++++++++++++----------------
 pinentry/pinentry.h       |  4 ++++
 qt/main.cpp               |  1 +
 tty/pinentry-tty.c        |  3 ---
 8 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/emacs/pinentry-emacs.c b/emacs/pinentry-emacs.c
index b6b3eb8..3c39a96 100644
--- a/emacs/pinentry-emacs.c
+++ b/emacs/pinentry-emacs.c
@@ -29,10 +29,6 @@
 
 pinentry_cmd_handler_t pinentry_cmd_handler = emacs_cmd_handler;
 
-/* needed to link cleanly; should never be used except for comparison
- * in pinentry/pinentry.c's cmd_getinfo(): */
-pinentry_cmd_handler_t curses_cmd_handler = NULL;
-
 
 
 int
diff --git a/gnome3/pinentry-gnome3.c b/gnome3/pinentry-gnome3.c
index a040f9b..d5a49d6 100644
--- a/gnome3/pinentry-gnome3.c
+++ b/gnome3/pinentry-gnome3.c
@@ -517,18 +517,21 @@ main (int argc, char *argv[])
       fprintf (stderr, "No $DBUS_SESSION_BUS_ADDRESS found,"
                " falling back to curses\n");
       pinentry_cmd_handler = curses_cmd_handler;
+      pinentry_set_flavor_flag ("curses");
     }
   else if (!pe_gcr_system_prompt_available ())
     {
       fprintf (stderr, "No Gcr System Prompter available,"
                " falling back to curses\n");
       pinentry_cmd_handler = curses_cmd_handler;
+      pinentry_set_flavor_flag ("curses");
     }
   else if (pe_gnome_screen_locked ())
     {
       fprintf (stderr, "GNOME screensaver is locked,"
                " falling back to curses\n");
       pinentry_cmd_handler = curses_cmd_handler;
+      pinentry_set_flavor_flag ("curses");
     }
 #endif
 
diff --git a/gtk+-2/pinentry-gtk-2.c b/gtk+-2/pinentry-gtk-2.c
index 6037533..473c4aa 100644
--- a/gtk+-2/pinentry-gtk-2.c
+++ b/gtk+-2/pinentry-gtk-2.c
@@ -938,10 +938,16 @@ main (int argc, char *argv[])
   if (pinentry_have_display (argc, argv))
     {
       if (! gtk_init_check (&argc, &argv))
-	pinentry_cmd_handler = curses_cmd_handler;
+        {
+          pinentry_cmd_handler = curses_cmd_handler;
+          pinentry_set_flavor_flag ("curses");
+        }
     }
   else
-    pinentry_cmd_handler = curses_cmd_handler;
+    {
+      pinentry_cmd_handler = curses_cmd_handler;
+      pinentry_set_flavor_flag ("curses");
+    }
 #else
   gtk_init (&argc, &argv);
 #endif
diff --git a/pinentry/pinentry-emacs.c b/pinentry/pinentry-emacs.c
index df12f1b..50ba406 100644
--- a/pinentry/pinentry-emacs.c
+++ b/pinentry/pinentry-emacs.c
@@ -644,7 +644,10 @@ initial_emacs_cmd_handler (pinentry_t pe)
   if (emacs_socket < 0)
     pinentry_cmd_handler = fallback_cmd_handler;
   else
-    pinentry_cmd_handler = emacs_cmd_handler;
+    {
+      pinentry_cmd_handler = emacs_cmd_handler;
+      pinentry_set_flavor_flag ("emacs");
+    }
 
   return (* pinentry_cmd_handler) (pe);
 }
diff --git a/pinentry/pinentry.c b/pinentry/pinentry.c
index 322a651..a198fb3 100644
--- a/pinentry/pinentry.c
+++ b/pinentry/pinentry.c
@@ -67,6 +67,10 @@ static char this_pgmname[50];
 
 struct pinentry pinentry;
 
+
+static const char *flavor_flag;
+
+
 static void
 pinentry_reset (int use_defaults)
 {
@@ -793,6 +797,16 @@ pinentry_parse_opts (int argc, char *argv[])
     }
 }
 
+
+/* Set the optional flag used with getinfo. */
+void
+pinentry_set_flavor_flag (const char *string)
+{
+  flavor_flag = string;
+}
+
+
+
 
 static gpg_error_t
 option_handler (assuan_context_t ctx, const char *key, const char *value)
@@ -1444,27 +1458,15 @@ cmd_getinfo (assuan_context_t ctx, char *line)
     }
   else if (!strcmp (line, "flavor"))
     {
-      const char *flags;
-
       if (!strncmp (this_pgmname, "pinentry-", 9) && this_pgmname[9])
         s = this_pgmname + 9;
       else
         s = this_pgmname;
 
-      if (0)
-        ;
-#ifdef INSIDE_EMACS
-      else if (pinentry_cmd_handler == emacs_cmd_handler)
-        flags = ":emacs";
-#endif
-#ifdef FALLBACK_CURSES
-      else if (pinentry_cmd_handler == curses_cmd_handler)
-        flags = ":curses";
-#endif
-      else
-        flags = "";
-
-      snprintf (buffer, sizeof buffer, "%s%s", s, flags);
+      snprintf (buffer, sizeof buffer, "%s%s%s",
+                s,
+                flavor_flag? ":":"",
+                flavor_flag? flavor_flag : "");
       buffer[sizeof buffer -1] = 0;
       rc = assuan_send_data (ctx, buffer, strlen (buffer));
     }
diff --git a/pinentry/pinentry.h b/pinentry/pinentry.h
index 01fb373..45d35ad 100644
--- a/pinentry/pinentry.h
+++ b/pinentry/pinentry.h
@@ -275,6 +275,10 @@ int pinentry_have_display (int argc, char **argv);
    or version output is requested.  */
 void pinentry_parse_opts (int argc, char *argv[]);
 
+/* Set the optional flag used with getinfo. */
+void pinentry_set_flavor_flag (const char *string);
+
+
 
 /* The caller must define this variable to process assuan commands.  */
 extern pinentry_cmd_handler_t pinentry_cmd_handler;
diff --git a/qt/main.cpp b/qt/main.cpp
index 8284960..225c06b 100644
--- a/qt/main.cpp
+++ b/qt/main.cpp
@@ -308,6 +308,7 @@ main(int argc, char *argv[])
 #ifdef FALLBACK_CURSES
     if (!pinentry_have_display(argc, argv)) {
         pinentry_cmd_handler = curses_cmd_handler;
+        pinentry_set_flavor_flag ("curses");
     } else
 #endif
     {
diff --git a/tty/pinentry-tty.c b/tty/pinentry-tty.c
index 3d6cd5a..a509d79 100644
--- a/tty/pinentry-tty.c
+++ b/tty/pinentry-tty.c
@@ -556,9 +556,6 @@ tty_cmd_handler(pinentry_t pinentry)
 
 pinentry_cmd_handler_t pinentry_cmd_handler = tty_cmd_handler;
 
-/* needed to link cleanly; should never be used except for comparison
- * in pinentry/pinentry.c's cmd_getinfo(): */
-pinentry_cmd_handler_t curses_cmd_handler = NULL;
 
 
 int
-- 
2.8.0.rc3

