[projects/rc-scripts] move inner body of daemon() into separate func

glen glen at pld-linux.org
Sat Oct 10 01:32:46 CEST 2015


commit cc8e66de2ffe44e027d218d0aceded0595e3955f
Author: Elan Ruusamäe <glen at delfi.ee>
Date:   Thu Oct 8 17:46:41 2015 +0300

    move inner body of daemon() into separate func
    
    this will ease understanding it's logic and avoid bugs

 lib/functions | 160 +++++++++++++++++++++++++++++-----------------------------
 1 file changed, 81 insertions(+), 79 deletions(-)
---
diff --git a/lib/functions b/lib/functions
index 8a6d9c9..ecd8e8d 100644
--- a/lib/functions
+++ b/lib/functions
@@ -628,16 +628,92 @@ _daemon_set_ulimits() {
 	done
 }
 
+# inner function used by daemon()
+# do not call this directly, as it expects variables being inherited
+# it expects options parsed by daemon() and command to be executed in "$@"
+_daemon_exec() {
+	local prog=""
+	umask ${SERVICE_UMASK:-$DEFAULT_SERVICE_UMASK};
+	export USER=root HOME=/tmp TMPDIR=/tmp
+
+	nice=${nice:-$DEFAULT_SERVICE_RUN_NICE_LEVEL}
+	nice=${nice:-0}
+
+	# make nice level absolute, not to be dependant of nice level of shell where service started
+	nice=$(($nice - $(nice)))
+
+	if [ "$closefds" = 1 ]; then
+		exec 1>&-
+		exec 2>&-
+		exec 0<&-
+	elif [ "$redirfds" = 1 ]; then
+		exec 1>/dev/null
+		exec 2>/dev/null
+		exec 0</dev/null
+	else
+		exec 2>&1
+		exec 0</dev/null
+	fi
+
+	if is_no "$RC_LOGGING"; then
+		prog=$1; shift
+		if [ ! -x $prog ]; then
+			logger -t rc-scripts -p daemon.debug "daemon: Searching PATH for $prog, consider using full path in initscript"
+			local a o=$IFS
+			IFS=:
+			for a in $PATH; do
+				if [ -x $a/$prog ]; then
+					prog=$a/$prog
+					break
+				fi
+			done
+			IFS=$o
+		fi
+		set -- "$prog" "$@"
+
+		# use setsid to detach from terminal,
+		# needs pidfile or ssd would check setsid program instead of real program
+		if [ "$pidfile" ]; then
+			set -- /usr/bin/setsid "$@"
+		fi
+
+		prog=$1; shift
+		/sbin/start-stop-daemon -q --start \
+			--nicelevel $nice \
+			${pidfile:+--pidfile $pidfile} \
+			${makepid:+--make-pidfile} \
+			${user:+--chuid $user} \
+			${chdir:+--chdir "$chdir"} \
+			${fork:+--background} \
+			${SERVICE_DROPCAPS:+--dropcap $SERVICE_DROPCAPS} \
+			--exec "$prog" \
+			-- "$@"
+	else
+		if [ -n "$user" -a "$user" != "root" ]; then
+			prog="/bin/su $user -s /bin/sh -c \""
+		fi
+		if [ "$fork" = "1" ]; then
+			prog="/usr/bin/setsid ${prog:-sh -c \"}"
+		fi
+		# If command to execute ends with quotation mark, add remaining
+		# arguments and close quotation.
+		if [ "$prog" != "${prog%\"}" ]; then
+			prog="$prog $*$end\""
+		else
+			prog="$prog $*$end"
+		fi
+
+		nice -n $nice initlog -c "$prog" 2>&1 </dev/null
+	fi
+}
+
 # A function to start a program (now it's useful on read-only filesystem too)
 daemon() {
-	local errors="" prog="" end="" waitname="" waittime=""
+	local errors="" end="" waitname="" waittime=""
 	local exit_code=0
 	local nice=$SERVICE_RUN_NICE_LEVEL
 	local fork user closefds redirfds pidfile makepid chdir=/
 
-	# NOTE: if you wonder how the shellish (by syntax) $prog works in ssd mode,
-	# then the answer is: it totally ignores $prog and uses "$@" itself.
-
 	while [ $# -gt 0 ]; do
 		case $1 in
 		'')
@@ -708,81 +784,7 @@ daemon() {
 	busy
 	cd $chdir
 	[ -n "$SERVICE_CPUSET" ] && is_yes "$CPUSETS" && echo $$ > "/dev/cpuset/${SERVICE_CPUSET}/tasks"
-	if errors=$(
-		umask ${SERVICE_UMASK:-$DEFAULT_SERVICE_UMASK};
-		export USER=root HOME=/tmp TMPDIR=/tmp
-
-		nice=${nice:-$DEFAULT_SERVICE_RUN_NICE_LEVEL}
-		nice=${nice:-0}
-
-		# make nice level absolute, not to be dependant of nice level of shell where service started
-		nice=$(($nice - $(nice)))
-
-		if [ "$closefds" = 1 ]; then
-			exec 1>&-
-			exec 2>&-
-			exec 0<&-
-		elif [ "$redirfds" = 1 ]; then
-			exec 1>/dev/null
-			exec 2>/dev/null
-			exec 0</dev/null
-		else
-			exec 2>&1
-			exec 0</dev/null
-		fi
-
-		if is_no "$RC_LOGGING"; then
-			prog=$1; shift
-			if [ ! -x $prog ]; then
-				logger -t rc-scripts -p daemon.debug "daemon: Searching PATH for $prog, consider using full path in initscript"
-				local a o=$IFS
-				IFS=:
-				for a in $PATH; do
-					if [ -x $a/$prog ]; then
-						prog=$a/$prog
-						break
-					fi
-				done
-				IFS=$o
-			fi
-			set -- "$prog" "$@"
-
-			# use setsid to detach from terminal,
-			# needs pidfile or ssd would check setsid program instead of real program
-			if [ "$pidfile" ]; then
-				set -- /usr/bin/setsid "$@"
-			fi
-
-			prog=$1; shift
-			/sbin/start-stop-daemon -q --start \
-				--nicelevel $nice \
-				${pidfile:+--pidfile $pidfile} \
-				${makepid:+--make-pidfile} \
-				${user:+--chuid $user} \
-				${chdir:+--chdir "$chdir"} \
-				${fork:+--background} \
-				${SERVICE_DROPCAPS:+--dropcap $SERVICE_DROPCAPS} \
-				--exec "$prog" \
-				-- "$@"
-		else
-			if [ -n "$user" -a "$user" != "root" ]; then
-				prog="/bin/su $user -s /bin/sh -c \""
-			fi
-			if [ "$fork" = "1" ]; then
-				prog="/usr/bin/setsid ${prog:-sh -c \"}"
-			fi
-			# If command to execute ends with quotation mark, add remaining
-			# arguments and close quotation.
-			if [ "$prog" != "${prog%\"}" ]; then
-				prog="$prog $*$end\""
-			else
-				prog="$prog $*$end"
-			fi
-
-			nice -n $nice initlog -c "$prog" 2>&1 </dev/null
-		fi
-		); then
-
+	if errors=$(_daemon_exec "$@"); then
 		# wait for process (or pidfile) to be created
 		if [ "$waittime" -gt 0 ]; then
 			# waitname can be empty, as if pidfile is in use, it is not relevant
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/rc-scripts.git/commitdiff/1a0c02d0983a76562fa875a1bab45ece246b26a6



More information about the pld-cvs-commit mailing list