#!/bin/bash # Functions rc.rescue() { exec "${cfg_rc_rescue_shell:-"$SHELL"}"; } rc.motd() { [[ -f "/etc/rc.motd" ]] && { while read; do printf "$REPLY" done < "/etc/rc.motd" } return 0 } rc.mount() { local fs local fs_type local mountpoint local mount_options fs="$1" fs_type="$2" mountpoint="$3" mount_options="${4:-defaults}" mount "$1" -n -t "$2" -o "$mount_options" "$3" } rc.mount_misc() { mountpoint -q /proc || { rc.mount proc proc /proc; } mountpoint -q /dev || { rc.mount dev devtmpfs /dev; } } rc.parse_cmdline() { [[ -f "/proc/cmdline" ]] && { boot_cmdline=( $(</proc/cmdline) ) } for i in "${boot_cmdline[@]}"; do case "$i" in init.single) rc.rescue;; esac done } rc.services_start() { local service_name start_mode for i in "${cfg_services[@]}"; do unset service_name [[ "$i" =~ ^@ ]] && { service_name="${i##*@}" start_mode='bg' } [[ "$i" =~ ^% ]] && { service_name="${i##*%}" start_mode='watch' } service_name=${service_name:-$i} start_mode="${start_mode:-start}" case "$start_mode" in bg) service "$service_name" start &;; start) service "$service_name" start;; *) echo "Mode $start_mode not supported";; esac done } rc.services_stop() { echo "Stopping services..." local service_name for i in "${cfg_services[@]}"; do service_name="${i##*@}"; service_name="${service_name##*%}" service "$service_name" stop &>/dev/null & done wait } rc.stop_everything() { echo "Politely asking all processes to shut down..." killall5 -15; sleep 3 echo "Killing the remaning ones..." killall5 -9 } rc.unmount_everything() { echo "Unmounting filesystems..." umount -a } rc.remount_root() { echo "Remounting / read-only..." mount / -o remount,ro } rc.boot() { rc.mount_misc rc.hostname rc.modules rc.services_start wait rc.motd } rc.halt() { case "$action" in poweroff|shutdown) echo 'o' > /proc/sysrq-trigger;; halt) :;; reboot|*) echo 'b' > /proc/sysrq-trigger;; esac } rc.shutdown() { rc.services_stop rc.stop_everything rc.unmount_everything rc.remount_root echo "Halt complete." rc.halt } rc.hostname() { [[ "$cfg_hostname" ]] && { hostname "$cfg_hostname"; } } rc.modules() { for i in "${cfg_modules[@]}"; do modprobe "$i" done } rc.main() { source "/etc/rc.conf" action="${1:-boot}" case "$action" in boot) echo "Welcome to `uname -rs`" rc.boot ;; poweroff|reboot|shutdown) rc.shutdown rc.halt ;; esac } # Main part rc.main "$@"