[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