mirror of
https://git.yoctoproject.org/poky
synced 2026-07-27 07:27:12 +00:00
6ddb9bc4bb
The psplash program contains a hidden text box immediately above the progress bar. Any text sent via a "MSG" command through psplash's fifo will be displayed, centred, above the progress bar. Add the ability to show which startup script is currently running, in sync with updates to the progress bar. If a startup script takes a bit longer than others and the progress bar stops momentarily, this allows the user to know which script is responsible. This feature is added with a knob, default off, for enabling or disabling this feature. The knob is in the form of a PACKAGECONFIG against the sysvinit recipe: psplash-text-updates NOTE: this knob can be changed in the filesystem at runtime by editing /etc/default/rcS regardless of how it is set in the build. (From OE-Core rev: 6a48631e24341895f13029fb7c69dd67031f53c1) Signed-off-by: Trevor Woerner <twoerner@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
183 lines
4.3 KiB
Bash
Executable File
183 lines
4.3 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# rc This file is responsible for starting/stopping
|
|
# services when the runlevel changes.
|
|
#
|
|
# Optimization feature:
|
|
# A startup script is _not_ run when the service was
|
|
# running in the previous runlevel and it wasn't stopped
|
|
# in the runlevel transition (most Debian services don't
|
|
# have K?? links in rc{1,2,3,4,5} )
|
|
#
|
|
# Author: Miquel van Smoorenburg <miquels@cistron.nl>
|
|
# Bruce Perens <Bruce@Pixar.com>
|
|
#
|
|
# Version: @(#)rc 2.78 07-Nov-1999 miquels@cistron.nl
|
|
#
|
|
|
|
. /etc/default/rcS
|
|
export VERBOSE
|
|
export PSPLASH_FIFO_DIR
|
|
|
|
startup_progress() {
|
|
step=$(($step + $step_change))
|
|
if [ "$num_steps" != "0" ]; then
|
|
progress=$((($step * $progress_size / $num_steps) + $first_step))
|
|
else
|
|
progress=$progress_size
|
|
fi
|
|
#echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size"
|
|
if type psplash-write >/dev/null 2>&1; then
|
|
psplash-write "PROGRESS $progress" || true
|
|
fi
|
|
}
|
|
|
|
|
|
#
|
|
# Start script or program.
|
|
#
|
|
startup() {
|
|
# Handle verbosity
|
|
[ "$VERBOSE" = very ] && echo "INIT: Running $@..."
|
|
|
|
case "$1" in
|
|
*.sh)
|
|
# Source shell script for speed.
|
|
(
|
|
trap - INT QUIT TSTP
|
|
scriptname=$1
|
|
shift
|
|
. $scriptname
|
|
)
|
|
;;
|
|
*)
|
|
"$@"
|
|
;;
|
|
esac
|
|
startup_progress
|
|
}
|
|
|
|
# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
|
|
trap ":" INT QUIT TSTP
|
|
|
|
# Set onlcr to avoid staircase effect.
|
|
stty onlcr 0>&1
|
|
|
|
# Limit stack size for startup scripts
|
|
[ "$STACK_SIZE" = "" ] || ulimit -S -s $STACK_SIZE
|
|
|
|
# Now find out what the current and what the previous runlevel are.
|
|
|
|
runlevel=$RUNLEVEL
|
|
# Get first argument. Set new runlevel to this argument.
|
|
[ "$1" != "" ] && runlevel=$1
|
|
if [ "$runlevel" = "" ]
|
|
then
|
|
echo "Usage: $0 <runlevel>" >&2
|
|
exit 1
|
|
fi
|
|
previous=$PREVLEVEL
|
|
[ "$previous" = "" ] && previous=N
|
|
|
|
export runlevel previous
|
|
|
|
# Is there an rc directory for this new runlevel?
|
|
if [ -d /etc/rc$runlevel.d ]
|
|
then
|
|
# Find out where in the progress bar the initramfs got to.
|
|
PROGRESS_STATE=0
|
|
#if [ -f /dev/.initramfs/progress_state ]; then
|
|
# . /dev/.initramfs/progress_state
|
|
#fi
|
|
|
|
# Split the remaining portion of the progress bar into thirds
|
|
progress_size=$(((100 - $PROGRESS_STATE) / 3))
|
|
|
|
case "$runlevel" in
|
|
0|6)
|
|
# Count down from -100 to 0 and use the entire bar
|
|
first_step=-100
|
|
progress_size=100
|
|
step_change=1
|
|
;;
|
|
S)
|
|
# 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
|
|
;;
|
|
*)
|
|
# 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
|
|
;;
|
|
esac
|
|
|
|
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
|
|
|
|
# First, run the KILL scripts.
|
|
if [ $previous != N ]
|
|
then
|
|
for i in /etc/rc$runlevel.d/K[0-9][0-9]*
|
|
do
|
|
# Check if the script is there.
|
|
[ ! -f $i ] && continue
|
|
|
|
# Stop the service.
|
|
startup $i stop
|
|
done
|
|
fi
|
|
|
|
# Now run the START scripts for this runlevel.
|
|
for i in /etc/rc$runlevel.d/S*
|
|
do
|
|
[ ! -f $i ] && continue
|
|
|
|
if [ $previous != N ] && [ $previous != S ]
|
|
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
|
|
if [ x"${PSPLASH_TEXT_UPDATES}" = x"yes" ]; then
|
|
psplash-write "MSG $(basename $i .sh | cut -c 4-)" || true
|
|
fi
|
|
case "$runlevel" in
|
|
0|6)
|
|
startup $i stop
|
|
;;
|
|
*)
|
|
startup $i start
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
#Uncomment to cause psplash to exit manually, otherwise it exits when it sees a VC switch
|
|
if [ "x$runlevel" != "xS" ] && [ ! -x /etc/rc${runlevel}.d/S??xserver-nodm ]; then
|
|
if type psplash-write >/dev/null 2>&1; then
|
|
psplash-write "QUIT" || true
|
|
fi
|
|
fi
|