busybox/libbb/bb_askpass.c
Ron Yorston cad3fc743a libbb: introduce and use fputs_stdout
function                                             old     new   delta
fputs_stdout                                           -      12     +12
zxc_vm_process                                      7237    7230      -7
yes_main                                              85      78      -7
write_block                                          380     373      -7
wrapf                                                305     298      -7
strings_main                                         437     430      -7
show_bridge                                          353     346      -7
rev_main                                             384     377      -7
put_prompt_custom                                     58      51      -7
put_cur_glyph_and_inc_cursor                         168     161      -7
print_numbered_lines                                 152     145      -7
print_named_ascii                                    130     123      -7
print_name                                           135     128      -7
print_login_issue                                    386     379      -7
print_ascii                                          208     201      -7
powertop_main                                       1249    1242      -7
od_main                                             1789    1782      -7
logread_main                                         518     511      -7
head_main                                            804     797      -7
display_process_list                                1319    1312      -7
cut_main                                            1002     995      -7
bb_dump_dump                                        1550    1543      -7
bb_ask_noecho                                        393     386      -7
baseNUM_main                                         702     695      -7
expand_main                                          755     745     -10
dumpleases_main                                      497     487     -10
write1                                                12       -     -12
putcsi                                                37      23     -14
print_login_prompt                                    55      41     -14
paste_main                                           525     511     -14
cat_main                                             440     426     -14
print_it                                             245     230     -15
print_addrinfo                                      1188    1171     -17
print_rule                                           770     750     -20
print_linkinfo                                       842     822     -20
httpd_main                                           791     771     -20
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/34 up/down: 12/-341)         Total: -329 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-02-03 20:52:40 +01:00

100 lines
2.4 KiB
C

/* vi: set sw=4 ts=4: */
/*
* Ask for a password
*
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
#include "libbb.h"
/* do nothing signal handler */
static void askpass_timeout(int UNUSED_PARAM ignore)
{
}
char* FAST_FUNC bb_ask_noecho(int fd, int timeout, const char *prompt)
{
#define MAX_LINE 0xfff
char *ret;
int i;
struct sigaction sa, oldsa;
struct termios tio, oldtio;
tcflush(fd, TCIFLUSH);
/* Was buggy: was printing prompt *before* flushing input,
* which was upsetting "expect" based scripts of some users.
*/
fputs_stdout(prompt);
fflush_all();
tcgetattr(fd, &oldtio);
tio = oldtio;
/* Switch off echo. ECHOxyz meaning:
* ECHO echo input chars
* ECHOE echo BS-SP-BS on erase character
* ECHOK echo kill char specially, not as ^c (ECHOKE controls how exactly)
* ECHOKE erase all input via BS-SP-BS on kill char (else go to next line)
* ECHOCTL Echo ctrl chars as ^c (else echo verbatim:
* e.g. up arrow emits "ESC-something" and thus moves cursor up!)
* ECHONL Echo NL even if ECHO is not set
* ECHOPRT On erase, echo erased chars
* [qwe<BS><BS><BS> input looks like "qwe\ewq/" on screen]
*/
tio.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL);
tcsetattr(fd, TCSANOW, &tio);
memset(&sa, 0, sizeof(sa));
/* sa.sa_flags = 0; - no SA_RESTART! */
/* SIGINT and SIGALRM will interrupt reads below */
sa.sa_handler = askpass_timeout;
sigaction(SIGINT, &sa, &oldsa);
if (timeout) {
sigaction_set(SIGALRM, &sa);
alarm(timeout);
}
ret = NULL;
i = 0;
while (1) {
int r;
/* User input is uber-slow, no need to optimize reallocs.
* Grow it on every char.
*/
ret = xrealloc(ret, i + 2);
r = read(fd, &ret[i], 1);
if ((i == 0 && r == 0) /* EOF (^D) with no password */
|| r < 0 /* read is interrupted by timeout or ^C */
) {
ret[i] = '\0'; /* paranoia */
nuke_str(ret); /* paranoia */
free(ret);
ret = NULL;
break;
}
if (r == 0 /* EOF */
|| ret[i] == '\r' || ret[i] == '\n' /* EOL */
|| ++i == MAX_LINE /* line limit */
) {
ret[i] = '\0';
break;
}
}
if (timeout) {
alarm(0);
}
sigaction_set(SIGINT, &oldsa);
tcsetattr(fd, TCSANOW, &oldtio);
bb_putchar('\n');
fflush_all();
return ret;
}
char* FAST_FUNC bb_ask_noecho_stdin(const char *prompt)
{
return bb_ask_noecho(STDIN_FILENO, 0, prompt);
}