mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #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
 |