From e96347523f7bfa7da55c34c34af6dcdedd939ba9 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 18 Apr 2008 23:00:43 +0000 Subject: We should check type output to ensure that we're really calling a shell function and not some badly named binary like stop from boinc, Gentoo #218063. --- sh/functions.sh.in | 9 +++++++++ sh/net.sh.in | 30 +++++++++++++++--------------- sh/runscript.sh.in | 10 +++++----- 3 files changed, 29 insertions(+), 20 deletions(-) (limited to 'sh') diff --git a/sh/functions.sh.in b/sh/functions.sh.in index 57917ed..8b7356a 100644 --- a/sh/functions.sh.in +++ b/sh/functions.sh.in @@ -20,6 +20,15 @@ eoutdent() return 0 } +is_function() +{ + if [ -n "${BASH_VERSION}" ]; then + [ "$(type -t "$1")" = "function" ] + else + [ "$(type "$1" 2>/dev/null)" = "$1 is a shell function" ] + fi +} + yesno() { [ -z "$1" ] && return 1 diff --git a/sh/net.sh.in b/sh/net.sh.in index 8b03aff..2e91358 100644 --- a/sh/net.sh.in +++ b/sh/net.sh.in @@ -28,7 +28,7 @@ depend() *) after net.lo net.lo0;; esac - if type depend_${IFVAR} >/dev/null 2>&1; then + if is_function depend_${IFVAR}; then depend_${IFVAR} fi @@ -344,7 +344,7 @@ _load_modules() # Wrap our provides local f= for f in pre_start start post_start; do - eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }" + eval "${provides}_${f}() { is_function ${mod}_${f} || return 0; ${mod}_${f} \"\$@\"; }" done eval module_${mod}_provides="${provides}" @@ -358,7 +358,7 @@ _load_modules() eval x=\$module_${mod}_provides [ -z "${x}" ] && continue for f in pre_start start post_start; do - eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }" + eval "${x}_${f}() { is_function ${mod}_${f} || return 0; ${mod}_${f} \"\$@\"; }" done eval module_${x}_providedby="${mod}" ;; @@ -462,7 +462,7 @@ start() # We up the iface twice if we have a preup to ensure it's up if # available in preup and afterwards incase the user inadvertently # brings it down - if type preup >/dev/null 2>&1; then + if is_function preup; then _up 2>/dev/null ebegin "Running preup" eindent @@ -473,7 +473,7 @@ start() _up 2>/dev/null for module in ${MODULES}; do - if type "${module}_pre_start" >/dev/null 2>&1; then + if is_function "${module}_pre_start"; then ${module}_pre_start || exit $? fi done @@ -522,7 +522,7 @@ start() null) :;; [0-9]*|*:*) _add_address ${config};; *) - if type "${config}_start" >/dev/null 2>&1; then + if is_function "${config}_start"; then "${config}"_start else eerror "nothing provides \`${config}'" @@ -547,7 +547,7 @@ start() done if ! ${oneworked}; then - if type failup >/dev/null 2>&1; then + if is_function failup; then ebegin "Running failup" eindent failup @@ -600,12 +600,12 @@ ${routes}" fi for module in ${MODULES}; do - if type "${module}_post_start" >/dev/null 2>&1; then + if is_function "${module}_post_start"; then ${module}_post_start || exit $? fi done - if type postup >/dev/null 2>&1; then + if is_function postup; then ebegin "Running postup" eindent postup @@ -628,7 +628,7 @@ stop() _load_modules false fi - if type predown >/dev/null 2>&1; then + if is_function predown; then ebegin "Running predown" eindent predown || return 1 @@ -641,24 +641,24 @@ stop() fi for module in ${MODULES}; do - if type "${module}_pre_stop" >/dev/null 2>&1; then + if is_function "${module}_pre_stop"; then ${module}_pre_stop || exit $? fi done for module in ${MODULES}; do - if type "${module}_stop" >/dev/null 2>&1; then + if is_function "${module}_stop"; then ${module}_stop fi done # Only delete addresses for non PPP interfaces - if ! type is_ppp >/dev/null 2>&1 || ! is_ppp; then + if ! is_function is_ppp || ! is_ppp; then _delete_addresses "${IFACE}" fi for module in ${MODULES}; do - if type "${module}_post_stop" >/dev/null 2>&1; then + if is_function "${module}_post_stop"; then ${module}_post_stop fi done @@ -669,7 +669,7 @@ stop() type resolvconf >/dev/null 2>&1 && resolvconf -d "${IFACE}" 2>/dev/null - if type postdown >/dev/null 2>&1; then + if is_function postdown; then ebegin "Running postdown" eindent postdown diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in index 4492888..a45e41d 100644 --- a/sh/runscript.sh.in +++ b/sh/runscript.sh.in @@ -94,7 +94,7 @@ unset _f # If we have a default command then supply a default start function if [ -n "${command}" ]; then - if ! type start >/dev/null 2>&1; then + if ! is_function start; then start() { local _background= ebegin "Starting ${name:-${RC_SVCNAME}}" @@ -126,7 +126,7 @@ fi # If we have a default command, procname or pidfile then supply a default stop # function if [ -n "${command}" -o -n "${procname}" -o -n "${pidfile}" ]; then - if ! type stop >/dev/null 2>&1; then + if ! is_function stop; then stop() { ebegin "Stopping ${name:-${RC_SVCNAME}}" start-stop-daemon --stop \ @@ -143,7 +143,7 @@ while [ -n "$1" ]; do for _cmd in describe start stop ${extra_commands:-${opts}} \ ${extra_started_commands}; do if [ "${_cmd}" = "$1" ]; then - if type "$1" >/dev/null 2>&1; then + if is_function "$1"; then # If we're in the background, we may wish to # fake some commands. We do this so we can # "start" ourselves from inactive which then @@ -168,11 +168,11 @@ while [ -n "$1" ]; do fi done unset _cmd - if type "$1"_pre >/dev/null 2>&1; then + if is_function "$1"_pre >/dev/null 2>&1; then "$1"_pre || exit $? fi "$1" || exit $? - if type "$1"_post >/dev/null 2>&1; then + if is_function "$1"_post >/dev/null 2>&1; then "$1"_post || exit $? fi shift -- cgit v1.2.3