diff --git a/Makefile b/Makefile index 961ae90..34dc742 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,8 @@ endif CPPFLAGS += $(DEFS) $(INCLUDES) +BASHCOMPDIR ?= $(shell $(PKG_CONFIG) --variable=completionsdir bash-completion 2>/dev/null || echo /etc/bash_completion.d) + ############################################################################## all: Makefile.depend whois mkpasswd pos @@ -121,7 +123,7 @@ afl-run: nice afl-fuzz -i ../afl_in -o ../afl_out -- ./whois ############################################################################## -install: install-whois install-mkpasswd install-pos +install: install-whois install-mkpasswd install-pos install-bashcomp install-whois: whois $(INSTALL) -d $(BASEDIR)$(prefix)/bin/ @@ -140,6 +142,11 @@ install-mkpasswd: mkpasswd install-pos: cd po && $(MAKE) install +install-bashcomp: + $(INSTALL) -d $(BASEDIR)$(BASHCOMPDIR) + $(INSTALL) -m 0644 mkpasswd.bash $(BASEDIR)$(BASHCOMPDIR)/mkpasswd + $(INSTALL) -m 0644 whois.bash $(BASEDIR)$(BASHCOMPDIR)/whois + distclean: clean rm -f version.h po/whois.pot diff --git a/mkpasswd.bash b/mkpasswd.bash new file mode 100644 index 0000000..2d0b9a6 --- /dev/null +++ b/mkpasswd.bash @@ -0,0 +1,33 @@ +_mkpasswd() { + + case $3 in + --help | --version | --salt | --rounds | --password-fd | -[hVSRP]) + return 0 + ;; + --method | -m) + COMPREPLY=($(compgen -W '$( + LC_ALL=C "$1" --method=help 2>/dev/null | + while read -r method _; do + [[ $method == Available ]] || + printf "%s\n" "$method" + done + )')) + return 0 + ;; + esac + + if [[ $2 == -* ]]; then + COMPREPLY=($(compgen -W ' + --method + -5 + --salt + --rounds + --password-fd + --stdin + --help + --version + ' -- "$2")) + return 0 + fi + +} && complete -F _mkpasswd mkpasswd diff --git a/whois.bash b/whois.bash new file mode 100644 index 0000000..1f7291f --- /dev/null +++ b/whois.bash @@ -0,0 +1,86 @@ +_whois_query() { + "$1" -q "$2" 2>/dev/null | while read -r item _; do + [[ $item == %* ]] && continue + printf "%s\n" "${item%%:*}" + done +} + +_whois_hosts() { + # _known_hosts_real from github.com/scop/bash-completion if available + if declare -f _known_hosts_real &>/dev/null; then + _known_hosts_real -- "$1" + return 0 + fi + COMPREPLY=($(compgen -A hostname -- "$1")) +} + +_whois() { + + case $3 in + --help | --version | -p | --port | -i) + return 0 + ;; + -h | --host) + _whois_hosts "$2" + return 0 + ;; + -T | -t | -v) + [[ ${_whois_types-} ]] || + _whois_types=" $(_whois_query "$1" types)" + COMPREPLY=($(compgen -W '$_whois_types' -- "$2")) + return 0 + ;; + -s | -g) + [[ ${_whois_sources-} ]] || + _whois_sources=" $(_whois_query "$1" sources)" + COMPREPLY=($(compgen -W '$_whois_sources' -- "$2")) + if [[ $3 == -g ]]; then + [[ ${#COMPREPLY[*]} -eq 1 ]] && COMPREPLY[0]+=: + compopt -o nospace + fi + return 0 + ;; + -q) + COMPREPLY=($(compgen -W 'version sources types' -- "$2")) + return 0 + ;; + esac + + if [[ $2 == -* ]]; then + COMPREPLY=($(compgen -W ' + -h --host + -p --port + -I + -H + --verbose + --no-recursion + --help + --version + -l + -L + -m + -M + -c + -x + -b + -B + -G + -d + -i + -T + -K + -r + -R + -a + -s + -g + -t + -v + -q + ' -- "$2")) + return 0 + fi + + _whois_hosts "$2" + +} && complete -F _whois whois