| Index: lib/cros_image_common.sh | 
| diff --git a/lib/cros_image_common.sh b/lib/cros_image_common.sh | 
| index 0ad9d0bbcd47a517859f14bd1750e30ec765ca54..86bba755047e612d69916d14876d6df1a6bb0f0e 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,58 @@ 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 | 
| +  # TODO parted is available on most Linux so we may deprecate other code path | 
| +  if image_has_command cgpt; then | 
| cgpt show -b -i "$partno" "$file" | 
| -  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 | 
| +  # TODO parted is available on most Linux so we may deprecate other code path | 
| +  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 +98,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 +109,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" | 
| +} | 
|  |