aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-09-14 16:57:46 +0200
committerJo-Philipp Wich <jo@mein.io>2020-09-14 17:11:04 +0200
commit4038c031cbc156d361e80f73dbd88f83b13a4057 (patch)
tree073f0bbe8765cb90a72674990a40e530288dbc7e /scripts
parent7a29e24dbb6643018195f069d9a7249550dc4b47 (diff)
downloadupstream-4038c031cbc156d361e80f73dbd88f83b13a4057.tar.gz
upstream-4038c031cbc156d361e80f73dbd88f83b13a4057.tar.bz2
upstream-4038c031cbc156d361e80f73dbd88f83b13a4057.zip
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@mein.io>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/ipkg-build65
1 files 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"