Added missing file
[gnupg.git] / common / ttyio.c
index fd74800..38883af 100644 (file)
@@ -1,5 +1,6 @@
 /* ttyio.c -  tty i/O functions
- * Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+ * Copyright (C) 1998,1999,2000,2001,2002,2003,
+ *               2004, 2006 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -15,7 +16,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -37,7 +39,7 @@
 #define HAVE_TCGETATTR
 #endif
 #endif
-#ifdef __MINGW32__ /* use the odd Win32 functions */
+#ifdef _WIN32 /* use the odd Win32 functions */
 #include <windows.h>
 #ifdef HAVE_TCGETATTR
 #error mingw32 and termios
 #endif
 #include <errno.h>
 #include <ctype.h>
+#ifdef HAVE_LIBREADLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+
 #include "util.h"
 #include "memory.h"
 #include "ttyio.h"
 
 #define CONTROL_D ('D' - 'A' + 1)
 
-#ifdef __MINGW32__ /* use the odd Win32 functions */
+#ifdef _WIN32 /* use the odd Win32 functions */
 static struct {
     HANDLE in, out;
 } con;
@@ -93,13 +101,21 @@ tty_get_ttyname (void)
   if (!got_name)
     {
       const char *s;
+      /* Note that despite our checks for these macros the function is
+         not necessarily thread save.  We mainly do this for
+         portability reasons, in case L_ctermid is not defined. */
+# if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_POSIX_TRHEADS)
+      char buffer[L_ctermid];
+      s = ctermid (buffer);
+# else
       s = ctermid (NULL);
+# endif
       if (s)
         name = strdup (s);
       got_name = 1;
     }
-#endif
-  /* Assume the staandrd tty on memory error or when tehre is no
+#endif /*HAVE_CTERMID*/
+  /* Assume the standard tty on memory error or when tehre is no
      certmid. */
   return name? name : "/dev/tty";
 }
@@ -124,7 +140,7 @@ init_ttyfp(void)
     if( initialized )
        return;
 
-#if defined(__MINGW32__)
+#if defined(_WIN32)
     {
        SECURITY_ATTRIBUTES sa;
 
@@ -165,6 +181,34 @@ init_ttyfp(void)
 }
 
 
+#ifdef HAVE_LIBREADLINE
+void
+tty_enable_completion(rl_completion_func_t *completer)
+{
+/*   if( no_terminal ) */
+/*     return; */
+
+/*   if( !initialized ) */
+/*     init_ttyfp(); */
+
+/*   rl_attempted_completion_function=completer; */
+/*   rl_inhibit_completion=0; */
+}
+
+void
+tty_disable_completion(void)
+{
+/*   if( no_terminal ) */
+/*     return; */
+
+/*   if( !initialized ) */
+/*     init_ttyfp(); */
+
+/*   rl_inhibit_completion=1; */
+}
+#endif /*HAVE_LIBREADLINE*/
+
+
 int
 tty_batchmode( int onoff )
 {
@@ -194,7 +238,54 @@ tty_printf( const char *fmt, ... )
        init_ttyfp();
 
     va_start( arg_ptr, fmt ) ;
-#ifdef __MINGW32__
+#ifdef _WIN32
+    {   
+        char *buf = NULL;
+        int n;
+       DWORD nwritten;
+
+       n = vasprintf(&buf, fmt, arg_ptr);
+       if( !buf )
+           log_bug("vasprintf() failed\n");
+        
+       if( !WriteConsoleA( con.out, buf, n, &nwritten, NULL ) )
+           log_fatal("WriteConsole failed: rc=%d", (int)GetLastError() );
+       if( n != nwritten )
+           log_fatal("WriteConsole failed: %d != %d\n", n, (int)nwritten );
+       last_prompt_len += n;
+        xfree (buf);
+    }
+#else
+    last_prompt_len += vfprintf(ttyfp,fmt,arg_ptr) ;
+    fflush(ttyfp);
+#endif
+    va_end(arg_ptr);
+}
+
+
+/* Same as tty_printf but if FP is not NULL, behave like a regualr
+   fprintf. */
+void
+tty_fprintf (FILE *fp, const char *fmt, ... )
+{
+  va_list arg_ptr;
+
+  if (fp)
+    {
+      va_start (arg_ptr, fmt) ;
+      vfprintf (fp, fmt, arg_ptr );
+      va_end (arg_ptr);
+      return;
+    }
+
+  if (no_terminal)
+    return;
+
+  if( !initialized )
+    init_ttyfp();
+
+    va_start( arg_ptr, fmt ) ;
+#ifdef _WIN32
     {   
         char *buf = NULL;
         int n;
@@ -223,7 +314,7 @@ tty_printf( const char *fmt, ... )
  * Print a string, but filter all control characters out.
  */
 void
-tty_print_string( byte *p, size_t n )
+tty_print_string ( const byte *p, size_t n )
 {
     if (no_terminal)
        return;
@@ -231,7 +322,7 @@ tty_print_string( byte *p, size_t n )
     if( !initialized )
        init_ttyfp();
 
-#ifdef __MINGW32__
+#ifdef _WIN32
     /* not so effective, change it if you want */
     for( ; n; n--, p++ )
        if( iscntrl( *p ) ) {
@@ -261,7 +352,7 @@ tty_print_string( byte *p, size_t n )
 }
 
 void
-tty_print_utf8_string2( byte *p, size_t n, size_t max_n )
+tty_print_utf8_string2( const byte *p, size_t n, size_t max_n )
 {
     size_t i;
     char *buf;
@@ -275,7 +366,7 @@ tty_print_utf8_string2( byte *p, size_t n, size_t max_n )
            break;
     }
     if( i < n ) {
-       buf = utf8_to_native( p, n, 0 );
+       buf = utf8_to_native( (const char *)p, n, 0 );
        if( max_n && (strlen( buf ) > max_n )) {
            buf[max_n] = 0;
        }
@@ -292,7 +383,7 @@ tty_print_utf8_string2( byte *p, size_t n, size_t max_n )
 }
 
 void
-tty_print_utf8_string( byte *p, size_t n )
+tty_print_utf8_string( const byte *p, size_t n )
 {
     tty_print_utf8_string2( p, n, 0 );
 }
@@ -325,7 +416,7 @@ do_get( const char *prompt, int hidden )
     buf = xmalloc((n=50));
     i = 0;
 
-#ifdef __MINGW32__ /* windoze version */
+#ifdef _WIN32 /* windoze version */
     if( hidden )
        SetConsoleMode(con.in, HID_INPMODE );
 
@@ -480,7 +571,7 @@ tty_kill_prompt()
        last_prompt_len = 0;
     if( !last_prompt_len )
        return;
-#ifdef __MINGW32__
+#ifdef _WIN32
     tty_printf("\r%*s\r", last_prompt_len, "");
 #else
     {