return r;
}
+#define NO_ECHO "(no echo) "
+#define PRESS_TAB "(press TAB for no echo) "
+#define SKIPPED "(skipped)"
+
int ask_password_tty(
int ttyfd,
const char *message,
_POLL_MAX,
};
- bool reset_tty = false, dirty = false, use_color = false;
+ bool reset_tty = false, dirty = false, use_color = false, press_tab_visible = false;
_cleanup_close_ int cttyfd = -1, notify = -1;
struct termios old_termios, new_termios;
char passphrase[LINE_MAX + 1] = {}, *x;
(void) loop_write(ttyfd, message, strlen(message), false);
(void) loop_write(ttyfd, " ", 1, false);
+ if (!(flags & ASK_PASSWORD_SILENT)) {
+ if (use_color)
+ (void) loop_write(ttyfd, ANSI_GREY, STRLEN(ANSI_GREY), false);
+ (void) loop_write(ttyfd, PRESS_TAB, strlen(PRESS_TAB), false);
+ press_tab_visible = true;
+ }
+
if (use_color)
(void) loop_write(ttyfd, ANSI_NORMAL, STRLEN(ANSI_NORMAL), false);
}
+ if (press_tab_visible) {
+ assert(ttyfd >= 0);
+ backspace_chars(ttyfd, strlen(PRESS_TAB));
+ press_tab_visible = false;
+ }
+
/* We treat EOF, newline and NUL byte all as valid end markers */
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);
+ (void) loop_write(ttyfd, SKIPPED, strlen(SKIPPED), false);
goto skipped;
}
* first key (and only as first key), or ... */
if (ttyfd >= 0)
- (void) loop_write(ttyfd, "(no echo) ", 10, false);
+ (void) loop_write(ttyfd, NO_ECHO, strlen(NO_ECHO), false);
} else if (ttyfd >= 0)
(void) loop_write(ttyfd, "\a", 1, false);
/* ... or by pressing TAB at any time. */
if (ttyfd >= 0)
- (void) loop_write(ttyfd, "(no echo) ", 10, false);
+ (void) loop_write(ttyfd, NO_ECHO, strlen(NO_ECHO), false);
} else if (p >= sizeof(passphrase)-1) {