summaryrefslogtreecommitdiff
path: root/misc/getpass.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1993-04-11 23:09:01 +0000
committerRoland McGrath <roland@gnu.org>1993-04-11 23:09:01 +0000
commitb6ae928e16cfdcc76ab4fa697e1372a2e4c158b3 (patch)
tree82a1a6a05f32f2480b20cd5f25db2ebaab6e055b /misc/getpass.c
parentc5e0fc1b40df778e52a9bbe0ff850db080ce4a2d (diff)
Formerly ../misc/getpass.c.~2~
Diffstat (limited to 'misc/getpass.c')
-rw-r--r--misc/getpass.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/misc/getpass.c b/misc/getpass.c
index 9ec1c0799d..fec5f4d726 100644
--- a/misc/getpass.c
+++ b/misc/getpass.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1993 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,19 +20,39 @@ Cambridge, MA 02139, USA. */
#include <termios.h>
#include <unistd.h>
+/* It is desireable to use this bit on systems that have it.
+ The only bit of terminal state we want to twiddle is echoing, which is
+ done in software; there is no need to change the state of the terminal
+ hardware. */
+
+#ifndef TCSASOFT
+#define TCSASOFT 0
+#endif
+
char *
getpass (prompt)
const char *prompt;
{
- FILE *in;
+ FILE *in, *out;
struct termios t;
int echo_off;
static char *buf = NULL;
static size_t bufsize = 0;
+ ssize_t nread;
+
+ /* Try to write to and read from the terminal if we can.
+ If we can't open the terminal, use stderr and stdin. */
in = fopen ("/dev/tty", "w+");
if (in == NULL)
- in = stdin;
+ {
+ in = stdin;
+ out = stderr;
+ }
+ else
+ out = in;
+
+ /* Turn echoing off if it is on now. */
if (tcgetattr (fileno (in), &t) == 0)
{
@@ -48,16 +68,24 @@ getpass (prompt)
else
echo_off = 0;
- fputs (prompt, in == stdin ? stderr : in);
- fflush (in == stdin ? stderr : in);
+ /* Write the prompt. */
+ fputs (prompt, out);
+ fflush (out);
- if (__getline (&buf, &bufsize, in) < 0 && buf != NULL)
+ /* Read the password. */
+ nread = __getline (&buf, &bufsize, in);
+ if (nread < 0 && buf != NULL)
buf[0] = '\0';
+ else if (buf[nread - 1] == '\n')
+ /* Remove the newline. */
+ buf[nread] = '\0';
+ /* Restore echoing. */
if (echo_off)
(void) tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t);
if (in != stdin)
+ /* We opened the terminal; now close it. */
fclose (in);
return buf;