Package: sysv-rc
Version: 2.86.ds1-20
Severity: normal

abour progress bar, here are few fixes and suggestions.

- in debug mode, probably the call to usplash_write should just be echoed
- the count of number of scripts executed is approximate v.s. what happens
 in reality (check if file exist, check of previous runlevel, etc.)
- the computation of what fraction of the bar to fill is not guaranteed to
 reach 0 or 100, because of rouding issues (100/3, then multiplied again)

Please find attached a patch for all these issues, where I factorized the call 
to kill
and start script in order to avoid code duplication. I let you check and/or 
reject it, no pb!
Tested with splashutils, not tested with bootsplash.

Cheers, JD.

-- System Information:
Debian Release: testing/unstable
 APT prefers unstable
 APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 
'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.17-beyond3
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)

sysv-rc depends on no packages.

Versions of packages sysv-rc recommends:
ii  lsb-base                      3.1-15     Linux Standard Base 3.1 init scrip

-- no debconf information
--- /etc/init.d/rc.old  2006-09-08 18:38:56.000000000 +0200
+++ /etc/init.d/rc      2006-09-17 12:11:33.000000000 +0200
@@ -77,13 +77,125 @@
 startup_progress() {
     $@
     if [ "$SPLASH" = true ] ; then
-        step=$(($step + $step_change))
-        progress=$(($step * $progress_size / $num_steps + $first_step))
-        usplash_write "PROGRESS $progress" || true
+       step=$(($step + $step_change))
+       progress=$(($step * $progress_size / $num_steps + $first_step))
+       $debug usplash_write "PROGRESS $progress" || true
+       # If this is was the last step, reset step_change
+       [ "$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
@@ -201,122 +313,48 @@
        progress_size=$(((100 - $PROGRESS_STATE) / 3))
 
        case "$runlevel" in
-               0|6)
-                       ACTION=stop
-                       # Count down from 0 to -100 and use the entire bar
-                       first_step=0
-                       progress_size=100
-                       step_change=-1
-                       ;;
-               S)
-                       ACTION=start
-                       # Begin where the initramfs left off and use 2/3
-                       # of the remaining space
-                       first_step=$PROGRESS_STATE
-                       progress_size=$(($progress_size * 2))
-                       step_change=1
-                       ;;
-               *)
-                       ACTION=start
-                       # 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))
-                       step_change=1
+       0|6)
+               ACTION=stop
+               # Count down from 0 to -100 and use the entire bar
+               first_step=0
+               progress_size=100
+               step_change=-1
+               ;;
+       S)
+               ACTION=start
+               # Begin where the initramfs left off and use 2/3
+               # of the remaining space
+               first_step=$PROGRESS_STATE
+               progress_size=$(($progress_size * 2))
+               step_change=1
+               ;;
+       *)
+               ACTION=start
+               # 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" ]

Reply via email to