Index: image_common.sh |
diff --git a/image_common.sh b/image_common.sh |
new file mode 100644 |
index 0000000000000000000000000000000000000000..59cbc8446b97668d31a85ca5f99c683b9fa7dbb6 |
--- /dev/null |
+++ b/image_common.sh |
@@ -0,0 +1,106 @@ |
+#!/bin/bash |
+ |
+# Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# This script contains common utility function for dealing with image, |
+# especially for being redistributed into platforms without complete Chromium OS |
+# development environment. |
+ |
+# Check if given command is available in current system |
+has_command() { |
+ type "$1" >/dev/null 2>&1 |
+} |
+ |
+err_die() { |
+ echo "ERROR: $@" >&2 |
+ exit 1 |
+} |
+ |
+# Finds the best gzip compressor and invoke it. |
+gzip_compress() { |
+ if 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. |
+ pigz -b 32 "$@" |
+ else |
+ gzip "$@" |
+ fi |
+} |
+ |
+# Finds if current system has tools for part_* commands |
+has_part_tools() { |
+ has_command cgpt || has_command parted |
+} |
+ |
+# Finds the best partition tool and print partition offset |
+part_offset() { |
+ local file="$1" |
+ local partno="$2" |
+ |
+ if 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$//' |
+ else |
+ exit 1 |
+ fi |
+} |
+ |
+# Finds the best partition tool and print partition size |
+part_size() { |
+ local file="$1" |
+ local partno="$2" |
+ |
+ if 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$//' |
+ else |
+ exit 1 |
+ fi |
+} |
+ |
+# Dumps a file by given offset and size (in sectors) |
+dump_partial_file() { |
+ local file="$1" |
+ local offset="$2" |
+ local sectors="$3" |
+ local bs=512 |
+ |
+ # Try to use larger buffer if offset/size can be re-aligned. |
+ # 2M / 512 = 4096 |
+ local buffer_ratio=4096 |
+ if [ $((offset % buffer_ratio)) -eq 0 -a \ |
+ $((sectors % buffer_ratio)) -eq 0 ]; then |
+ offset=$((offset / buffer_ratio)) |
+ sectors=$((sectors / buffer_ratio)) |
+ bs=$((bs * buffer_ratio)) |
+ fi |
+ |
+ if 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)) |
+ else |
+ dd if="$file" bs=$bs skip="$offset" count="$sectors" \ |
+ oflag=sync status=noxfer 2>/dev/null |
+ fi |
+} |
+ |
+# Dumps a specific partition from given image file |
+dump_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" |
+ |
+ dump_partial_file "$file" "$offset" "$size" |
+} |
+ |