Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Adding support for FreeBSD to service script compdefs



Hi,

The attached patch adds support for FreeBSD's rc.d system (derived
from NetBSD) and service(8) command to service script completion
definitions.

In addition to this, it'd be nice to see
Completion/Redhat/Command/_service moved to Completion/Unix/Command.

I think it'd be easy to also take care of NetBSD, but would just leave
it to its users since I'm just an oocasional user of the OS.

Regards,

--
Akinori MUSHA / http://akinori.org/

M Completion/Redhat/Command/_service
M Completion/Unix/Command/_init_d
M Completion/Unix/Type/_services

Index: Completion/Redhat/Command/_service
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Redhat/Command/_service,v
retrieving revision 1.3
diff -u -r1.3 _service
--- Completion/Redhat/Command/_service	23 May 2002 14:48:58 -0000	1.3
+++ Completion/Redhat/Command/_service	20 Apr 2010 05:53:34 -0000
@@ -10,13 +10,22 @@
   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'
-
+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
Index: Completion/Unix/Command/_init_d
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_init_d,v
retrieving revision 1.9
diff -u -r1.9 _init_d
--- Completion/Unix/Command/_init_d	4 Oct 2009 18:20:00 -0000	1.9
+++ Completion/Unix/Command/_init_d	20 Apr 2010 05:53:34 -0000
@@ -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))
+
+    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

-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
+    # 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.

-# 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)'

-what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
-
-read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
+    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)
Index: Completion/Unix/Type/_services
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_services,v
retrieving revision 1.5
diff -u -r1.5 _services
--- Completion/Unix/Type/_services	4 Oct 2009 18:20:00 -0000	1.5
+++ Completion/Unix/Type/_services	20 Apr 2010 05:53:34 -0000
@@ -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:]]#}/%:*} )

Attachment: pgpY6gMOPI0nG.pgp
Description: PGP signature



Messages sorted by: Reverse Date, Date, Thread, Author