aboutsummaryrefslogtreecommitdiff
path: root/libbb/correct_password.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/correct_password.c')
-rw-r--r--libbb/correct_password.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libbb/correct_password.c b/libbb/correct_password.c
index 7cabd33d0..d02d0d6a0 100644
--- a/libbb/correct_password.c
+++ b/libbb/correct_password.c
@@ -31,12 +31,15 @@
#include "libbb.h"
/* Ask the user for a password.
+ * Return 1 without asking if PW has an empty password.
+ * Return -1 on EOF, error while reading input, or timeout.
* Return 1 if the user gives the correct password for entry PW,
- * 0 if not. Return 1 without asking if PW has an empty password.
+ * 0 if not.
*
- * NULL pw means "just fake it for login with bad username" */
-
-int FAST_FUNC correct_password(const struct passwd *pw)
+ * NULL pw means "just fake it for login with bad username"
+ */
+int FAST_FUNC ask_and_check_password_extended(const struct passwd *pw,
+ int timeout, const char *prompt)
{
char *unencrypted, *encrypted;
const char *correct;
@@ -65,9 +68,10 @@ int FAST_FUNC correct_password(const struct passwd *pw)
return 1;
fake_it:
- unencrypted = bb_ask_stdin("Password: ");
+ unencrypted = bb_ask(STDIN_FILENO, timeout, prompt);
if (!unencrypted) {
- return 0;
+ /* EOF (such as ^D) or error (such as ^C) */
+ return -1;
}
encrypted = pw_encrypt(unencrypted, correct, 1);
r = (strcmp(encrypted, correct) == 0);
@@ -75,3 +79,8 @@ int FAST_FUNC correct_password(const struct passwd *pw)
memset(unencrypted, 0, strlen(unencrypted));
return r;
}
+
+int FAST_FUNC ask_and_check_password(const struct passwd *pw)
+{
+ return ask_and_check_password_extended(pw, 0, "Password: ");
+}