scripts: ipkg-build: simplify uid/gid resolving
authorJo-Philipp Wich <jo@mein.io>
Mon, 14 Sep 2020 14:57:46 +0000 (16:57 +0200)
committerJo-Philipp Wich <jo@mein.io>
Mon, 14 Sep 2020 15:11:04 +0000 (17:11 +0200)
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>
scripts/ipkg-build

index c9be18ec47f4f28d60cbf48f7319feaaec3e64f0..343aab6caf312161712235362f345bc550860911 100755 (executable)
@@ -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"