about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Redhat/Command/.distfiles1
-rw-r--r--Completion/Redhat/Command/_service22
-rw-r--r--Completion/Unix/Command/.distfiles1
-rw-r--r--Completion/Unix/Command/_init_d101
-rw-r--r--Completion/Unix/Command/_service31
-rw-r--r--Completion/Unix/Type/_services8
6 files changed, 115 insertions, 49 deletions
diff --git a/Completion/Redhat/Command/.distfiles b/Completion/Redhat/Command/.distfiles
index 9f0a3ef6a..8f8a5da63 100644
--- a/Completion/Redhat/Command/.distfiles
+++ b/Completion/Redhat/Command/.distfiles
@@ -1,6 +1,5 @@
 DISTFILES_SRC='
 .distfiles
 _rpm
-_service
 _yum
 '
diff --git a/Completion/Redhat/Command/_service b/Completion/Redhat/Command/_service
deleted file mode 100644
index 591bd0184..000000000
--- a/Completion/Redhat/Command/_service
+++ /dev/null
@@ -1,22 +0,0 @@
-#compdef service
-
-# *:: for last argument looks more like a hack but it is
-# the simplest way known to me to reset $words and keep
-# _sub_command happy
-
-# we are interested in init service only
-local ctx="${curcontext}argument-1:"
-zstyle -T  ":completion:${ctx}" tag-order && \
-  zstyle ":completion:${ctx}" tag-order init
-
-
-_arguments -s \
-  '(-d --debug)'{-d,--debug}'[turn debugging on]' \
-  '(- :)'{-h,--help}'[print usage]' \
-  '(- :)'{-v,--version}'[print version]' \
-  '(-)'{-f,--full-restart}'[restart service]' \
-  '(- :)'{-R,--full-restart-all}'[restart all services]' \
-  '(- :)'{-s,--status-all}'[print status of all services]' \
-  ':service name:_services' \
-  '*::service argument: _init_d'
-
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index a18293893..73525ff12 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -180,6 +180,7 @@ _samba
 _sccs
 _screen
 _sed
+_service
 _setfacl
 _sh
 _showmount
diff --git a/Completion/Unix/Command/_init_d b/Completion/Unix/Command/_init_d
index 72d11023f..dd9933a46 100644
--- a/Completion/Unix/Command/_init_d
+++ b/Completion/Unix/Command/_init_d
@@ -1,39 +1,90 @@
 #compdef -p */(init|rc[0-9S]#).d/*
 
-local magic cmds what script
+local cmds script
 
 _compskip=all
 
-# This should probably be system specific...
+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))
 
-script=$words[1]
-if [[ $script != */* ]]; then
-  local -a scriptpath
-  local 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/$script ]]; then
-      script=$dir/$script
-      break
-    fi
-  done
-fi
+    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
+  }
 
-# 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.
+  (( $+functions[_init_d_get_cmds] )) ||
+  _init_d_get_cmds() {
+    local what magic cmds
 
-what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
+    # 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.
 
-read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
+    what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
+
+    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_]} )
+    # 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)
diff --git a/Completion/Unix/Command/_service b/Completion/Unix/Command/_service
new file mode 100644
index 000000000..e99ad556f
--- /dev/null
+++ b/Completion/Unix/Command/_service
@@ -0,0 +1,31 @@
+#compdef service
+
+# *:: for last argument looks more like a hack but it is
+# the simplest way known to me to reset $words and keep
+# _sub_command happy
+
+# we are interested in init service only
+local ctx="${curcontext}argument-1:"
+zstyle -T  ":completion:${ctx}" tag-order && \
+  zstyle ":completion:${ctx}" tag-order init
+
+
+if [[ $OSTYPE = freebsd* ]]; then
+  _arguments -s \
+    '(-)-e[show services that are enabled]' \
+    '(-)-l[list all scripts in /etc/rc.d and the local startup directory]' \
+    '(-)-r[show the results of boot time rcorder]' \
+    '(-)-v[verbose]' \
+    ':service name:_services' \
+    '*::service argument:_init_d'
+else
+  _arguments -s \
+    '(-d --debug)'{-d,--debug}'[turn debugging on]' \
+    '(- :)'{-h,--help}'[print usage]' \
+    '(- :)'{-v,--version}'[print version]' \
+    '(-)'{-f,--full-restart}'[restart service]' \
+    '(- :)'{-R,--full-restart-all}'[restart all services]' \
+    '(- :)'{-s,--status-all}'[print status of all services]' \
+    ':service name:_services' \
+    '*::service argument: _init_d'
+fi
diff --git a/Completion/Unix/Type/_services b/Completion/Unix/Type/_services
index 40136e3c1..496054795 100644
--- a/Completion/Unix/Type/_services
+++ b/Completion/Unix/Type/_services
@@ -3,7 +3,13 @@
 local -a inits xinetds alls
 local expl ret=1
 
-if chkconfig --list > /dev/null 2>&1; then
+if [[ $OSTYPE = freebsd* ]]; then
+  if [[ -x /usr/sbin/service ]]; then
+    alls=( $(service -l) ) && ret=0
+
+    _wanted services expl service compadd "$@" - $alls[@] && ret=0
+  fi
+elif chkconfig --list > /dev/null 2>&1; then
   alls=( ${(f)"$(LANGUAGE=C LANG=C LC_ALL=C chkconfig --list)"} )
   inits=( ${${${alls[1,(r)xinetd based*]}[1,-2]}/%[[:space:]]*/} )
   xinetds=( ${${${${alls[(r)xinetd based*,-1]}[2,-1]}/#[[:space:]]#}/%:*} )