Bug#423095: [Pkg-sysvinit-devel] Bug#423095: sysvinit: Allow bootsplash packages to hook into fsck events

David Härdeman david at hardeman.nu
Sat May 12 11:32:01 UTC 2007


On Thu, May 10, 2007 at 10:47:29PM +0200, Petter Reinholdtsen wrote:
>[David Härdeman]
>> Here's a more complete stub (/lib/init/splash-functions-base) file which 
>> should allow many more scripts to use the generic functions.
>
>This API looks quite good, and I suspect it will handle most needs.
>We might need some splash_start_if_not_running() or similar, for the
>cases where it need to be restarted.
>
>Also, this function need to have more features:
>
>> # Tells the splash the current boot progress in percent (as $1)
>> splash_progress () { return 0; }
>
>In usplash, the progress bar can go both ways, depending on the sign
>of the progress value.  It is used during shutdown.  We probably want
>to support it in the API.

I've thought a bit more about the API and also experimented with 
implementing it in some different scripts which uncovered some more 
functionality that was needed.

I've attached a new version of the hooks and an example implementation 
for usplash to give you a fell of how it would work when implemented.

Please review.

-- 
David Härdeman

-------------- next part --------------
# Usplash hooks for /lib/init/splash-functions-base

# Internal function, do not use in external scripts
usplash_pidfound()
{
	pidof usplash > /dev/null 2>&1 || return 1
	return 0
}

splash_running()
{
	if [ -x /sbin/usplash ] && usplash_pidfound; then
		return 0
	fi
	return 1
}

splash_stop ()
{
	local i

	splash_running || return 0

	# Wait until it is gone or forcibly kill it
	i=0
	while usplash_pidfound; do
		i=$(($i + 1))
		if [ $i -gt 10 ]; then
			kill -9 $(pidof usplash)
			break
		fi
		sleep 1
	done
	return 0
}

splash_start ()
{
	if splash_running; then
		return 0
	elif [ ! -x /sbin/usplash ] || [ ! -x /sbin/usplash_down ]; then
		return 1
	else
		/sbin/usplash_down || return 1
		return 0
	fi
}

private_splash_progress ()
{
	splash_running || return 0
	/sbin/usplash_write "PROGRESS $1" || return 1
	return 0
}

splash_start_indefinate ()
{
	splash_running || return 0
	/sbin/usplash_write "TIMEOUT 0" || return 1
	/sbin/usplash_write "PULSATE" || return 1
	return 0
}

splash_stop_indefinate ()
{
	splash_running || return 0
	/sbin/usplash_write "CLEAR" || return 1
	/sbin/usplash_write "TIMEOUT 15" || return 1
	return 0
}

splash_user_input ()
{
	splash_running || return 1
	[ -p /dev/.initramfs/usplash_outfifo ] || return 1

	case "$2" in
		regular)
			/sbin/usplash_write "INPUT $1" || return 1
			;;
		password)
			/sbin/usplash_write "INPUTQUIET $1" || return 1
			;;
		enter)
			/sbin/usplash_write "INPUTENTER $1" || return 1
			;;
		*)
			return 1
			;;
	esac
	cat /dev/.initramfs/usplash_outfifo 2> /dev/null || return 1
	return 0
}

-------------- next part --------------
# This script contains hooks to allow init scripts to control
# a splash program during boot and shutdown.
#
# To override these, provide a /lib/init/splash-functions scripts
# with new functions (it is sourced at the end of this file)
#
# Note that scripts have a number of constraints:
#  1) Should avoid using any binaries not found in the initramfs so that 
#     the same hooks can be used there.
#  2) This also means that bashisms can't be used.
#  3) Scripts must work when running under "set -e".
#  4) "local" should be used to avoid overwriting global variables.


# Detects whether a splash is running
splash_running() { return 1; }

# Tells the splash to quit
splash_stop () { return 0; }

# Tells the splash to start if not already running
splash_start () { return 1; }

# Tells the splash the current boot/shutdown progress
# $1 contains the progress as a percentage value between -100 and 100
# Positive values indicate boot progress
# Negative values indicate shutdown progress
splash_progress ()
{
	local progress tmp
	progress="$1"

	splash_running || return 0

	# Sanity check step 1 - must match ^-[0-9]*$
	tmp="$progress"

	# Strip trailing numbers
	while [ "${tmp%[0-9]}" != "$tmp" ]; do
                tmp="${tmp%[0-9]}"
        done

	# Now "-" or no characters should remain
        if [ -n "$tmp" ] && [ "$tmp" != "-" ]; then
                return 1
        fi

	#  Sanity check step 2 - check for values >= -100 and <= 100
	if [ "$progress" != "${progress#-}" ]; then
		# Negative value
		if [ "$progress" -lt -100 ]; then
			return 1
		fi
	else
		# Positive value
		if [ "$progress" -gt 100 ]; then
			return 1
		fi
	fi

	# Sanity checks passed
	private_splash_progress "$progress" || return 1
	return 0
}

# Customizations should replace this function instead of splash_progress above
private_splash_progress () { return 0; }

# Tells the splash that a task which may take an unknown amount of
# time has started (such as a fsck). This is useful to make sure the
# splash doesn't time out and to give visual feedback to the user.
splash_start_indefinate () { return 0; }

# Tells the splash that an indefinate task is done
splash_stop_indefinate () { return 0; }

# Gets user input from a splash
# $1 contains the text for the user prompt
# $2 describes the type of input:
#     regular  = regular input, e.g. a user name
#     password = input which should not be echoed to screen, e.g. a password
#     enter    = A "press enter to continue" type of prompt
#
# Returns 1 if no user input is possible
# Should be called with an alternative non-splash input fallback:
#   INPUT="$(splash_user_input "Enter password:" password)" || \
#   INPUT="$(manual_method)"
splash_user_input () { return 1; }

# Allow these to be overridden with custom scripts
[ -e /lib/init/splash-functions ] && . /lib/init/splash-functions



More information about the Pkg-sysvinit-devel mailing list