From 9363e2f4999dd5ccf40af0295b42a888e43c9f66 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 6 Feb 2019 14:28:36 +0100 Subject: [PATCH 1/3] id128: no command accepts additional arguments --- src/id128/id128.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/id128/id128.c b/src/id128/id128.c index 06049e7ba2..60551ec225 100644 --- a/src/id128/id128.c +++ b/src/id128/id128.c @@ -70,7 +70,7 @@ static int help(void) { if (r < 0) return log_oom(); - printf("%s [OPTIONS...] {COMMAND} ...\n\n" + printf("%s [OPTIONS...] {COMMAND}\n\n" "Generate and print id128 strings.\n\n" " -h --help Show this help\n" " -p --pretty Generate samples of program code\n" From 8efb042e0cf52ef386651606a2d3e187b69c840d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 6 Feb 2019 14:39:12 +0100 Subject: [PATCH 2/3] sd-id128: split the logic obtaining invocation ID from sd_id128_get_invocation() --- src/libsystemd/sd-id128/sd-id128.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index e72af1593c..6c7165eb93 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -215,6 +215,18 @@ static int get_invocation_from_keyring(sd_id128_t *ret) { return 1; } +static int get_invocation_from_environment(sd_id128_t *ret) { + const char *e; + + assert(ret); + + e = secure_getenv("INVOCATION_ID"); + if (!e) + return -ENXIO; + + return sd_id128_from_string(e, ret); +} + _public_ int sd_id128_get_invocation(sd_id128_t *ret) { static thread_local sd_id128_t saved_invocation_id = {}; int r; @@ -237,13 +249,7 @@ _public_ int sd_id128_get_invocation(sd_id128_t *ret) { return r; if (r == 0) { - const char *e; - - e = secure_getenv("INVOCATION_ID"); - if (!e) - return -ENXIO; - - r = sd_id128_from_string(e, &saved_invocation_id); + r = get_invocation_from_environment(&saved_invocation_id); if (r < 0) return r; } From 58a6c57b7531fc4038399eb2131c9bae378d2524 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 6 Feb 2019 15:18:46 +0100 Subject: [PATCH 3/3] bash-completion: add systemd-id128 support --- shell-completion/bash/systemd-id128 | 74 +++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 shell-completion/bash/systemd-id128 diff --git a/shell-completion/bash/systemd-id128 b/shell-completion/bash/systemd-id128 new file mode 100644 index 0000000000..cfd5438cb4 --- /dev/null +++ b/shell-completion/bash/systemd-id128 @@ -0,0 +1,74 @@ +# networkctl(1) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1+ +# +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# systemd is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with systemd; If not, see . + +__contains_word () { + local w word=$1; shift + for w in "$@"; do + [[ $w = "$word" ]] && return + done + return 1 +} + +_systemd_id128() { + local i verb comps + local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} + local -A OPTS=( + [STANDALONE]='-h --help --version -p --pretty' + [ARG]='-a --app-specific' + ) + + local -A VERBS=( + [STANDALONE]='new machine-id boot-id invocation-id help' + ) + + _init_completion || return + + if __contains_word "$prev" ${OPTS[ARG]}; then + case $prev in + --app-specific|-a) + comps="" + ;; + esac + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 + fi + + if [[ "$cur" = -* ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) + return 0 + fi + + for ((i=0; i < COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then + verb=${COMP_WORDS[i]} + break + fi + done + + if [[ -z $verb ]]; then + comps=${VERBS[*]} + elif __contains_word "$verb" ${VERBS[STANDALONE]}; then + comps='' + fi + + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 +} + +complete -F _systemd_id128 systemd-id128