[Pkg-sysvinit-devel] Bug#387894: tested with usplash + reviewed
patch
Jean-Damien Durand
Jean-Damien.Durand at tele2.fr
Sat Sep 23 07:03:40 UTC 2006
Tested with usplash - works for me.
Note that at shutdown usplash progress bar goes from left to right while with
splashutils it goes from right to left - but perhaps usplash does 100-value if
runlevel is 6, don't know its internals).
Here is a patch without unneeded space/tab changes.
Cheers, JD.
-------------- next part --------------
--- /etc/init.d/rc.old 2006-09-08 18:38:56.000000000 +0200
+++ /etc/init.d/rc 2006-09-23 08:51:33.000000000 +0200
@@ -79,11 +79,122 @@
if [ "$SPLASH" = true ] ; then
step=$(($step + $step_change))
progress=$(($step * $progress_size / $num_steps + $first_step))
- usplash_write "PROGRESS $progress" || true
+ $debug usplash_write "PROGRESS $progress" || true
+ [ "$last_step_change" = "1" ] && step_change=0
fi
}
#
+# kill scripts - if 1st argument is "countonly" then nothing is executed
+#
+run_kill_scripts() {
+ if [ "$last_step_change" = "1" ]; then
+ local_step_change=0
+ else
+ local_step_change=1
+ fi
+ [ "$1" = "countonly" ] && nkill=0
+ if [ "$previous" != N ]
+ then
+ # Run all scripts with the same level in parallel
+ CURLEVEL=""
+ for s in /etc/rc$runlevel.d/K*
+ do
+ level=$(echo $s | sed 's/.*\/K\([0-9][0-9]\).*/\1/')
+ if [ "$level" = "$CURLEVEL" ]
+ then
+ continue
+ fi
+ CURLEVEL=$level
+ SCRIPTS=""
+ for i in /etc/rc$runlevel.d/K$level*
+ do
+ # Check if the script is there.
+ [ ! -f $i ] && continue
+
+ #
+ # Find stop script in previous runlevel but
+ # no start script there.
+ #
+ suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9]}
+ previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
+ previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
+ #
+ # If there is a stop script in the previous level
+ # and _no_ start script there, we don't
+ # have to re-stop the service.
+ #
+ [ -f $previous_stop ] && [ ! -f $previous_start ] && continue
+
+ # Stop the service.
+ SCRIPTS="$SCRIPTS $i"
+ [ "$1" = "countonly" ] && nkill=$(($nkill + $local_step_change))
+ case "${s##/etc/rc$runlevel.d/S??}" in
+ gdm|xdm|kdm|reboot|halt)
+ local_step_change=0
+ last_step_change=1
+ ;;
+ esac
+ done
+ [ "$1" != "countonly" ] && startup stop $SCRIPTS
+ done
+ fi
+}
+
+#
+# Start scripts - if 1st argument is "countonly" then nothing is executed
+#
+run_start_scripts() {
+ if [ "$last_step_change" = "1" ]; then
+ local_step_change=0
+ else
+ local_step_change=1
+ fi
+ [ "$1" = "countonly" ] && nstart=0
+ CURLEVEL=""
+ for s in /etc/rc$runlevel.d/S*
+ do
+ level=$(echo $s | sed 's/.*\/S\([0-9][0-9]\).*/\1/')
+ if [ "$level" = "$CURLEVEL" ]
+ then
+ continue
+ fi
+ CURLEVEL=$level
+ SCRIPTS=""
+ for i in /etc/rc$runlevel.d/S$level*
+ do
+ [ ! -f $i ] && continue
+
+ if [ "$previous" != N ]
+ then
+ #
+ # Find start script in previous runlevel and
+ # stop script in this runlevel.
+ #
+ suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
+ stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
+ previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
+ #
+ # If there is a start script in the previous level
+ # and _no_ stop script in this level, we don't
+ # have to re-start the service.
+ #
+ [ -f $previous_start ] && [ ! -f $stop ] && continue
+ fi
+ SCRIPTS="$SCRIPTS $i"
+ [ "$1" = "countonly" ] && nstart=$(($nstart + $local_step_change))
+ case "${s##/etc/rc$runlevel.d/S??}" in
+ gdm|xdm|kdm|reboot|halt)
+ local_step_change=0
+ last_step_change=1
+ ;;
+ esac
+ done
+ [ "$1" != "countonly" ] && startup $ACTION $SCRIPTS
+ done
+}
+
+#
# Start script or program.
#
case "$CONCURRENCY" in
@@ -221,102 +332,28 @@
# Begin where rcS left off and use the final 1/3 of
# the space (by leaving progress_size unchanged)
first_step=$(($progress_size * 2 + $PROGRESS_STATE))
+ progress_size=$((100 - $first_step))
step_change=1
;;
esac
- if [ "$SPLASH" = true ] ; then
- # Count the number of scripts we need to run (for usplash
- # progress bar)
- num_steps=0
- for s in /etc/rc$runlevel.d/[SK]*; do
- case "${s##/etc/rc$runlevel.d/S??}" in
- gdm|xdm|kdm|reboot|halt)
- break
- ;;
- esac
- num_steps=$(($num_steps + 1))
- done
- step=0
- fi
+ # Initalize the last_step_change value
+ last_step_change=0
+ # Count the number of scripts we need to run (for usplash
+ # progress bar)
+ num_steps=0
+ run_kill_scripts countonly
+ run_start_scripts countonly
+ num_steps=$(($nkill+ $nstart))
+ step=0
+ last_step_change=0
# First, run the KILL scripts.
- if [ "$previous" != N ]
- then
- # Run all scripts with the same level in parallel
- CURLEVEL=""
- for s in /etc/rc$runlevel.d/K*
- do
- level=$(echo $s | sed 's/.*\/K\([0-9][0-9]\).*/\1/')
- if [ "$level" = "$CURLEVEL" ]
- then
- continue
- fi
- CURLEVEL=$level
- SCRIPTS=""
- for i in /etc/rc$runlevel.d/K$level*
- do
- # Check if the script is there.
- [ ! -f $i ] && continue
-
- #
- # Find stop script in previous runlevel but
- # no start script there.
- #
- suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9]}
- previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
- previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
- #
- # If there is a stop script in the previous level
- # and _no_ start script there, we don't
- # have to re-stop the service.
- #
- [ -f $previous_stop ] && [ ! -f $previous_start ] && continue
-
- # Stop the service.
- SCRIPTS="$SCRIPTS $i"
- done
- startup stop $SCRIPTS
- done
- fi
+ run_kill_scripts
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
- CURLEVEL=""
- step=0
- for s in /etc/rc$runlevel.d/S*
- do
- level=$(echo $s | sed 's/.*\/S\([0-9][0-9]\).*/\1/')
- if [ "$level" = "$CURLEVEL" ]
- then
- continue
- fi
- CURLEVEL=$level
- SCRIPTS=""
- for i in /etc/rc$runlevel.d/S$level*
- do
- [ ! -f $i ] && continue
-
- if [ "$previous" != N ]
- then
- #
- # Find start script in previous runlevel and
- # stop script in this runlevel.
- #
- suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
- stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
- previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
- #
- # If there is a start script in the previous level
- # and _no_ stop script in this level, we don't
- # have to re-start the service.
- #
- [ -f $previous_start ] && [ ! -f $stop ] && continue
- fi
- SCRIPTS="$SCRIPTS $i"
- done
- startup $ACTION $SCRIPTS
- done
+ run_start_scripts
fi
if [ S = "$runlevel" ]
More information about the Pkg-sysvinit-devel
mailing list