From 3ff346ee82e38b91b6bca3eced65511671f93a64 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 27 Dec 2014 15:48:46 +0000 Subject: [PATCH] getpass: don't suck in stdio --- Library/libs/getpass.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/Library/libs/getpass.c b/Library/libs/getpass.c index 07cc2766..0b24fe95 100644 --- a/Library/libs/getpass.c +++ b/Library/libs/getpass.c @@ -2,10 +2,18 @@ */ #include #include -#include +#include #include #include +#define EOF (-1) + +static int _getchar(void) +{ + static char ch; + return (read(0, &ch, 1) == 1) ? ch : EOF; +} + static char *_gets(char *buf, int len) { int ch, i = 0; @@ -13,16 +21,6 @@ static char *_gets(char *buf, int len) while (i < len) { if ((ch = _getchar()) == EOF && i == 0) return NULL; -#if 0 - if (ch >= ' ') - _putchar(ch); - else { - _putchar('^'); - _putchar(ch + '@'); - } -#endif - if ((ch == 'C' & 037) || (ch == 'Z' & 037)) - return NULL; if (ch == '\n' || ch == '\r') break; buf[i++] = ch; @@ -40,8 +38,7 @@ char *getpass(char *prompt) int tv; /* display the prompt */ - fputs(prompt, stdout); - fflush(stdout); + write(2, prompt, strlen(prompt)); tv = tcgetattr(0, &t); ol = t.c_lflag; -- 2.34.1