1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| | #compdef -p */(init|rc[0-9S]#).d/*
local cmds script
_compskip=all
if [[ $OSTYPE = freebsd* ]]; then
(( $+functions[_init_d_fullpath] )) ||
_init_d_fullpath() {
local -a scriptpath
local name=$1 dir
# Known locations of init scripts
# C.f. Unix/Type/_services
scriptpath=(/etc/rc.d $(/bin/sh -c '. /etc/rc.subr; load_rc_config XXX; echo $local_startup' 2>/dev/null))
for dir in $scriptpath; do
if [[ -f $dir/$name ]]; then
echo $dir/$name
return 0
fi
done
return 1
}
(( $+functions[_init_d_get_cmds] )) ||
_init_d_get_cmds() {
local magic cmds cmd_prefix
[[ -x $script ]] || return 1
[[ $(read -u0 -k2 magic < $script && echo $magic) = '#!' ]] || return 0
[[ -f /etc/rc.subr ]] && [[ -x /sbin/rcorder ]] || return 0
grep -q '^ *\. */etc/rc\.subr *$' $script || return 0
cmds=(
start stop restart rcvar status poll
$(/bin/sh -c "set -- rcvar; . $script >/dev/null; echo \$extra_commands" 2>/dev/null)
)
for cmd_prefix in {,one,fast,force,quiet}; do
echo ${cmds/#/$cmd_prefix}
done
return 0
}
else
(( $+functions[_init_d_fullpath] )) ||
_init_d_fullpath() {
local -a scriptpath
local name=$1 dir
# Known locations of init scripts
# C.f. Unix/Type/_services
scriptpath=(/etc/init.d /etc/rc.d /etc/rc.d/init.d)
for dir in $scriptpath; do
if [[ -f $dir/$name ]]; then
echo $dir/$name
return 0
fi
done
return 1
}
(( $+functions[_init_d_get_cmds] )) ||
_init_d_get_cmds() {
local what magic cmds
# If the file starts with `#!' we hope that this is a shell script
# and get lines looking like <space>foo|bar) with the words in $what.
what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
[[ -x $script ]] || return 1
read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)${~what}([[:blank:]]#\|[[:blank:]]#${~what})#(\'|)\)}}//[^-a-z_]} )
# This would be the pattern to use every line of the form <space>foo).
# Some people say this might match too many lines...
#
# cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} )
echo $cmds
return 0
}
fi
script=$words[1]
[[ $script = */* ]] || script="$(_init_d_fullpath "$script")"
cmds=( $(_init_d_get_cmds) ) || return
(( $#cmds )) || zstyle -a ":completion:${curcontext}:commands" commands cmds ||
cmds=(start stop)
_sub_commands $cmds
|