Commit 1dd25572 1dd25572979f4ce89505c82ac91148470d13bc09 by Alain Magloire

Suprisingly some OSes do not have getpass()

        drop a dumb version in lib/getpass.c for missing plaforms.

        * configure.in: Check for getpass ();
        * lib/getpass.c: New file.
        * lib/Makefile.am: Updated.
1 parent 94711aa6
......@@ -7,9 +7,9 @@ INCLUDES = -I${top_srcdir}/include
libmailutils_a_SOURCES = basename.c daemon.c getopt.c getopt1.c md5.c \
mu_dbm.c getline.c xstrdup.c xmalloc.c argcv.c
EXTRA_DIST = alloca.c fnmatch.c setenv.c snprintf.c strchrnul.c strndup.c \
strnlen.c strtok_r.c strsignal.c xstrtol.c vasprintf.c malloc.c realloc.c \
fgetpwent.c obstack.c
EXTRA_DIST = alloca.c fnmatch.c fgetpwent.c getpass.c malloc.c obstack.c \
realloc.c setenv.c snprintf.c strchrnul.c strndup.c strnlen.c strncasecmp.c \
strcasecmp.c strtok_r.c strsignal.c xstrtol.c vasprintf.c
noinst_HEADERS = argcv.h error.h fnmatch.h getline.h getopt.h md5.h mu_dbm.h\
regex.h snprintf.h xalloc.h xstrtol.h obstack.h
......
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Library Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <termios.h>
/* Alain: Parts originally from GNU Lib C. */
static void
echo_off(int fd, struct termios *stored_settings)
{
struct termios new_settings;
tcgetattr (fd, stored_settings);
new_settings = *stored_settings;
new_settings.c_lflag &= (~ECHO);
tcsetattr (fd, TCSANOW, &new_settings);
}
static void
echo_on(int fd, struct termios *stored_settings)
{
tcsetattr (fd, TCSANOW, stored_settings);
}
char *
getpass (const char * prompt)
{
FILE *in, *out;
struct termios stored_settings;
static char *buf;
static size_t buf_size;
char *pbuf;
/* First pass initialize the buffer. */
if (buf_size == 0)
{
buf_size = 256;
buf = calloc (1, buf_size);
if (buf == NULL)
return NULL;
}
else
memset (buf, '\0', buf_size);
/* Turn echoing off if it is on now. */
echo_off (fileno (stdin), &stored_settings);
/* Write the prompt. */
fputs (prompt, stdout);
fflush (stdout);
/* Read the password. */
pbuf = fgets (buf, buf_size, stdin);
if (pbuf)
{
size_t nread = strlen (pbuf);
if (nread && pbuf[nread - 1] == '\n')
{
/* Remove the newline. */
pbuf[nread - 1] = '\0';
/* Write the newline that was not echoed. */
putc ('\n', stdout);
}
}
/* Restore the original setting. */
echo_on (fileno (stdin), &stored_settings);
return pbuf;
}
#ifdef _GETPASS_STANDALONE_TEST
int
main ()
{
char *p;
p = getpass ("my prompt: ");
if (p)
printf ("Passwd: %s\n", p);
return 0;
}
#endif