X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/f90cb20b9a2c4e4c5d8f3af569264726fb6ddcf8..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 6b3c213a1..ec1bb16f4 100755 --- a/package/base-files/files/etc/rc.common +++ b/package/base-files/files/etc/rc.common @@ -1,8 +1,94 @@ #!/bin/sh -# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2006-2011 OpenWrt.org . $IPKG_INSTROOT/etc/functions.sh +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 } @@ -26,7 +112,7 @@ boot() { } shutdown() { - return 0 + stop } disable() { @@ -38,8 +124,12 @@ disable() { enable() { name="$(basename "${initscript}")" disable - [ "$START" ] && ln -s "/etc/init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" - [ "$STOP" ] && ln -s "/etc/init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[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() { @@ -66,27 +156,9 @@ $EXTRA_HELP EOF } -initscript="$1" -[ "$#" -ge 1 ] && shift -action="$1" -[ "$#" -ge 1 ] && shift - . "$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 \"\$@\";; - enabled) enabled \"\$@\";; - 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 "$@"