* ttyio.c (TERMDEVICE): Removed.
authorWerner Koch <wk@gnupg.org>
Sat, 9 Nov 2002 17:49:01 +0000 (17:49 +0000)
committerWerner Koch <wk@gnupg.org>
Sat, 9 Nov 2002 17:49:01 +0000 (17:49 +0000)
(tty_get_ttyname): New.
(init_ttyfp): Use it here instead of the TERMDEVICE macro.

include/ttyio.h
util/ChangeLog
util/ttyio.c

index 08ca994..5f65579 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef G10_TTYIO_H
 #define G10_TTYIO_H
 
+const char *tty_get_ttyname (void);
 int tty_batchmode( int onoff );
 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
  void tty_printf (const char *fmt, ... ) __attribute__ ((format (printf,1,2)));
index 4b13098..8477bdc 100644 (file)
@@ -1,3 +1,9 @@
+2002-11-09  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c (TERMDEVICE): Removed.
+       (tty_get_ttyname): New.
+       (init_ttyfp): Use it here instead of the TERMDEVICE macro.
+
 2002-11-06  David Shaw  <dshaw@jabberwocky.com>
 
        * w32reg.c (read_w32_registry_string): Fixed expanding of the
index 40fe7eb..2d362a5 100644 (file)
@@ -1,5 +1,5 @@
 /* ttyio.c -  tty i/O functions
- *     Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include "ttyio.h"
 
 #define CONTROL_D ('D' - 'A' + 1)
-#ifdef __VMS
-  #define TERMDEVICE "/dev/tty"
-#else
-  #define TERMDEVICE "/dev/tty"
-#endif
 
 #ifdef __MINGW32__ /* use the odd Win32 functions */
 static struct {
@@ -80,6 +75,36 @@ static int no_terminal;
 #endif
 
 
+
+/* This is a wrapper around ttyname so that we can use it even when
+   the standard streams are redirected.  It figures the name out the
+   first time and returns it in a statically allocated buffer. */
+const char *
+tty_get_ttyname (void)
+{
+  static char *name;
+
+  /* On a GNU system ctermid() always return /dev/tty, so this does
+     not make much sense - however if it is ever changed we do the
+     Right Thing now. */
+#ifdef HAVE_CTERMID
+  static int got_name;
+
+  if (!got_name)
+    {
+      const char *s;
+      s = ctermid (NULL);
+      if (s)
+        name = strdup (s);
+      got_name = 1;
+    }
+#endif
+  /* Assume the staandrd tty on memory error or when tehre is no
+     certmid. */
+  return name? name : "/dev/tty";
+}
+
+
 #ifdef HAVE_TCGETATTR
 static void
 cleanup(void)
@@ -98,7 +123,7 @@ init_ttyfp(void)
     if( initialized )
        return;
 
-  #if defined(__MINGW32__)
+#if defined(__MINGW32__)
     {
        SECURITY_ATTRIBUTES sa;
 
@@ -122,18 +147,19 @@ init_ttyfp(void)
     SetConsoleMode(con.in, DEF_INPMODE );
     SetConsoleMode(con.out, DEF_OUTMODE );
 
-  #elif defined(__EMX__)
+#elif defined(__EMX__)
     ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */
-  #else
-    ttyfp = batchmode? stderr : fopen(TERMDEVICE, "r+");
+#else
+    ttyfp = batchmode? stderr : fopen( tty_get_ttyname (), "r+");
     if( !ttyfp ) {
-       log_error("cannot open /dev/tty: %s\n", strerror(errno) );
+       log_error("cannot open `%s': %s\n",
+                  tty_get_ttyname (), strerror(errno) );
        exit(2);
     }
-  #endif
-  #ifdef HAVE_TCGETATTR
+#endif
+#ifdef HAVE_TCGETATTR
     atexit( cleanup );
-  #endif
+#endif
     initialized = 1;
 }