Do not use a broken ttyname.
authorWerner Koch <wk@gnupg.org>
Tue, 20 Nov 2012 18:01:13 +0000 (19:01 +0100)
committerWerner Koch <wk@gnupg.org>
Tue, 20 Nov 2012 18:03:49 +0000 (19:03 +0100)
* configure.ac (HAVE_BROKEN_TTYNAME): New ac_define set for Android
systems.
* common/util.h (gnupg_ttyname): New macro.  Change all callers of
ttyname to use this macro instead.
(ttyname) [W32]: Rename to _gnupg_ttyname and use also if
HAVE_BROKEN_TTYNAME is defined.
* common/simple-pwquery.c (agent_send_all_options): Keep on using
ttyname unless HAVE_BROKEN_TTYNAME is set.  This is because this file
may be used standalone.

agent/gpg-agent.c
common/session-env.c
common/simple-pwquery.c
common/util.h
configure.ac
sm/misc.c

index b117849..32da578 100644 (file)
@@ -662,7 +662,7 @@ main (int argc, char **argv )
       }
     if (!err)
       {
-        s = ttyname (0);
+        s = gnupg_ttyname (0);
         if (s)
           err = session_env_setenv (opt.startup_env, "GPG_TTY", s);
       }
@@ -984,7 +984,7 @@ main (int argc, char **argv )
     }
 
   /* Make sure that we have a default ttyname. */
-  if (!default_ttyname && ttyname (1))
+  if (!default_ttyname && gnupg_ttyname (1))
     default_ttyname = xstrdup (ttyname (1));
   if (!default_ttytype && getenv ("TERM"))
     default_ttytype = xstrdup (getenv ("TERM"));
index ff90447..478d5e3 100644 (file)
@@ -338,8 +338,11 @@ session_env_getenv_or_default (session_env_t se, const char *name,
 
   /* Get the default value with an additional fallback for GPG_TTY.  */
   defvalue = getenv (name);
-  if ((!defvalue || !*defvalue) && !strcmp (name, "GPG_TTY") && ttyname (0))
-    defvalue = ttyname (0);
+  if ((!defvalue || !*defvalue) && !strcmp (name, "GPG_TTY")
+      && gnupg_ttyname (0))
+    {
+      defvalue = gnupg_ttyname (0);
+    }
   if (defvalue)
     {
       /* Record the default value for later use so that we are safe
index 23e4b89..08f59d2 100644 (file)
@@ -222,7 +222,7 @@ agent_send_all_options (int fd)
     }
 
   dft_ttyname = getenv ("GPG_TTY");
-#ifndef HAVE_W32_SYSTEM
+#if !defined(HAVE_W32_SYSTEM) && !defined(HAVE_BROKEN_TTYNAME)
   if ((!dft_ttyname || !*dft_ttyname) && ttyname (0))
     dft_ttyname = ttyname (0);
 #endif
index 5ea7b81..c8a008f 100644 (file)
@@ -291,15 +291,21 @@ int gnupg_compare_version (const char *a, const char *b);
 
 
 /*-- Simple replacement functions. */
-#ifndef HAVE_TTYNAME
+
+/* We use the gnupg_ttyname macro to be safe not to run into conflicts
+   which an extisting but broken ttyname.  */
+#if !defined(HAVE_TTYNAME) || defined(HAVE_BROKEN_TTYNAME)
+# define gnupg_ttyname(n) _gnupg_ttyname ((n))
 /* Systems without ttyname (W32) will merely return NULL. */
 static inline char *
-ttyname (int fd)
+_gnupg_ttyname (int fd)
 {
   (void)fd;
   return NULL;
 }
-#endif /* !HAVE_TTYNAME */
+#else /*HAVE_TTYNAME*/
+# define gnupg_ttyname(n) ttyname ((n))
+#endif /*HAVE_TTYNAME */
 
 #ifdef HAVE_W32CE_SYSTEM
 #define getpid() GetCurrentProcessId ()
index 90c77fa..e821b99 100644 (file)
@@ -1247,6 +1247,12 @@ AC_CHECK_FUNCS([atexit raise getpagesize strftime nl_langinfo setlocale])
 AC_CHECK_FUNCS([waitpid wait4 sigaction sigprocmask pipe getaddrinfo])
 AC_CHECK_FUNCS([ttyname rand ftello fsync stat lstat])
 
+if test "$have_android_system" = yes; then
+   # On Android ttyname is a stub but prints an error message.
+   AC_DEFINE(HAVE_BROKEN_TTYNAME,1,
+             [Defined if ttyname does not work properly])
+fi
+
 AC_CHECK_TYPES([struct sigaction, sigset_t],,,[#include <signal.h>])
 
 # Dirmngr requires mmap on Unix systems.
index 4c6293f..ec9f97e 100644 (file)
--- a/sm/misc.c
+++ b/sm/misc.c
@@ -57,7 +57,7 @@ setup_pinentry_env (void)
     {
       log_error (_("GPG_TTY has not been set - "
                    "using maybe bogus default\n"));
-      lc = ttyname (0);
+      lc = gnupg_ttyname (0);
       if (!lc)
         lc = "/dev/tty";
       gnupg_setenv ("GPG_TTY", lc, 1);