Chromium Code Reviews| Index: lib/cros_image_common.sh |
| diff --git a/lib/cros_image_common.sh b/lib/cros_image_common.sh |
| index 0ad9d0bbcd47a517859f14bd1750e30ec765ca54..3021f0aa27426f8201c33d6cead5beea0faa27c8 100644 |
| --- a/lib/cros_image_common.sh |
| +++ b/lib/cros_image_common.sh |
| @@ -8,19 +8,20 @@ |
| # especially for being redistributed into platforms without complete Chromium OS |
| # developing environment. |
| -# Check if given command is available in current system |
| -has_command() { |
| +# Checks if given command is available in current system |
| +image_has_command() { |
| type "$1" >/dev/null 2>&1 |
| } |
| -err_die() { |
| +# Prints error message and exit as 1 (error) |
| +image_die() { |
| echo "ERROR: $@" >&2 |
| exit 1 |
| } |
| -# Finds the best gzip compressor and invoke it. |
| -gzip_compress() { |
| - if has_command pigz; then |
| +# Finds the best gzip compressor and invoke it |
| +image_gzip_compress() { |
| + if image_has_command pigz; then |
| # echo " ** Using parallel gzip **" >&2 |
| # Tested with -b 32, 64, 128(default), 256, 1024, 16384, and -b 32 (max |
| # window size of Deflate) seems to be the best in output size. |
| @@ -30,43 +31,56 @@ gzip_compress() { |
| fi |
| } |
| +# Finds the best bzip2 compressor and invoke it |
| +image_bzip2_compress() { |
| + if image_has_command pbzip2; then |
| + pbzip2 "$@" |
| + else |
| + bzip2 "$@" |
| + fi |
| +} |
| + |
| # Finds if current system has tools for part_* commands |
| -has_part_tools() { |
| - has_command cgpt || has_command parted |
| +image_has_part_tools() { |
| + image_has_command cgpt || image_has_command parted |
| } |
| # Finds the best partition tool and print partition offset |
| -part_offset() { |
| +image_part_offset() { |
| local file="$1" |
| local partno="$2" |
| + local unpack_file="$(dirname "$file")/unpack_partitions.sh" |
| - if has_command cgpt; then |
| + if image_has_command cgpt; then |
| cgpt show -b -i "$partno" "$file" |
|
Nick Sanders
2010/11/18 05:12:08
Can you add parted to the chroot, and just use tha
Hung-Te
2010/11/18 05:49:31
cgpt is always in chroot. I made this because this
Nick Sanders
2010/11/18 06:18:35
Err, what I was saying is that we can easily ensur
Hung-Te
2010/11/18 06:46:25
Thanks for the suggestion. It's a good idea to hav
|
| - elif has_command parted; then |
| - parted -m "$file" unit s print | |
| - grep "^$partno:" | cut -d ':' -f 2 | sed 's/s$//' |
| + elif image_has_command parted; then |
| + parted -m "$file" unit s print | awk -F ':' "/^$partno:/ { print int(\$2) }" |
| + elif [ -f "$unpack_file" ]; then |
| + awk "/ $partno *Label:/ { print \$2 }" "$unpack_file" |
| else |
| exit 1 |
| fi |
| } |
| # Finds the best partition tool and print partition size |
| -part_size() { |
| +image_part_size() { |
| local file="$1" |
| local partno="$2" |
| + local unpack_file="$(dirname "$file")/unpack_partitions.sh" |
| - if has_command cgpt; then |
| + if image_has_command cgpt; then |
| cgpt show -s -i "$partno" "$file" |
| - elif has_command parted; then |
| - parted -m "$file" unit s print | |
| - grep "^$partno:" | cut -d ':' -f 4 | sed 's/s$//' |
| + elif image_has_command parted; then |
| + parted -m "$file" unit s print | awk -F ':' "/^$partno:/ { print int(\$4) }" |
| + elif [ -s "$unpack_file" ]; then |
| + awk "/ $partno *Label:/ { print \$3 }" "$unpack_file" |
| else |
| exit 1 |
| fi |
| } |
| # Dumps a file by given offset and size (in sectors) |
| -dump_partial_file() { |
| +image_dump_partial_file() { |
| local file="$1" |
| local offset="$2" |
| local sectors="$3" |
| @@ -82,10 +96,10 @@ dump_partial_file() { |
| bs=$((bs * buffer_ratio)) |
| fi |
| - if has_command pv; then |
| + if image_has_command pv; then |
| dd if="$file" bs=$bs skip="$offset" count="$sectors" \ |
| oflag=sync status=noxfer 2>/dev/null | |
| - pv -ptreb -B 4m -s $((sectors * $bs)) |
| + pv -ptreb -B $bs -s $((sectors * bs)) |
| else |
| dd if="$file" bs=$bs skip="$offset" count="$sectors" \ |
| oflag=sync status=noxfer 2>/dev/null |
| @@ -93,14 +107,62 @@ dump_partial_file() { |
| } |
| # Dumps a specific partition from given image file |
| -dump_partition() { |
| +image_dump_partition() { |
| + local file="$1" |
| + local part_num="$2" |
| + local offset="$(image_part_offset "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + local size="$(image_part_size "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + |
| + image_dump_partial_file "$file" "$offset" "$size" |
| +} |
| + |
| +# Maps a specific partition from given image file to a loop device |
| +image_map_partition() { |
| + local file="$1" |
| + local part_num="$2" |
| + local offset="$(image_part_offset "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + local size="$(image_part_size "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + |
| + losetup --offset $((offset * 512)) --sizelimit=$((size * 512)) \ |
| + -f --show "$file" |
| +} |
| + |
| +# Unmaps a loop device created by image_map_partition |
| +image_unmap_partition() { |
| + local map_point="$1" |
| + |
| + losetup -d "$map_point" |
| +} |
| + |
| +# Mounts a specific partition inside a given image file |
| +image_mount_partition() { |
| local file="$1" |
| local part_num="$2" |
| - local offset="$(part_offset "$file" "$part_num")" || |
| - err_die "failed to dump partition #$part_num from: $file" |
| - local size="$(part_size "$file" "$part_num")" || |
| - err_die "failed to dump partition #$part_num from: $file" |
| + local mount_point="$3" |
| + local mount_opt="$4" |
| + local offset="$(image_part_offset "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + local size="$(image_part_size "$file" "$part_num")" || |
| + image_die "failed to find partition #$part_num from: $file" |
| + |
| + if [ -z "$mount_opt" ]; then |
| + # by default, mount as read-only. |
| + mount_opt=",ro" |
| + fi |
| - dump_partial_file "$file" "$offset" "$size" |
| + mount \ |
| + -o "loop,offset=$((offset * 512)),sizelimit=$((size * 512)),$mount_opt" \ |
| + "$file" \ |
| + "$mount_point" |
| } |
| +# Unmounts a partition mount point by mount_partition |
| +image_umount_partition() { |
| + local mount_point="$1" |
| + |
| + umount -d "$mount_point" |
| +} |