From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/libbb/bb_askpass.c | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 release/src/router/busybox/libbb/bb_askpass.c (limited to 'release/src/router/busybox/libbb/bb_askpass.c') diff --git a/release/src/router/busybox/libbb/bb_askpass.c b/release/src/router/busybox/libbb/bb_askpass.c new file mode 100644 index 00000000..c0dcf0c5 --- /dev/null +++ b/release/src/router/busybox/libbb/bb_askpass.c @@ -0,0 +1,79 @@ +/* vi: set sw=4 ts=4: */ +/* + * Ask for a password + * I use a static buffer in this function. Plan accordingly. + * + * Copyright (C) 1999-2004 by Erik Andersen + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include "libbb.h" + +/* do nothing signal handler */ +static void askpass_timeout(int UNUSED_PARAM ignore) +{ +} + +char* FAST_FUNC bb_ask_stdin(const char *prompt) +{ + return bb_ask(STDIN_FILENO, 0, prompt); +} +char* FAST_FUNC bb_ask(const int fd, int timeout, const char *prompt) +{ + /* Was static char[BIGNUM] */ + enum { sizeof_passwd = 128 }; + static char *passwd; + + char *ret; + int i; + struct sigaction sa, oldsa; + struct termios tio, oldtio; + + if (!passwd) + passwd = xmalloc(sizeof_passwd); + memset(passwd, 0, sizeof_passwd); + + tcgetattr(fd, &oldtio); + tcflush(fd, TCIFLUSH); + tio = oldtio; + tio.c_iflag &= ~(IUCLC|IXON|IXOFF|IXANY); + tio.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|TOSTOP); + tcsetattr_stdin_TCSANOW(&tio); + + memset(&sa, 0, sizeof(sa)); + /* sa.sa_flags = 0; - no SA_RESTART! */ + /* SIGINT and SIGALRM will interrupt read below */ + sa.sa_handler = askpass_timeout; + sigaction(SIGINT, &sa, &oldsa); + if (timeout) { + sigaction_set(SIGALRM, &sa); + alarm(timeout); + } + + fputs(prompt, stdout); + fflush(stdout); + ret = NULL; + /* On timeout or Ctrl-C, read will hopefully be interrupted, + * and we return NULL */ + if (read(fd, passwd, sizeof_passwd - 1) > 0) { + ret = passwd; + i = 0; + /* Last byte is guaranteed to be 0 + (read did not overwrite it) */ + do { + if (passwd[i] == '\r' || passwd[i] == '\n') + passwd[i] = '\0'; + } while (passwd[i++]); + } + + if (timeout) { + alarm(0); + } + sigaction_set(SIGINT, &oldsa); + + tcsetattr_stdin_TCSANOW(&oldtio); + bb_putchar('\n'); + fflush(stdout); + return ret; +} -- cgit v1.2.3-54-g00ecf