Add and use _sysvdirs() function that sets correct SysV init directory.

This function allows distros to fine tune their init directory location,
as simple checking for directories presence is not always sufficient.
This commit is contained in:
Igor Murzov 2011-11-09 05:06:42 +03:00
parent 588facb6b6
commit fbbd476df0
2 changed files with 26 additions and 13 deletions

View File

@ -102,6 +102,17 @@ _userland()
[[ $userland == $1 ]]
}
# This function sets correct SysV init directories
#
_sysvdirs()
{
sysvdirs=( )
[[ -d /etc/rc.d/init.d ]] && sysvdirs+=( /etc/rc.d/init.d )
[[ -d /etc/init.d ]] && sysvdirs+=( /etc/init.d )
# Slackware uses /etc/rc.d
[[ -f /etc/slackware-version ]] && sysvdirs=( /etc/rc.d )
}
# This function checks whether we have a given program on the system.
#
_have()
@ -1043,13 +1054,12 @@ _backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
#
_services()
{
local sysvdir famdir
[ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d
famdir=/etc/xinetd.d
local sysvdirs famdir=/etc/xinetd.d
_sysvdirs
local restore_nullglob=$(shopt -p nullglob); shopt -s nullglob
COMPREPLY=( $( printf '%s\n' $sysvdir/!($_backup_glob|functions) ) )
COMPREPLY=( $( printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions) ) )
if [ -d $famdir ]; then
COMPREPLY+=( $( printf '%s\n' $famdir/!($_backup_glob) ) )
@ -1060,7 +1070,8 @@ _services()
COMPREPLY+=( $( systemctl list-units --full --all 2>/dev/null | \
awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }' ) )
COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- "$cur" ) )
COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@(${sysvdirs[0]}|$famdir)/}' \
-- "$cur" ) )
}
# This function completes on modules
@ -1838,7 +1849,7 @@ _completion_loader()
[[ $BASH_SOURCE == */* ]] && compdir="${BASH_SOURCE%/*}/completions"
# Special case for init.d scripts.
if [[ $1 == /etc?(/rc.d)/init.d/* ]]; then
if [[ $1 == /etc/@(rc.d|init.d)/* ]]; then
. "$compdir/service" &>/dev/null && return 124 || return 1
fi

View File

@ -15,20 +15,22 @@ _service()
if [[ $cword -eq 1 && $prev == ?(*/)service ]]; then
_services
else
local sysvdir
[ -d /etc/rc.d/init.d ] && \
sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d
local sysvdirs
_sysvdirs
COMPREPLY=( $( compgen -W '`sed -e "y/|/ /" \
-ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
$sysvdir/${prev##*/} 2>/dev/null` start stop' -- "$cur" ) )
${sysvdirs[0]}/${prev##*/} 2>/dev/null` start stop' -- "$cur" ) )
fi
return 0
} &&
complete -F _service service
for svc in /etc/init.d/!($_backup_glob) /etc/rc.d/init.d/!($_backup_glob); do
[ -x "$svc" ] && complete -F _service $svc
_sysvdirs
for svcdir in ${sysvdirs[@]}; do
for svc in $svcdir/!($_backup_glob); do
[ -x "$svc" ] && complete -F _service $svc
done
done
unset svc
unset svc svcdir sysvdirs
# ex: ts=4 sw=4 et filetype=sh