X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/05adaa9794e41d02870a74a1ed7ba58cc59b9286..c51520101bffb72d572c8aa199453b973a021552:/package/base-files/files/etc/rc.common diff --git a/package/base-files/files/etc/rc.common b/package/base-files/files/etc/rc.common index 7180b0f7f..ec1bb16f4 100755 --- a/package/base-files/files/etc/rc.common +++ b/package/base-files/files/etc/rc.common @@ -1,9 +1,93 @@ #!/bin/sh -# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2006-2011 OpenWrt.org . $IPKG_INSTROOT/etc/functions.sh -START=50 +initscript=$1 +action=${2:-help} +shift 2 + +# +# service: simple wrapper around start-stop-daemon +# +# Usage: service ACTION EXEC ARGS... +# +# Action: +# -S,--start start EXEC, passing it ARGS as its arguments +# -K,--stop stop EXEC (send it a $SERVICE_SIG_STOP signal) +# -R,--reload reload EXEC (send it a $SERVICE_SIG_RELOAD signal) +# +# Environment variables used: +# SERVICE_DAEMONIZE run EXEC in background +# SERVICE_WRITE_PID create a pid file and use it +# SERVICE_USE_PID assume EXEC creates its own pid file and use it +# SERVICE_PID_FILE pid file to use (default to /var/run/EXEC.pid) +# SERVICE_SIG_RELOAD signal used for reloading +# SERVICE_SIG_STOP signal used for stopping +# SERVICE_UID user EXEC should be run as +# SERVICE_GID group EXEC should be run as +# +# SERVICE_DEBUG don't do anything, but show what would be done +# SERVICE_QUIET don't print anything +# + +SERVICE_QUIET=1 +SERVICE_SIG_RELOAD="HUP" +SERVICE_SIG_STOP="TERM" + +service() { + local ssd + local ssd_pid_file + local ssd_sig + local ssd_start + ssd="${SERVICE_DEBUG:+echo }start-stop-daemon${SERVICE_QUIET:+ -q}" + case "$1" in + -S|--start|start) + ssd="$ssd -S" + ssd_start=1 + ;; + -K|--stop|stop) + ssd="$ssd -K" + ssd_sig="$SERVICE_SIG_STOP" + ;; + -R|--reload|reload) + ssd="$ssd -K" + ssd_sig="$SERVICE_SIG_RELOAD" + ;; + *) + echo "ssd: unknow action '$1'" 1>&2 + return 1 + esac + shift + if [ -z "$1" ]; then + echo "ssd: missing arguments" 1>&2 + return 1 + fi + ssd="$ssd -x $1" + if [ -n "$SERVICE_PID_FILE$SERVICE_USE_PID$SERVICE_WRITE_PID" ]; then + ssd="$ssd -p ${SERVICE_PID_FILE:-/var/run/${1##*/}.pid}" + fi + ssd="$ssd${SERVICE_UID:+ -c $SERVICE_UID${SERVICE_GID:+:$SERVICE_GID}}" + if [ -n "$ssd_start" ]; then + ssd="$ssd${SERVICE_DAEMONIZE:+ -b}${SERVICE_WRITE_PID:+ -m}" + else + ssd="$ssd${ssd_sig:+ -s $ssd_sig}" + fi + shift + $ssd${1:+ -- "$@"} +} + +service_start() { + service -S "$@" +} + +service_stop() { + service -K "$@" +} + +service_reload() { + service -R "$@" +} start() { return 0 @@ -18,27 +102,39 @@ reload() { } restart() { - stop - start + trap '' TERM + stop "$@" + start "$@" } boot() { - start + start "$@" } shutdown() { - return 0 + stop } disable() { name="$(basename "${initscript}")" rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name + rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name } enable() { name="$(basename "${initscript}")" disable - ln -s "/etc/init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" + [ -n "$START" -o -n "$STOP" ] || { + echo "/etc/init.d/$name does not have a START or STOP value" + return 1 + } + [ "$START" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" + [ "$STOP" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}" +} + +enabled() { + name="$(basename "${initscript}")" + [ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ] } depends() { @@ -60,24 +156,9 @@ $EXTRA_HELP EOF } -initscript="$1" -action="$2" - . "$initscript" -cmds= -for cmd in $EXTRA_COMMANDS; do - cmds="${cmds:+$cmds$N}$cmd) $cmd;;" -done -eval "case \"\$action\" in - start) start;; - stop) stop;; - reload) reload || restart;; - restart) restart;; - boot) boot;; - shutdown) shutdown;; - enable) enable;; - disable) disable;; - $cmds - *) help;; -esac" +ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}" +list_contains ALL_COMMANDS "$action" || action=help +[ "$action" = "reload" ] && action='eval reload "$@" || restart "$@" && :' +$action "$@"