mirror of
https://gitdl.cn/https://github.com/chakralinux/core.git
synced 2025-02-04 20:37:15 +08:00
201 lines
6.3 KiB
Bash
201 lines
6.3 KiB
Bash
|
|
# /etc/rc.d/functions.d/fbsplash-basic.sh #
|
|
|
|
# Basic Fbsplash script for Chakra GNU/Linux initscripts #
|
|
# #
|
|
# Author: Kurt J. Bosch <kjb-temp-2009 at alpenjodel.de> #
|
|
# Based on the work of Greg Helton <gt at fallendusk.org> #
|
|
# Thomas Baechler <thomas at archlinux.org> #
|
|
# and others #
|
|
# #
|
|
# Distributed under the terms of the GNU General Public License (GPL) #
|
|
|
|
[[ $PREVLEVEL && $RUNLEVEL ]] || return 0
|
|
|
|
# Do nothing if improved scripts are installed
|
|
[ -r /etc/rc.d/functions.d/fbsplash-extras.sh ] && return
|
|
|
|
# Only do this where needed
|
|
# Since we use BASH, all important functions and variables are exported
|
|
case ${0#/etc/rc.} in sysinit | multi | shutdown )
|
|
export SPLASH_PUSH_MESSAGES="no"
|
|
export SPLASH_VERBOSE_ON_ERRORS="no"
|
|
. /sbin/splash-functions.sh # /etc/conf.d/splash is also sourced by this
|
|
unset options opt i # eliminate splash_setup non local vars ## FIX ME ##
|
|
declare -ix SPLASH_STEPS=4 # sysinit steps
|
|
declare -ix SPLASH_STEPS_DONE=0
|
|
esac
|
|
|
|
# Verbose mode is handled by fbcondecor kernel patch and daemon script
|
|
[[ $SPLASH_MODE_REQ = silent ]] || return 0
|
|
|
|
# Override - Don't try to use /usr/bin/basename
|
|
splash_comm_send() {
|
|
[[ $( /bin/pidof -o %PPID $spl_daemon ) ]] && echo "$@" >$spl_fifo &
|
|
}
|
|
|
|
case $0 in /etc/rc.sysinit )
|
|
# Prevent splash destruction
|
|
CONSOLEFONT=""
|
|
# Take over the cache and fifo from initcpio
|
|
if [[ -p /dev/.splash-cache/${spl_fifo##*/} ]]; then
|
|
/bin/mount --bind /dev/.splash-cache $spl_cachedir || return
|
|
splash_comm_send set message "$SPLASH_BOOT_MESSAGE"
|
|
# Mount a tmpfs
|
|
else
|
|
( splash_cache_prep ) || return
|
|
fi
|
|
add_hook sysinit_udevsettled splash_sysinit_udevsettled
|
|
add_hook sysinit_postfsck splash_sysinit_postfsck
|
|
add_hook sysinit_postfsckloop splash_sysinit_postfsck
|
|
add_hook sysinit_premount splash_sysinit_premount
|
|
add_hook sysinit_end splash_sysinit_end
|
|
splash_sysinit_udevsettled() {
|
|
splash_begin
|
|
splash_progress_init
|
|
splash_progress
|
|
}
|
|
splash_sysinit_premount() {
|
|
splash_progress
|
|
}
|
|
splash_sysinit_postfsck() { # fsck failure emergency exit
|
|
[ ${fsckret} -gt 1 -a ${fsckret} -ne 32 ] && chvt 1
|
|
}
|
|
splash_sysinit_end() {
|
|
splash_progress
|
|
}
|
|
;; /etc/rc.multi )
|
|
add_hook multi_start splash_multi_start
|
|
add_hook multi_end splash_multi_end
|
|
splash_multi_start() {
|
|
SPLASH_STEPS_DONE=$SPLASH_STEPS
|
|
splash_progress_init
|
|
}
|
|
start_daemon() {
|
|
[[ $1 = $SPLASH_XSERVICE ]] && SPLASH_EXIT_TYPE=staysilent splash_stop
|
|
/etc/rc.d/$1 start
|
|
splash_progress
|
|
}
|
|
start_daemon_bkgd() {
|
|
[[ $1 = $SPLASH_XSERVICE ]] && SPLASH_EXIT_TYPE=staysilent splash_stop
|
|
stat_bkgd "Starting $1"
|
|
(SPLASH_PUSH_MESSAGES="no" /etc/rc.d/$1 start) &>/dev/null &
|
|
}
|
|
splash_multi_end() {
|
|
if [[ $PREVLEVEL = N ]]; then
|
|
if ! in_array "$SPLASH_XSERVICE" "${DAEMONS[@]}"; then
|
|
if [[ $RUNLEVEL = 5 ]]; then
|
|
SPLASH_EXIT_TYPE=staysilent splash_stop
|
|
else
|
|
splash_stop
|
|
[[ $( $spl_bindir/fgconsole ) = $SPLASH_TTY ]] && chvt 1
|
|
fi
|
|
fi
|
|
# Now do setfont
|
|
set_consolefont
|
|
# Umount the tmpfs
|
|
splash_cache_cleanup
|
|
fi
|
|
}
|
|
;; /etc/rc.shutdown )
|
|
( splash_cache_prep ) || return
|
|
# Not using XSERVICE here to avoid missing errors - X should chvt back to SPLASH_TTY
|
|
add_hook shutdown_start splash_shutdown_start
|
|
add_hook shutdown_prekillall splash_shutdown_prekillall
|
|
add_hook shutdown_postkillall splash_shutdown_postkillall
|
|
add_hook shutdown_poweroff splash_shutdown_poweroff
|
|
splash_shutdown_start() {
|
|
splash_begin
|
|
}
|
|
## http://bugs.archlinux.org/task/10536 ## FIX ME ##
|
|
splash_shutdown_prekillall() { /bin/sleep .1; }
|
|
splash_shutdown_postkillall() {
|
|
if [[ $( $spl_bindir/fgconsole ) = $SPLASH_TTY ]]; then
|
|
stat_busy "Restarting Fbsplash daemon"
|
|
PROGRESS=$(( 65535*2/3 )) splash_start
|
|
if [[ -e $spl_cachedir/stop_failed-fbsplash-dummy ]]; then
|
|
splash_comm_send update_svc fbsplash-dummy svc_stop_failed
|
|
fi
|
|
stat_done
|
|
fi
|
|
}
|
|
##
|
|
splash_shutdown_poweroff() {
|
|
SPLASH_EXIT_TYPE=staysilent splash_stop
|
|
}
|
|
esac
|
|
|
|
splash_progress_init() {
|
|
for daemon in "${DAEMONS[@]}"; do
|
|
case $daemon in $SPLASH_XSERVICE | @$SPLASH_XSERVICE ) break
|
|
;; \!* |@* ) continue
|
|
esac
|
|
SPLASH_STEPS+=1
|
|
done
|
|
}
|
|
|
|
splash_progress() {
|
|
splash_comm_send progress $(( 65535*++SPLASH_STEPS_DONE/SPLASH_STEPS ))
|
|
splash_comm_send paint
|
|
}
|
|
|
|
# Start the splash daemon - using upstream function
|
|
splash_set_event_dev() { :; } # override - Never grab the keyboard
|
|
splash_begin() {
|
|
if ! [[ $( /bin/pidof -o %PPID $spl_daemon ) ]]; then
|
|
stat_busy "Starting Fbsplash daemon"
|
|
if [ -x /etc/splash/$SPLASH_THEME/scripts/rc_init-pre ]; then
|
|
/etc/splash/$SPLASH_THEME/scripts/rc_init-pre ${0#/etc/rc.d} $RUNLEVEL
|
|
fi &&
|
|
splash_start &&
|
|
stat_done || stat_fail
|
|
fi
|
|
}
|
|
|
|
# Stop the splash daemon - if any
|
|
splash_stop() {
|
|
if [[ $( /bin/pidof -o %PPID $spl_daemon ) ]]; then
|
|
SPLASH_PUSH_MESSAGES="no" stat_busy "Stopping Fbsplash daemon"
|
|
splash_comm_send progress 65535; splash_comm_send paint; /bin/sleep .1
|
|
splash_comm_send exit $SPLASH_EXIT_TYPE
|
|
# Wait for painting/fadeout
|
|
local -i i=0
|
|
while [[ i++ -lt 100 && $( /bin/pidof -o %PPID $spl_daemon ) ]]; do
|
|
/bin/sleep .1
|
|
done
|
|
stat_done
|
|
fi
|
|
}
|
|
|
|
stat_busy() {
|
|
printf "${C_OTHER}${PREFIX_REG} ${C_MAIN}${1}${C_CLEAR} "
|
|
printf "${SAVE_POSITION}"
|
|
deltext
|
|
printf " ${C_OTHER}[${C_BUSY}BUSY${C_OTHER}]${C_CLEAR} "
|
|
SPLASH_BUSY_MSG=$1
|
|
if [[ $SPLASH_PUSH_MESSAGES = yes ]]; then
|
|
splash_comm_send set message "${1}"
|
|
splash_comm_send paint
|
|
fi
|
|
}
|
|
|
|
stat_fail() {
|
|
deltext
|
|
printf " ${C_OTHER}[${C_FAIL}FAIL${C_OTHER}]${C_CLEAR} \n"
|
|
local event=stop_failed; [[ $PREVLEVEL = N ]] && event=start_failed
|
|
# Provide a general failure status event and write to msglog textbox
|
|
splash_comm_send update_svc fbsplash-dummy svc_${event}
|
|
splash_comm_send log "Error $SPLASH_BUSY_MSG"
|
|
splash_comm_send paint
|
|
# Save for daemon restart ## FIX ME ##
|
|
if /bin/mountpoint -q $spl_cachedir; then
|
|
: >|$spl_cachedir/${event}-fbsplash-dummy
|
|
fi
|
|
# Upstream way of error handling
|
|
if [[ $SPLASH_VERBOSE_ON_ERRORS = yes ]]; then
|
|
chvt 1
|
|
fi
|
|
}
|
|
|
|
# EOF #
|