git: 1f7afa936480 - main - etcupdate: Gracefully handle SIGINT when building trees.

John Baldwin jhb at FreeBSD.org
Tue Apr 20 20:23:36 UTC 2021


The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=1f7afa9364805a912270c9d6a70dc4a889d47a4e

commit 1f7afa9364805a912270c9d6a70dc4a889d47a4e
Author:     John Baldwin <jhb at FreeBSD.org>
AuthorDate: 2021-04-20 20:22:11 +0000
Commit:     John Baldwin <jhb at FreeBSD.org>
CommitDate: 2021-04-20 20:22:11 +0000

    etcupdate: Gracefully handle SIGINT when building trees.
    
    Run the 'build_tree' function inside of a subshell and trap SIGINT to
    return an error to the caller.  This allows callers to gracefully
    cleanup a partially created tree.
    
    While here, redirect stdout/stderr of the subshell to the log file
    instead of applying redirections individually to each command executed
    while building the tree.
    
    Reviewed by:    imp
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D29844
---
 usr.sbin/etcupdate/etcupdate.sh | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/usr.sbin/etcupdate/etcupdate.sh b/usr.sbin/etcupdate/etcupdate.sh
index 72fa3e9d524d..d0c27805562e 100755
--- a/usr.sbin/etcupdate/etcupdate.sh
+++ b/usr.sbin/etcupdate/etcupdate.sh
@@ -179,17 +179,21 @@ always_install()
 	return 1
 }
 
-# Build a new tree
+# Build a new tree.  This runs inside a subshell to trap SIGINT.
 #
 # $1 - directory to store new tree in
 build_tree()
-{
+(
 	local destdir dir file make
 
 	make="make $MAKE_OPTIONS -DNO_FILEMON"
 
 	log "Building tree at $1 with $make"
-	mkdir -p $1/usr/obj >&3 2>&1
+
+	exec >&3 2>&1
+	trap 'return 1' INT
+
+	mkdir -p $1/usr/obj
 	destdir=`realpath $1`
 
 	if [ -n "$preworld" ]; then
@@ -197,34 +201,33 @@ build_tree()
 		# crucial to installworld.
 		for file in $PREWORLD_FILES; do
 			name=$(basename $file)
-			mkdir -p $1/etc >&3 2>&1 || return 1
+			mkdir -p $1/etc || return 1
 			cp -p $SRCDIR/$file $1/etc/$name || return 1
 		done
 	elif ! [ -n "$nobuild" ]; then
 		(cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
     MAKEOBJDIRPREFIX=$destdir/usr/obj $make _obj SUBDIR_OVERRIDE=etc &&
     MAKEOBJDIRPREFIX=$destdir/usr/obj $make everything SUBDIR_OVERRIDE=etc &&
-    MAKEOBJDIRPREFIX=$destdir/usr/obj $make DESTDIR=$destdir distribution) \
-		    >&3 2>&1 || return 1
+    MAKEOBJDIRPREFIX=$destdir/usr/obj $make DESTDIR=$destdir distribution) || \
+		    return 1
 	else
 		(cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
-		    $make DESTDIR=$destdir distribution) >&3 2>&1 || return 1
+		    $make DESTDIR=$destdir distribution) || return 1
 	fi
-	chflags -R noschg $1 >&3 2>&1 || return 1
-	rm -rf $1/usr/obj >&3 2>&1 || return 1
+	chflags -R noschg $1 || return 1
+	rm -rf $1/usr/obj || return 1
 
 	# Purge auto-generated files.  Only the source files need to
 	# be updated after which these files are regenerated.
-	rm -f $1/etc/*.db $1/etc/passwd $1/var/db/services.db >&3 2>&1 || \
-	    return 1
+	rm -f $1/etc/*.db $1/etc/passwd $1/var/db/services.db || return 1
 
 	# Remove empty files.  These just clutter the output of 'diff'.
-	find $1 -type f -size 0 -delete >&3 2>&1 || return 1
+	find $1 -type f -size 0 -delete || return 1
 
 	# Trim empty directories.
-	find -d $1 -type d -empty -delete >&3 2>&1 || return 1
+	find -d $1 -type d -empty -delete || return 1
 	return 0
-}
+)
 
 # Generate a new tree.  If tarball is set, then the tree is
 # extracted from the tarball.  Otherwise the tree is built from a


More information about the dev-commits-src-all mailing list