From 4038c031cbc156d361e80f73dbd88f83b13a4057 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 14 Sep 2020 16:57:46 +0200 Subject: [PATCH] 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 --- 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" -- 2.30.2