Replace missing getpass()

getpass() is traditional Unix, but has been withdrawn from POSIX.  As
such, it may be missing.  Check for that, and provide ersatz.  It's
not a real replacement, because it doesn't do the special magic
getpass() is supposed to do: read from /dev/tty without echo.

This bypasses our existing getpass() for Windows.  In contrast to the
portable getpass(), the Windows one tries to turn off echo, but that
doesn't work for me (MinGW & Wine).  Remove it.
This commit is contained in:
Markus Armbruster 2009-04-10 14:57:13 +02:00
parent b65395d6f4
commit 8c3b8d107d
5 changed files with 24 additions and 32 deletions

View file

@ -92,7 +92,7 @@ AC_C_CHAR_UNSIGNED
### Checks for library functions
AC_CHECK_FUNCS(getaddrinfo)
AC_CHECK_FUNCS(getaddrinfo getpass)
MY_FUNC_MAKECONTEXT

View file

@ -81,7 +81,7 @@ AC_MSG_RESULT([$Windows_res])
### Checks for library functions.
AC_CHECK_FUNCS(getaddrinfo)
AC_CHECK_FUNCS(getaddrinfo getpass)
### Site configuration

View file

@ -44,6 +44,28 @@
#include "misc.h"
#include "proto.h"
#ifndef HAVE_GETPASS
#define getpass ersatz_getpass
static char *
ersatz_getpass(char *prompt)
{
static char buf[128];
char *p;
size_t len;
printf("Note: your input is echoed to the screen\n");
printf("Your name? ");
fflush(stdout);
p = fgets(buf, sizeof(buf), stdin);
if (!p)
return NULL;
len = strlen(p);
if (p[len - 1] == '\n')
p[len - 1] = 0;
return p;
}
#endif
int
login(int s, char *uname, char *cname, char *cpass,
int kill_proc, int utf8)

View file

@ -204,35 +204,6 @@ w32_close_socket(int fd)
return result;
}
/*
* WIN32 equivalent for getpass
*/
char *
getpass(char *prompt)
{
static char tmp[128];
int len;
char *cpass;
DWORD mode;
HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
if (GetConsoleMode(input_handle, &mode))
SetConsoleMode(input_handle, mode & ~ENABLE_ECHO_INPUT);
else
printf("Note: This is echoed to the screen\n");
printf("%s", prompt);
fflush(stdout);
cpass = fgets(tmp, sizeof(tmp), stdin);
if (GetConsoleMode(input_handle, &mode))
SetConsoleMode(input_handle, mode | ENABLE_ECHO_INPUT);
if (cpass == NULL)
return NULL;
len = strlen(cpass);
if (tmp[len - 1] == '\n')
tmp[len - 1] = 0;
return cpass;
}
/*
* POSIX compatible open() replacement
*/

View file

@ -75,7 +75,6 @@ extern int w32_openfd(const char *fname, int oflag, ...);
extern int w32_openhandle(const char *fname, int oflag);
extern struct passwd *w32_getpw(void);
extern char *getpass(char *prompt);
extern void sysdep_init(void);
#define recv(sock, buffer, buf_size, flags) \