diff options
| author | Roy Marples <roy@marples.name> | 2008-04-18 23:00:43 +0000 | 
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-04-18 23:00:43 +0000 | 
| commit | e96347523f7bfa7da55c34c34af6dcdedd939ba9 (patch) | |
| tree | 181b118e8ad7640d6c6ffe33263d401657b8b3d1 /sh | |
| parent | f0aacec02eb04f1843cc5c729fd5510c2342660c (diff) | |
| download | openrc-e96347523f7bfa7da55c34c34af6dcdedd939ba9.tar.xz | |
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.
Diffstat (limited to 'sh')
| -rw-r--r-- | sh/functions.sh.in | 9 | ||||
| -rw-r--r-- | sh/net.sh.in | 30 | ||||
| -rw-r--r-- | sh/runscript.sh.in | 10 | 
3 files changed, 29 insertions, 20 deletions
diff --git a/sh/functions.sh.in b/sh/functions.sh.in index 57917ed3..8b7356aa 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 8b03affc..2e913583 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 4492888b..a45e41d1 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  | 
