1#compdef getent
2
3local curcontext="$curcontext" state line expl ret=1
4local services databases keys
5local -a args
6typeset -A opt_args
7
8if _pick_variant -r is_gnu gnu='(GNU|EGLIBC)' unix --version; then
9  args+=(
10    '(- 1 *)'{-\?,--help}'[display help information]'
11    '(- 1 *)--usage[display a short usage message]'
12    '(- 1 *)'{-V,--version}'[display version information]'
13    {-s,--service=}'[specify service configuration to use]:service:->services'
14    '(-i --no-idn)'{-i,--no-idn}'[disable IDN encoding]'
15  )
16fi
17
18_arguments -C "$args[@]" \
19  '1:database:->databases' \
20  '*:key:->keys' && ret=0
21
22case $state in
23  services)
24    services=( /lib/libnss*(-.:fr:t:s/libnss_//) )
25    _wanted services expl service compadd ${services%-*} && ret=0
26  ;;
27  databases)
28    if [[ $is_gnu = gnu ]]; then
29      databases=( "${(@)${(@f)$(_call_program databases $words[1] --help \
30                   2>/dev/null)}[(r)Supported*,-1]}" )
31      databases=( "${=${(@)databases[2,${(@)databases[(i)]}-1]}}" )
32    else
33      databases=( passwd group hosts ipnodes services protocols ethers networks netmasks )
34    fi
35    _wanted databases expl database compadd -a databases && ret=0
36  ;;
37  keys)
38    keys=( ${(f)"$(_call_program keys $words[1] ${(kv)opt_args[(i)-s|--service]} $line[1] 2>/dev/null)"} )
39    case $line[1] in
40      *hosts) _wanted keys expl key compadd ${=keys#* } && ret=0 ;;
41      networks|rpc|protocols|services)
42        _wanted keys expl key compadd ${=keys%% *} && ret=0
43      ;;
44      aliases|passwd|shadow|group)
45        _wanted keys expl key compadd ${keys%%:*} && ret=0
46      ;;
47      *) _message -e keys key;;
48    esac
49  ;;
50esac
51
52return ret
53