diff options
author | Alain Magloire <alainm@gnu.org> | 2001-12-04 13:57:59 +0000 |
---|---|---|
committer | Alain Magloire <alainm@gnu.org> | 2001-12-04 13:57:59 +0000 |
commit | 1dd25572979f4ce89505c82ac91148470d13bc09 (patch) | |
tree | 322128b4bb5a09fd31a7391db0ea84a71eed46d1 | |
parent | 94711aa6b56a1f7856ee3365034d38db4b682ae2 (diff) | |
download | mailutils-1dd25572979f4ce89505c82ac91148470d13bc09.tar.gz mailutils-1dd25572979f4ce89505c82ac91148470d13bc09.tar.bz2 |
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.
-rw-r--r-- | lib/Makefile.am | 6 | ||||
-rw-r--r-- | lib/getpass.c | 99 |
2 files changed, 102 insertions, 3 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index 4da65058f..07ed5de8b 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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 diff --git a/lib/getpass.c b/lib/getpass.c new file mode 100644 index 000000000..54963772f --- /dev/null +++ b/lib/getpass.c @@ -0,0 +1,99 @@ +/* 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 |