common: Re-indent ttyio.c and remove EMX, RISCOS, and CE support

* common/ttyio.c: Remove cruft like EMX and RISCOS support.  Translate
a few strings.  Re-indent.
--

Backported-from-master: 8622f53994
This commit is contained in:
Werner Koch 2021-03-05 09:19:43 +01:00
parent d7d9a5ba3c
commit 521e176a60
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 268 additions and 303 deletions

View File

@ -1,6 +1,7 @@
/* ttyio.c - tty i/O functions
* Copyright (C) 1998,1999,2000,2001,2002,2003,2004,2006,2007,
* 2009, 2010 Free Software Foundation, Inc.
* Copyright (C) 1997-2019 Werner Koch
* Copyright (C) 1998-2020 Free Software Foundation, Inc.
* Copyright (C) 2015-2020 g10 Code GmbH
*
* This file is part of GnuPG.
*
@ -26,6 +27,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <https://www.gnu.org/licenses/>.
* SPDX-License-Identifier: (LGPL-3.0-or-later OR GPL-2.0-or-later)
*/
#include <config.h>
@ -35,10 +37,6 @@
#include <stdarg.h>
#include <unistd.h>
#if defined(HAVE_W32_SYSTEM) && !defined(HAVE_W32CE_SYSTEM)
# define USE_W32_CONSOLE 1
#endif
#ifdef HAVE_TCGETATTR
# include <termios.h>
#else
@ -52,7 +50,7 @@
# define HAVE_TCGETATTR
# endif
#endif
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
# ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
# endif
@ -66,12 +64,13 @@
#include "util.h"
#include "ttyio.h"
#include "i18n.h"
#include "common-defs.h"
#define CONTROL_D ('D' - 'A' + 1)
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
static struct {
HANDLE in, out;
} con;
@ -80,9 +79,9 @@ static struct {
#define HID_INPMODE (ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT )
#define DEF_OUTMODE (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)
#else /* yeah, we have a real OS */
#else /* Unix */
static FILE *ttyfp = NULL;
#endif
#endif /* Unix */
static int initialized;
static int last_prompt_len;
@ -145,13 +144,15 @@ tty_get_ttyname (void)
static void
cleanup(void)
{
if( restore_termios ) {
restore_termios = 0; /* do it prios in case it is interrupted again */
if (restore_termios)
{
restore_termios = 0; /* do it prior in case it is interrupted again */
if (tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave))
log_error ("tcsetattr() failed: %s\n", strerror (errno));
}
}
#endif
#endif /*HAVE_TCGETATTR*/
static void
init_ttyfp(void)
@ -159,7 +160,7 @@ init_ttyfp(void)
if (initialized)
return;
#if defined(USE_W32_CONSOLE)
#ifdef HAVE_W32_SYSTEM
{
SECURITY_ATTRIBUTES sa;
@ -170,7 +171,8 @@ init_ttyfp(void)
FILE_SHARE_READ|FILE_SHARE_WRITE,
&sa, OPEN_EXISTING, 0, 0 );
if (con.out == INVALID_HANDLE_VALUE)
log_fatal("open(CONOUT$) failed: rc=%d", (int)GetLastError() );
log_fatal ("open(CONOUT$) failed: %s\n", w32_strerror (-1));
memset (&sa, 0, sizeof(sa));
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
@ -178,32 +180,26 @@ init_ttyfp(void)
FILE_SHARE_READ|FILE_SHARE_WRITE,
&sa, OPEN_EXISTING, 0, 0 );
if (con.in == INVALID_HANDLE_VALUE)
log_fatal("open(CONIN$) failed: rc=%d", (int)GetLastError() );
log_fatal ("open(CONIN$) failed: %s\n", w32_strerror (-1));
}
SetConsoleMode (con.in, DEF_INPMODE);
SetConsoleMode (con.out, DEF_OUTMODE);
#elif defined(__EMX__)
ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */
if (my_rl_init_stream)
my_rl_init_stream (ttyfp);
#elif defined (HAVE_W32CE_SYSTEM)
ttyfp = stderr;
#else
#else /* Unix */
ttyfp = batchmode? stderr : fopen (tty_get_ttyname (), "r+");
if( !ttyfp ) {
log_error("cannot open '%s': %s\n", tty_get_ttyname (),
strerror(errno) );
if (!ttyfp)
{
log_error ("cannot open '%s': %s\n", tty_get_ttyname (), strerror(errno));
exit (2);
}
if (my_rl_init_stream)
my_rl_init_stream (ttyfp);
#endif
#endif /* Unix */
#ifdef HAVE_TCGETATTR
atexit (cleanup);
#endif
initialized = 1;
}
@ -237,7 +233,8 @@ tty_printf( const char *fmt, ... )
init_ttyfp ();
va_start (arg_ptr, fmt);
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
{
char *buf = NULL;
int n;
@ -254,10 +251,10 @@ tty_printf( const char *fmt, ... )
last_prompt_len += n;
xfree (buf);
}
#else
#else /* Unix */
last_prompt_len += vfprintf (ttyfp, fmt, arg_ptr) ;
fflush (ttyfp);
#endif
#endif /* Unix */
va_end(arg_ptr);
}
@ -284,7 +281,8 @@ tty_fprintf (estream_t fp, const char *fmt, ... )
init_ttyfp ();
va_start (arg_ptr, fmt);
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
{
char *buf = NULL;
int n;
@ -301,10 +299,11 @@ tty_fprintf (estream_t fp, const char *fmt, ... )
last_prompt_len += n;
xfree (buf);
}
#else
#else /* Unix */
last_prompt_len += vfprintf(ttyfp,fmt,arg_ptr) ;
fflush(ttyfp);
#endif
#endif /* Unix */
va_end(arg_ptr);
}
@ -326,7 +325,7 @@ do_print_string (estream_t fp, const byte *p, size_t n )
return;
}
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
/* Not so effective, change it if you want */
for (; n; n--, p++)
{
@ -342,7 +341,7 @@ do_print_string (estream_t fp, const byte *p, size_t n )
else
tty_printf ("%c", *p);
}
#else
#else /* Unix */
for (; n; n--, p++)
{
if (iscntrl (*p))
@ -358,7 +357,7 @@ do_print_string (estream_t fp, const byte *p, size_t n )
else
putc (*p, ttyfp);
}
#endif
#endif /* Unix */
}
@ -371,24 +370,25 @@ tty_print_utf8_string2 (estream_t fp, const byte *p, size_t n, size_t max_n)
if (no_terminal && !fp)
return;
/* we can handle plain ascii simpler, so check for it first */
for(i=0; i < n; i++ ) {
/* We can handle plain ascii simpler, so check for it first. */
for(i=0; i < n; i++ )
{
if (p[i] & 0x80)
break;
}
if( i < n ) {
if (i < n)
{
buf = utf8_to_native ((const char *)p, n, 0);
if( max_n && (strlen( buf ) > max_n )) {
if (max_n && (strlen (buf) > max_n))
buf[max_n] = 0;
}
/*(utf8 conversion already does the control character quoting)*/
/* (utf8_to_native already did the control character quoting) */
tty_fprintf (fp, "%s", buf);
xfree (buf);
}
else {
if( max_n && (n > max_n) ) {
else
{
if (max_n && (n > max_n))
n = max_n;
}
do_print_string (fp, p, n );
}
}
@ -401,22 +401,26 @@ tty_print_utf8_string( const byte *p, size_t n )
}
/* Read a string from the tty using PROMPT. If HIDDEN is set the
* input is not echoed. */
static char *
do_get (const char *prompt, int hidden)
{
char *buf;
#ifndef __riscos__
int n; /* Allocated size of BUF. */
int i; /* Number of bytes in BUF. */
int c;
byte cbuf[1];
#endif
int c, n, i;
if( batchmode ) {
log_error("Sorry, we are in batchmode - can't get input\n");
if (batchmode)
{
log_error (_("Sorry, we are in batchmode - can't get input\n"));
exit (2);
}
if (no_terminal) {
log_error("Sorry, no terminal at all requested - can't get input\n");
if (no_terminal)
{
log_error (_("Sorry, no terminal at all requested - can't get input\n"));
exit (2);
}
@ -428,11 +432,12 @@ do_get( const char *prompt, int hidden )
buf = xmalloc((n=50));
i = 0;
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
if (hidden)
SetConsoleMode(con.in, HID_INPMODE );
for(;;) {
for (;;)
{
DWORD nread;
if (!ReadConsoleA( con.in, cbuf, 1, &nread, NULL))
@ -447,12 +452,10 @@ do_get( const char *prompt, int hidden )
c = *cbuf;
if (c == '\t')
c = ' ';
else if( c > 0xa0 )
; /* we don't allow 0xa0, as this is a protected blank which may
* confuse the user */
else if( iscntrl(c) )
else if ( (c >= 0 && c <= 0x1f) || c == 0x7f)
continue;
if( !(i < n-1) ) {
if (!(i < n-1))
{
n += 50;
buf = xrealloc (buf, n);
}
@ -462,56 +465,10 @@ do_get( const char *prompt, int hidden )
if (hidden)
SetConsoleMode(con.in, DEF_INPMODE );
#elif defined(__riscos__) || defined(HAVE_W32CE_SYSTEM)
do {
#ifdef HAVE_W32CE_SYSTEM
/* Using getchar is not a correct solution but for now it
doesn't matter because we have no real console at all. We
should rework this as soon as we have switched this entire
module to estream. */
c = getchar();
#else
c = riscos_getchar();
#endif
if (c == 0xa || c == 0xd) { /* Return || Enter */
c = (int) '\n';
} else if (c == 0x8 || c == 0x7f) { /* Backspace || Delete */
if (i>0) {
i--;
if (!hidden) {
last_prompt_len--;
fputc(8, ttyfp);
fputc(32, ttyfp);
fputc(8, ttyfp);
fflush(ttyfp);
}
} else {
fputc(7, ttyfp);
fflush(ttyfp);
}
continue;
} else if (c == (int) '\t') { /* Tab */
c = ' ';
} else if (c > 0xa0) {
; /* we don't allow 0xa0, as this is a protected blank which may
* confuse the user */
} else if (iscntrl(c)) {
continue;
}
if(!(i < n-1)) {
n += 50;
buf = xrealloc (buf, n);
}
buf[i++] = c;
if (!hidden) {
last_prompt_len++;
fputc(c, ttyfp);
fflush(ttyfp);
}
} while (c != '\n');
i = (i>0) ? i-1 : 0;
#else /* Other systems. */
if( hidden ) {
#else /* Unix */
if (hidden)
{
#ifdef HAVE_TCGETATTR
struct termios term;
@ -522,43 +479,47 @@ do_get( const char *prompt, int hidden )
term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
if (tcsetattr( fileno(ttyfp), TCSAFLUSH, &term ) )
log_fatal("tcsetattr() failed: %s\n", strerror(errno));
#endif
#endif /*HAVE_TCGETATTR*/
}
/* fixme: How can we avoid that the \n is echoed w/o disabling
* canonical mode - w/o this kill_prompt can't work */
while( read(fileno(ttyfp), cbuf, 1) == 1 && *cbuf != '\n' ) {
while (read(fileno(ttyfp), cbuf, 1) == 1 && *cbuf != '\n')
{
if (!hidden)
last_prompt_len++;
c = *cbuf;
if (c == CONTROL_D)
log_info("control d found\n");
if( c == '\t' )
log_info (_("Control-D detected\n"));
if (c == '\t') /* Map tab to a space. */
c = ' ';
else if( c > 0xa0 )
; /* we don't allow 0xa0, as this is a protected blank which may
* confuse the user */
else if( iscntrl(c) )
continue;
if( !(i < n-1) ) {
else if ( (c >= 0 && c <= 0x1f) || c == 0x7f)
continue; /* Skip all other ASCII control characters. */
if (!(i < n-1))
{
n += 50;
buf = xrealloc (buf, n);
}
buf[i++] = c;
}
if( *cbuf != '\n' ) {
if (*cbuf != '\n')
{
buf[0] = CONTROL_D;
i = 1;
}
if( hidden ) {
if (hidden)
{
#ifdef HAVE_TCGETATTR
if (tcsetattr (fileno(ttyfp), TCSAFLUSH, &termsave))
log_error ("tcsetattr() failed: %s\n", strerror(errno));
restore_termios = 0;
#endif
#endif /*HAVE_TCGETATTR*/
}
#endif /* end unix version */
#endif /* Unix */
buf[i] = 0;
return buf;
}
@ -602,8 +563,9 @@ tty_get( const char *prompt )
return do_get ( prompt, 0 );
}
/* Variable argument version of tty_get. The prompt is actually a
format string with arguments. */
* format string with arguments. */
char *
tty_getf (const char *promptfmt, ... )
{
@ -621,7 +583,6 @@ tty_getf (const char *promptfmt, ... )
}
char *
tty_get_hidden( const char *prompt )
{
@ -630,7 +591,7 @@ tty_get_hidden( const char *prompt )
void
tty_kill_prompt()
tty_kill_prompt (void)
{
if (no_terminal)
return;
@ -642,9 +603,9 @@ tty_kill_prompt()
last_prompt_len = 0;
if (!last_prompt_len)
return;
#ifdef USE_W32_CONSOLE
#ifdef HAVE_W32_SYSTEM
tty_printf ("\r%*s\r", last_prompt_len, "");
#else
#else /* Unix */
{
int i;
putc ('\r', ttyfp);
@ -653,7 +614,7 @@ tty_kill_prompt()
putc ('\r', ttyfp);
fflush (ttyfp);
}
#endif
#endif /* Unix */
last_prompt_len = 0;
}
@ -662,10 +623,13 @@ int
tty_get_answer_is_yes( const char *prompt )
{
int yes;
char *p = tty_get( prompt );
char *p;
p = tty_get (prompt);
tty_kill_prompt ();
yes = answer_is_yes (p);
xfree (p);
return yes;
}
@ -712,7 +676,7 @@ tty_disable_completion (void)
my_rl_inhibit_completion (1);
}
#endif
#endif /* HAVE_LIBREADLINE */
void
tty_cleanup_after_signal (void)

View File

@ -24,6 +24,7 @@ common/audit.c
common/helpfile.c
common/gettime.c
common/ksba-io-support.c
common/ttyio.c
common/argparse.c
common/logging.c