[openwrt/openwrt] scripts: ipkg-build: simplify uid/gid resolving

LEDE Commits lede-commits at lists.infradead.org
Mon Sep 14 11:19:35 EDT 2020


jow pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/4038c031cbc156d361e80f73dbd88f83b13a4057

commit 4038c031cbc156d361e80f73dbd88f83b13a4057
Author: Jo-Philipp Wich <jo at mein.io>
AuthorDate: Mon Sep 14 16:57:46 2020 +0200

    scripts: ipkg-build: simplify uid/gid resolving
    
    Use the prepared .packageusergroup file to lookup user and group names
    when processing the passed file mode.
    
    Also replace the various subshell/cut invocations with a sequence of
    standard variable interpolations which fixes paths with embedded colons
    as a side-effect.
    
    Signed-off-by: Jo-Philipp Wich <jo at mein.io>
---
 scripts/ipkg-build | 65 ++++++++++++++++++++++++------------------------------
 1 file changed, 29 insertions(+), 36 deletions(-)

diff --git a/scripts/ipkg-build b/scripts/ipkg-build
index c9be18ec47..343aab6caf 100755
--- a/scripts/ipkg-build
+++ b/scripts/ipkg-build
@@ -69,37 +69,23 @@ pkg_appears_sane() {
 }
 
 resolve_file_mode_id() {
-	type="$1"
-	name="$2"
-	position=1
-	if [ "$type" = "group" ]; then
-		position=2
-	fi
-
-	# root is always 0
-	if [ "$name" = "root" ]; then
-		echo 0
-		exit 0
-	fi
-
-	# return numeric names
-	if [ "$name" -eq "$name" 2>/dev/null ]; then
-		echo "$name"
-		exit 0
-	fi
+	local var=$1 type=$2 name=$3 id
+
+	case "$name" in
+		root)
+			id=0
+		;;
+		*[!0-9]*)
+			id=$(sed -ne "s#^$type $name \\([0-9]\\+\\)\\b.*\$#\\1#p" "$TOPDIR/tmp/.packageusergroup" 2>/dev/null)
+		;;
+		*)
+			id=$name
+		;;
+	esac
 
-	ids=$(grep "$name" "$TOPDIR/tmp/userids")
-	for id in $ids; do
-		resolved_name=$(echo "$id" | cut -d ":" -f "$position" | cut -d "=" -f 1)
-		resolved_id=$(echo "$id" | cut -d ":" -f "$position" | cut -d "=" -f 2)
-		if [ "$resolved_name" = "$name" ]; then
-			echo "$resolved_id"
-			exit 0
-		fi
-	done
+	export "$var=$id"
 
-	>&2 echo "No $type ID found for $name"
-	exit 1
+	[ -n "$id" ]
 }
 
 ###
@@ -135,7 +121,7 @@ case $# in
 	;;
 *)
 	echo $usage >&2
-	exit 1 
+	exit 1
 	;;
 esac
 
@@ -175,13 +161,20 @@ for file_mode in $file_modes; do
 	    exit 1
 	    ;;
 	esac
-	path=$(echo "$file_mode" | cut -d ':' -f 1)
-	user=$(echo "$file_mode" | cut -d ':' -f 2)
-	group=$(echo "$file_mode" | cut -d ':' -f 3)
-	mode=$(echo "$file_mode" | cut -d ':' -f 4)
 
-	uid=$(resolve_file_mode_id user "$user")
-	gid=$(resolve_file_mode_id group "$group")
+	mode=${file_mode##*:}; path=${file_mode%:*}
+	group=${path##*:};     path=${path%:*}
+	user=${path##*:};      path=${path%:*}
+
+	if ! resolve_file_mode_id uid user "$user"; then
+		echo "ERROR: unable to resolve uid of $user" >&2
+		exit 1
+	fi
+
+	if ! resolve_file_mode_id gid group "$group"; then
+		echo "ERROR: unable to resolve gid of $group" >&2
+		exit 1
+	fi
 
 	chown "$uid:$gid" "$pkg_dir/$path"
 	chmod  "$mode" "$pkg_dir/$path"



More information about the lede-commits mailing list