list command can take new arguments auto/noauto.
list command can take a list of daemon to list.

All kind of arguments can be mixed to obtain the proper output.

zsh and bash completion are updated

Signed-off-by: Sebastien Luttringer <[email protected]>
---
 bash-completion |    2 +-
 rc.d            |   71 ++++++++++++++++++++++++++++++++++++++----------------
 zsh-completion  |    2 +-
 3 files changed, 52 insertions(+), 23 deletions(-)

diff --git a/bash-completion b/bash-completion
index d78484e..718df6d 100644
--- a/bash-completion
+++ b/bash-completion
@@ -10,7 +10,7 @@ _rc_d()
        elif [[ "$prev" == help ]]; then
                COMPREPLY=()
        elif [[ "$prev" == list ]]; then
-               ((COMP_CWORD == 2)) && COMPREPLY=($(compgen -W "started 
stopped" -- "$cur")) || COMPREPLY=()
+               COMPREPLY=($(compgen -W "started stopped auto noauto $(cd 
/etc/rc.d && compgen -f -X 'functions*')" -- "$cur"))
        elif [[ "$prev" == start ]]; then
                COMPREPLY=($(comm -23 <(cd /etc/rc.d && compgen -f -X 
'functions*' "$cur"|sort) <(cd /run/daemons/ && compgen -f "$cur"|sort)))
        elif [[ "$prev" =~ stop|restart|reload ]]; then
diff --git a/rc.d b/rc.d
index 3d34edf..81a07eb 100755
--- a/rc.d
+++ b/rc.d
@@ -4,11 +4,12 @@ NEED_ROOT=0 # this script can be run without be root
 . /etc/rc.conf
 . /etc/rc.d/functions
 
+# print usage and exit
 usage() {
        local name=${0##*/}
        cat >&2 << EOF
 usage: $name <action> <daemon> [daemon] ...
-       $name list [started|stopped]
+       $name list [started|stopped|auto|noauto|daemon]
        $name help
 
 <daemon> is the name of a script in /etc/rc.d
@@ -17,40 +18,68 @@ WARNING: initscripts are free to implement or not the above 
actions.
 
 e.g: $name list
      $name list started
+     $name list sshd gpm
      $name help
      $name start sshd gpm
 EOF
        exit 1
 }
 
+# list action
+list() {
+       local mode s_status s_auto
+       local -a daemons
+       # parse arguments
+       for p; do
+               case "$p" in
+                       started) mode=started;;
+                       stopped) mode=stopped;;
+                       auto)            mode=auto;;
+                       noauto)  mode=noauto;;
+                       *)                       daemons=(${daemons[@]} "$p");;
+               esac
+       done
+       # if no daemon are specified take all executable file in /etc/rc.d
+       if ! [[ $daemons ]]; then
+               cd /etc/rc.d
+               for d in *; do
+                       [[ -x "$d" && ! -d "$d" ]] && daemons=(${daemons[@]} 
"$d")
+               done
+       fi
+       # building string to display
+       for d in "${daemons[@]}"; do
+               # check if d is a valid daemon name
+               have_daemon "$d" || continue
+               # print running / stopped satus
+               if ! ck_daemon "$d"; then
+                       [[ $mode == stopped ]] && continue
+                       s_status="${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
+               else
+                       [[ $mode == started ]] && continue
+                       s_status="${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
+               fi
+               # print auto / manual status
+               if ! ck_autostart "$d"; then
+                       [[ $mode == noauto ]] && continue
+                       s_auto="${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
+               else
+                       [[ $mode == auto ]] && continue
+                       s_auto="${C_OTHER}[${C_FAIL}    ${C_OTHER}]"
+               fi
+               printf "$s_status$s_auto${C_CLEAR} $d\n"
+       done
+}
+
 (( $# < 1 )) && usage
 
 declare -i ret=0
 case $1 in
        help)
                usage
-               ;;
+       ;;
        list)
                shift
-               cd /etc/rc.d/
-               for d in *; do
-                       have_daemon "$d" || continue
-                       # print running / stopped satus
-                       if ! ck_daemon "$d"; then
-                               [[ "$1" == stopped ]] && continue
-                               printf "${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
-                       else
-                               [[ "$1" == started ]] && continue
-                               printf "${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
-                       fi
-                       # print auto / manual status
-                       if ! ck_autostart "$d"; then
-                               printf "${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
-                       else
-                               printf "${C_OTHER}[${C_FAIL}    ${C_OTHER}]"
-                       fi
-                       printf " ${C_CLEAR}$d\n"
-               done
+               list "$@"
        ;;
        *)
                # check min args count
diff --git a/zsh-completion b/zsh-completion
index e5c2850..b324e5c 100644
--- a/zsh-completion
+++ b/zsh-completion
@@ -19,7 +19,7 @@ _rc.d () {
                                        _arguments "*: :"
                                        ;;
                                list)
-                                       _arguments "2: :(started stopped)"
+                                       _arguments "*: :(started stopped auto 
noauto $(echo /etc/rc.d/*(N-*:t)))"
                                        ;;
                                start)
                                        _arguments "*: :($(comm -23 <(echo 
/etc/rc.d/*(N-*:t)|tr ' ' '\n') <(echo /run/daemons/*(N:t)|tr ' ' '\n')))"
-- 
Sebastien "Seblu" Luttringer

Reply via email to