diff options
author | rbalocca <rbalocca@vyatta.com> | 2008-10-28 14:49:35 -0700 |
---|---|---|
committer | rbalocca <rbalocca@vyatta.com> | 2008-10-28 14:49:35 -0700 |
commit | 3939e96a8830755228bd2bbedb50db6808d36f80 (patch) | |
tree | 6c55ccb42447ad90946ee6157dab49e573ec92d2 /scripts/functions | |
download | initramfs-tools-3939e96a8830755228bd2bbedb50db6808d36f80.tar.gz initramfs-tools-3939e96a8830755228bd2bbedb50db6808d36f80.zip |
initramfs-tools-0.92j from mirrrors.kernel.orgdebian/0.92j
Diffstat (limited to 'scripts/functions')
-rw-r--r-- | scripts/functions | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/scripts/functions b/scripts/functions new file mode 100644 index 0000000..299c29c --- /dev/null +++ b/scripts/functions @@ -0,0 +1,308 @@ +# -*- shell-script -*- + +_log_msg() +{ + if [ "$quiet" = "y" ]; then return; fi + printf "$@" +} + +log_success_msg() +{ + _log_msg "Success: $@\n" +} + +log_failure_msg() +{ + _log_msg "Failure: $@\n" +} + +log_warning_msg() +{ + _log_msg "Warning: $@\n" +} + +log_begin_msg() +{ + if [ -x /sbin/usplash_write ]; then + /sbin/usplash_write "TEXT $@" + fi + _log_msg "Begin: $@ ... " +} + +log_end_msg() +{ + if [ -x /sbin/usplash_write ]; then + /sbin/usplash_write "SUCCESS ok" + fi + _log_msg "done.\n" +} + +panic() +{ + if [ -x /sbin/usplash_write ]; then + /sbin/usplash_write "QUIT" + fi + # Disallow console access + if [ -n "${panic}" ]; then + sleep ${panic} + reboot + fi + modprobe i8042 + modprobe atkbd + echo $@ + PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1 +} + +maybe_break() +{ + if [ "${break}" = "$1" ]; then + panic "Spawning shell within the initramfs" + fi +} + +render() +{ + eval "echo -n \${$@}" +} + +set_initlist() +{ + unset initlist + for si_x in ${initdir}/*; do + # skip empty dirs without warning + [ "${si_x}" = "${initdir}/*" ] && return + + # only allow variable name chars + case ${si_x#${initdir}/} in + *[![:alnum:]_]*) + [ "${verbose}" = "y" ] \ + && echo "$si_x ignored: not alphanumeric or '_' file" + continue + ;; + esac + + # skip non executable scripts + if [ ! -x ${si_x} ]; then + [ "${verbose}" = "y" ] \ + && echo "$si_x ignored: not executable" + continue + fi + + # skip directories + if [ -d ${si_x} ]; then + [ "${verbose}" = "y" ] \ + && echo "$si_x ignored: a directory" + continue + fi + + initlist="${initlist} ${si_x#${initdir}/}" + done +} + +reduce_satisfied() +{ + deplist="$(render array_${1})" + unset tmpdeplist + for rs_y in ${deplist}; do + # only allow variable name chars + case ${rs_y} in + *[![:alnum:]_]*) + continue + ;; + esac + # skip non executable scripts + if [ ! -x ${initdir}/${rs_y} ]; then + continue + fi + # skip directories + if [ -d ${initdir}/${rs_y} ]; then + continue + fi + tmpdeplist="${tmpdeplist} ${rs_y}" + done + deplist=${tmpdeplist} + for rs_x in ${runlist}; do + pop_list_item ${rs_x} ${deplist} + deplist=${tmppop} + done + eval array_${1}=\"${deplist}\" +} + +get_prereqs() +{ + set_initlist + for gp_x in ${initlist}; do + tmp=$(${initdir}/${gp_x} prereqs) + eval array_${gp_x}=\"${tmp}\" + done +} + +count_unsatisfied() +{ + set -- ${@} + return ${#} +} + +# Removes $1 from initlist +pop_list_item() +{ + item=${1} + shift + set -- ${@} + unset tmppop + # Iterate + for pop in ${@}; do + if [ ${pop} = ${item} ]; then + continue + fi + tmppop="${tmppop} ${pop}" + done + +} + +# This function generates the runlist, so we clear it first. +reduce_prereqs() +{ + unset runlist + set -- ${initlist} + i=$# + # Loop until there's no more in the queue to loop through + while [ ${i} -ne 0 ]; do + oldi=${i} + for rp_x in ${initlist}; do + reduce_satisfied ${rp_x} + count_unsatisfied $(render array_${rp_x}) + cnt=${?} + if [ ${cnt} -eq 0 ]; then + runlist="${runlist} ${rp_x}" + pop_list_item ${rp_x} ${initlist} + initlist=${tmppop} + i=$((${i} - 1)) + fi + done + if [ ${i} -eq ${oldi} ]; then + panic "PANIC: Circular dependancy. Exiting." + fi + done +} + +call_scripts() +{ + for cs_x in ${runlist}; do + # mkinitramfs verbose output + if [ "${verbose}" = "y" ]; then + echo "Calling hook ${cs_x}" + fi + ${initdir}/${cs_x} + # allow boot scripts to modify exported boot paramaters + if [ -e /conf/param.conf ]; then + . /conf/param.conf + fi + done +} + +run_scripts() +{ + initdir=${1} + [ ! -d ${initdir} ] && return + get_prereqs + reduce_prereqs + call_scripts +} + +# Load custom modules first +load_modules() +{ + if [ -e /conf/modules ]; then + cat /conf/modules | while read m; do + # Skip empty lines + if [ -z "$m" ]; then + continue + fi + # Skip comments - d?ash removes whitespace prefix + com=$(printf "%.1s" "${m}") + if [ "$com" = "#" ]; then + continue + fi + modprobe $m + done + fi +} + +# lilo compatibility +parse_numeric() { + case $1 in + "") + return + ;; + /*) + return + ;; + *:*) + minor=${1#*:} + major=${1%:*} + ;; + [A-Fa-f0-9]*) + value=$(( 0x${1} )) + minor=$(( ${value} % 256 )) + major=$(( ${value} / 256 )) + ;; + *) + return + ;; + esac + + mknod -m 600 /dev/root b ${major} ${minor} + ROOT=/dev/root +} + +configure_networking() +{ + # networking already configured thus bail out + [ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0 + + # support ip options see linux sources Documentation/nfsroot.txt + case ${IPOPTS} in + none|off) + # Do nothing + ;; + ""|on|any) + # Bring up device + ipconfig ${DEVICE} + ;; + dhcp|bootp|rarp|both) + ipconfig -c ${IPOPTS} -d ${DEVICE} + ;; + *) + ipconfig -d $IPOPTS + + # grab device entry from ip option + NEW_DEVICE=${IPOPTS#*:*:*:*:*:*} + if [ "${NEW_DEVICE}" != "${IPOPTS}" ]; then + NEW_DEVICE=${NEW_DEVICE%:*} + else + # wrong parse, possibly only a partial string + NEW_DEVICE= + fi + if [ -n "${NEW_DEVICE}" ]; then + DEVICE="${NEW_DEVICE}" + fi + ;; + esac + + # source ipconfig output + if [ -n "${DEVICE}" ]; then + # source specific bootdevice + . /tmp/net-${DEVICE}.conf + else + # source any interface as not exaclty specified + . /tmp/net-*.conf + fi +} + +# Wait for queued kernel/udev events +wait_for_udev() +{ + [ -x "$(command -v udevadm)" ] && return 0 + udevadm settle ${1:+--timeout=$1} +} |