Commit ad2d22b6 authored by Quentin Monnet's avatar Quentin Monnet Committed by Daniel Borkmann
Browse files

bpftool: Address minor issues in bash completion



This commit contains a series of clean-ups and fixes for bpftool's bash
completion file:

- Make sure all local variables are declared as such.
- Make sure variables are initialised before being read.
- Update ELF section ("maps" -> ".maps") for looking up map names in
  object files.
- Fix call to _init_completion.
- Move definition for MAP_TYPE and PROG_TYPE higher up in the scope to
  avoid defining them multiple times, reuse MAP_TYPE where relevant.
- Simplify completion for "duration" keyword in "bpftool prog profile".
- Fix completion for "bpftool struct_ops register" and "bpftool link
  (pin|detach)" where we would repeatedly suggest file names instead of
  suggesting just one name.
- Fix completion for "bpftool iter pin ... map MAP" to account for the
  "map" keyword.
- Add missing "detach" suggestion for "bpftool link".

Signed-off-by: default avatarQuentin Monnet <qmo@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20240413011427.14402-3-qmo@kernel.org
parent 986e7663
Loading
Loading
Loading
Loading
+25 −36
Original line number Diff line number Diff line
@@ -106,19 +106,19 @@ _bpftool_get_link_ids()

_bpftool_get_obj_map_names()
{
    local obj
    local obj maps

    obj=$1

    maps=$(objdump -j maps -t $obj 2>/dev/null | \
        command awk '/g     . maps/ {print $NF}')
    maps=$(objdump -j .maps -t $obj 2>/dev/null | \
        command awk '/g     . .maps/ {print $NF}')

    COMPREPLY+=( $( compgen -W "$maps" -- "$cur" ) )
}

_bpftool_get_obj_map_idxs()
{
    local obj
    local obj nmaps

    obj=$1

@@ -136,7 +136,7 @@ _sysfs_get_netdevs()
# Retrieve type of the map that we are operating on.
_bpftool_map_guess_map_type()
{
    local keyword ref
    local keyword idx ref=""
    for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
        case "${words[$((idx-2))]}" in
            lookup|update)
@@ -255,8 +255,9 @@ _bpftool_map_update_get_name()

_bpftool()
{
    local cur prev words objword json=0
    _init_completion || return
    local cur prev words cword comp_args
    local json=0
    _init_completion -- "$@" || return

    # Deal with options
    if [[ ${words[cword]} == -* ]]; then
@@ -293,7 +294,7 @@ _bpftool()
    esac

    # Remove all options so completions don't have to deal with them.
    local i
    local i pprev
    for (( i=1; i < ${#words[@]}; )); do
        if [[ ${words[i]::1} == - ]] &&
            [[ ${words[i]} != "-B" ]] && [[ ${words[i]} != "--base-btf" ]]; then
@@ -307,7 +308,7 @@ _bpftool()
    prev=${words[cword - 1]}
    pprev=${words[cword - 2]}

    local object=${words[1]} command=${words[2]}
    local object=${words[1]}

    if [[ -z $object || $cword -eq 1 ]]; then
        case $cur in
@@ -324,8 +325,12 @@ _bpftool()
        esac
    fi

    local command=${words[2]}
    [[ $command == help ]] && return 0

    local MAP_TYPE='id pinned name'
    local PROG_TYPE='id pinned tag name'

    # Completion depends on object and command in use
    case $object in
        prog)
@@ -346,8 +351,6 @@ _bpftool()
                    ;;
            esac

            local PROG_TYPE='id pinned tag name'
            local MAP_TYPE='id pinned name'
            local METRIC_TYPE='cycles instructions l1d_loads llc_misses \
                itlb_misses dtlb_misses'
            case $command in
@@ -457,7 +460,7 @@ _bpftool()
                    obj=${words[3]}

                    if [[ ${words[-4]} == "map" ]]; then
                        COMPREPLY=( $( compgen -W "id pinned" -- "$cur" ) )
                        COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
                        return 0
                    fi
                    if [[ ${words[-3]} == "map" ]]; then
@@ -541,20 +544,9 @@ _bpftool()
                            COMPREPLY=( $( compgen -W "$METRIC_TYPE duration" -- "$cur" ) )
                            return 0
                            ;;
                        6)
                            case $prev in
                                duration)
                                    return 0
                                    ;;
                                *)
                                    COMPREPLY=( $( compgen -W "$METRIC_TYPE" -- "$cur" ) )
                                    return 0
                                    ;;
                            esac
                            return 0
                            ;;
                        *)
                            COMPREPLY=( $( compgen -W "$METRIC_TYPE" -- "$cur" ) )
                            [[ $prev == duration ]] && return 0
                            _bpftool_once_attr "$METRIC_TYPE"
                            return 0
                            ;;
                    esac
@@ -612,7 +604,7 @@ _bpftool()
                    return 0
                    ;;
                register)
                    _filedir
                    [[ $prev == $command ]] && _filedir
                    return 0
                    ;;
                *)
@@ -638,9 +630,12 @@ _bpftool()
                        pinned)
                            _filedir
                            ;;
                        *)
                        map)
                            _bpftool_one_of_list $MAP_TYPE
                            ;;
                        *)
                            _bpftool_once_attr 'map'
                            ;;
                    esac
                    return 0
                    ;;
@@ -652,7 +647,6 @@ _bpftool()
            esac
            ;;
        map)
            local MAP_TYPE='id pinned name'
            case $command in
                show|list|dump|peek|pop|dequeue|freeze)
                    case $prev in
@@ -793,13 +787,11 @@ _bpftool()
                            # map, depending on the type of the map to update.
                            case "$(_bpftool_map_guess_map_type)" in
                                array_of_maps|hash_of_maps)
                                    local MAP_TYPE='id pinned name'
                                    COMPREPLY+=( $( compgen -W "$MAP_TYPE" \
                                        -- "$cur" ) )
                                    return 0
                                    ;;
                                prog_array)
                                    local PROG_TYPE='id pinned tag name'
                                    COMPREPLY+=( $( compgen -W "$PROG_TYPE" \
                                        -- "$cur" ) )
                                    return 0
@@ -821,7 +813,7 @@ _bpftool()
                            esac

                            _bpftool_once_attr 'key'
                            local UPDATE_FLAGS='any exist noexist'
                            local UPDATE_FLAGS='any exist noexist' idx
                            for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
                                if [[ ${words[idx]} == 'value' ]]; then
                                    # 'value' is present, but is not the last
@@ -893,7 +885,6 @@ _bpftool()
            esac
            ;;
        btf)
            local PROG_TYPE='id pinned tag name'
            local MAP_TYPE='id pinned name'
            case $command in
                dump)
@@ -1033,7 +1024,6 @@ _bpftool()
                    local BPFTOOL_CGROUP_ATTACH_TYPES="$(bpftool feature list_builtins attach_types 2>/dev/null | \
                        grep '^cgroup_')"
                    local ATTACH_FLAGS='multi override'
                    local PROG_TYPE='id pinned tag name'
                    # Check for $prev = $command first
                    if [ $prev = $command ]; then
                        _filedir
@@ -1086,7 +1076,6 @@ _bpftool()
            esac
            ;;
        net)
            local PROG_TYPE='id pinned tag name'
            local ATTACH_TYPES='xdp xdpgeneric xdpdrv xdpoffload'
            case $command in
                show|list)
@@ -1193,14 +1182,14 @@ _bpftool()
                pin|detach)
                    if [[ $prev == "$command" ]]; then
                        COMPREPLY=( $( compgen -W "$LINK_TYPE" -- "$cur" ) )
                    else
                    elif [[ $pprev == "$command" ]]; then
                        _filedir
                    fi
                    return 0
                    ;;
                *)
                    [[ $prev == $object ]] && \
                        COMPREPLY=( $( compgen -W 'help pin show list' -- "$cur" ) )
                        COMPREPLY=( $( compgen -W 'help pin detach show list' -- "$cur" ) )
                    ;;
            esac
            ;;