diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-09-14 16:57:46 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-09-14 17:11:04 +0200 |
commit | 4038c031cbc156d361e80f73dbd88f83b13a4057 (patch) | |
tree | 073f0bbe8765cb90a72674990a40e530288dbc7e /scripts | |
parent | 7a29e24dbb6643018195f069d9a7249550dc4b47 (diff) | |
download | upstream-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-x | scripts/ipkg-build | 65 |
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" |