}
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" ]
}
###
;;
*)
echo $usage >&2
- exit 1
+ exit 1
;;
esac
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"