From d325f2443eceb423a02b26852065a25ed21a992c Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Thu, 19 Sep 2019 15:18:18 +0200 Subject: [PATCH] tty-ask-pwd-agent: give the possiblity to skip a password prompt If multiple passwords are waiting the agent will prompt for each of them. Give the possiblity to the user to skip some of them by pressing 'C-d'. --- src/shared/ask-password-api.c | 8 ++++++++ src/tty-ask-password-agent/tty-ask-password-agent.c | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c index c41fa2d..46f06fe 100644 --- a/src/shared/ask-password-api.c +++ b/src/shared/ask-password-api.c @@ -371,6 +371,13 @@ int ask_password_tty( if (n == 0 || c == '\n' || c == 0) break; + if (c == 4) { /* C-d also known as EOT */ + if (ttyfd >= 0) + (void) loop_write(ttyfd, "(skipped)", 9, false); + + goto skipped; + } + if (c == 21) { /* C-u */ if (!(flags & ASK_PASSWORD_SILENT)) @@ -467,6 +474,7 @@ int ask_password_tty( if (r < 0) goto finish; +skipped: if (keyname) (void) add_to_keyring_and_log(keyname, flags, l); diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 72b04e6..504ba91 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -417,6 +417,9 @@ static int process_one_password_file(const char *filename) { if (r < 0) return log_error_errno(r, "Failed to query password: %m"); + if (strv_isempty(passwords)) + return -ECANCELED; + r = send_passwords(socket_name, passwords); if (r < 0) return log_error_errno(r, "Failed to send: %m"); @@ -525,11 +528,20 @@ static int process_and_watch_password_files(void) { pollfd[FD_SIGNAL].events = POLLIN; for (;;) { + int timeout = -1; + r = process_password_files(); - if (r < 0) - log_error_errno(r, "Failed to process password: %m"); + if (r < 0) { + if (r == -ECANCELED) + /* Disable poll() timeout since at least one password has + * been skipped and therefore one file remains and is + * unlikely to trigger any events. */ + timeout = 0; + else + log_error_errno(r, "Failed to process password: %m"); + } - if (poll(pollfd, _FD_MAX, -1) < 0) { + if (poll(pollfd, _FD_MAX, timeout) < 0) { if (errno == EINTR) continue; -- 2.7.4