[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/busybox/src/libbb/bb_askpass.c b/ap/app/busybox/src/libbb/bb_askpass.c
new file mode 100644
index 0000000..fe2b506
--- /dev/null
+++ b/ap/app/busybox/src/libbb/bb_askpass.c
@@ -0,0 +1,90 @@
+/* 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 <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_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;
+
+ fputs(prompt, stdout);
+ fflush_all();
+ tcflush(fd, TCIFLUSH);
+
+ tcgetattr(fd, &oldtio);
+ tio = oldtio;
+#if 0
+ /* Switch off UPPERCASE->lowercase conversion (never used since 198x)
+ * and XON/XOFF (why we want to mess with this??)
+ */
+# ifndef IUCLC
+# define IUCLC 0
+# endif
+ tio.c_iflag &= ~(IUCLC|IXON|IXOFF|IXANY);
+#endif
+ /* Switch off echo */
+ 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);
+ }
+
+ if (!passwd)
+ passwd = xmalloc(sizeof_passwd);
+ ret = passwd;
+ i = 0;
+ while (1) {
+ int r = read(fd, &ret[i], 1);
+ if (r < 0) {
+ /* read is interrupted by timeout or ^C */
+ ret = NULL;
+ break;
+ }
+ if (r == 0 /* EOF */
+ || ret[i] == '\r' || ret[i] == '\n' /* EOL */
+ || ++i == sizeof_passwd-1 /* 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;
+}