From b80ef40cafad78173cc87274b026c50badbd504a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 23 Jun 2021 13:45:31 +0200 Subject: [PATCH] ask-password: add "-n" switch for disabling trailing newline This is similar to the "-n" switch of the "echo" command. --- man/systemd-ask-password.xml | 17 +++++++++++++---- src/ask-password/ask-password.c | 19 ++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/man/systemd-ask-password.xml b/man/systemd-ask-password.xml index 0b1137539bb..c3c9f573a41 100644 --- a/man/systemd-ask-password.xml +++ b/man/systemd-ask-password.xml @@ -210,10 +210,19 @@ - Do not print passwords to standard output. - This is useful if you want to store a password in kernel - keyring with but do not want it - to show up on screen or in logs. + Do not print passwords to standard output. This is useful if you want to store a + password in kernel keyring with but do not want it to show up on screen + or in logs. + + + + + + By default, when writing the acquired password to standard output it is suffixed by a + newline character. This may be turned off with the switch, similar to the switch + of the same name of the echo1 + command. diff --git a/src/ask-password/ask-password.c b/src/ask-password/ask-password.c index 6a09a9a35c9..45305dec1f0 100644 --- a/src/ask-password/ask-password.c +++ b/src/ask-password/ask-password.c @@ -24,6 +24,7 @@ static usec_t arg_timeout = DEFAULT_TIMEOUT_USEC; static bool arg_multiple = false; static bool arg_no_output = false; static AskPasswordFlags arg_flags = ASK_PASSWORD_PUSH_CACHE; +static bool arg_newline = true; STATIC_DESTRUCTOR_REGISTER(arg_message, freep); @@ -54,6 +55,8 @@ static int help(void) { " --accept-cached Accept cached passwords\n" " --multiple List multiple passwords if available\n" " --no-output Do not print password to standard output\n" + " -n Do not suffix password written to standard output with\n" + " newline\n" "\nSee the %2$s for details.\n", program_invocation_short_name, link, @@ -104,7 +107,7 @@ static int parse_argv(int argc, char *argv[]) { /* Note the asymmetry: the long option --echo= allows an optional argument, the short option does * not. */ - while ((c = getopt_long(argc, argv, "+he", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "+hen", options, NULL)) >= 0) switch (c) { @@ -177,6 +180,10 @@ static int parse_argv(int argc, char *argv[]) { arg_credential_name = optarg; break; + case 'n': + arg_newline = false; + break; + case '?': return -EINVAL; @@ -237,8 +244,14 @@ static int run(int argc, char *argv[]) { return log_error_errno(r, "Failed to query password: %m"); STRV_FOREACH(p, l) { - if (!arg_no_output) - puts(*p); + if (!arg_no_output) { + if (arg_newline) + puts(*p); + else + fputs(*p, stdout); + } + + fflush(stdout); if (!arg_multiple) break;