summaryrefslogtreecommitdiffstats
path: root/system-build/functions/losetup.sh
diff options
context:
space:
mode:
Diffstat (limited to 'system-build/functions/losetup.sh')
-rwxr-xr-xsystem-build/functions/losetup.sh119
1 files changed, 119 insertions, 0 deletions
diff --git a/system-build/functions/losetup.sh b/system-build/functions/losetup.sh
new file mode 100755
index 0000000..0346ff6
--- /dev/null
+++ b/system-build/functions/losetup.sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+## live-build(7) - System Build Scripts
+## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch>
+##
+## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
+## This is free software, and you are welcome to redistribute it
+## under certain conditions; see COPYING for details.
+
+Lodetach ()
+{
+ DEVICE="${1}"
+ ATTEMPT="${2:-1}"
+
+ if [ "${ATTEMPT}" -gt 3 ]
+ then
+ Echo_error "Failed to detach loop device '${DEVICE}'."
+ exit 1
+ fi
+
+ # Changes to block devices result in uevents which trigger rules which in
+ # turn access the loop device (ex. udisks-part-id, blkid) which can cause
+ # a race condition. We call 'udevadm settle' to help avoid this.
+ if [ -x "$(which udevadm 2>/dev/null)" ]
+ then
+ udevadm settle
+ fi
+
+ # Loop back devices aren't the most reliable when it comes to writes.
+ # We sleep and sync for good measure - better than build failure.
+ sync
+ sleep 1
+
+ ${LB_LOSETUP} -d "${DEVICE}" || Lodetach "${DEVICE}" "$(expr ${ATTEMPT} + 1)"
+}
+
+Losetup ()
+{
+ DEVICE="${1}"
+ FILE="${2}"
+ PARTITION="${3:-1}"
+
+ ${LB_LOSETUP} --read-only "${DEVICE}" "${FILE}"
+ FDISK_OUT="$(${LB_FDISK} -l -u ${DEVICE} 2>&1)"
+ Lodetach "${DEVICE}"
+
+ LOOPDEVICE="$(echo ${DEVICE}p${PARTITION})"
+
+ if [ "${PARTITION}" = "0" ]
+ then
+ Echo_message "Mounting %s with offset 0" "${DEVICE}"
+
+ ${LB_LOSETUP} "${DEVICE}" "${FILE}"
+ else
+ SECTORS="$(echo "$FDISK_OUT" | sed -ne "s|^$LOOPDEVICE[ *]*\([0-9]*\).*|\1|p")"
+ OFFSET="$(expr ${SECTORS} '*' 512)"
+
+ Echo_message "Mounting %s with offset %s" "${DEVICE}" "${OFFSET}"
+
+ ${LB_LOSETUP} -o "${OFFSET}" "${DEVICE}" "${FILE}"
+ fi
+}
+
+# adapted from lib/ext2fs/mkjournal.c, default block size is 4096 bytes (/etc/mke2fs.conf).
+ext2fs_default_journal_size()
+{
+ SIZE="$1"
+ if [ "${SIZE}" -lt "8" ]; then # 2048*4096
+ echo 0
+ elif [ "${SIZE}" -lt "128" ]; then # 32768*4096
+ echo 4
+ elif [ "${SIZE}" -lt "1024" ]; then # 256*1024*4096
+ echo 16
+ elif [ "${SIZE}" -lt "2048" ]; then # 512*1024*4096
+ echo 32
+ elif [ "${SIZE}" -lt "4096" ]; then # 1024*1024*4096
+ echo 64
+ else
+ echo 128
+ fi
+}
+
+Calculate_partition_size_without_journal ()
+{
+ WITHOUT_JOURNAL_ORIGINAL_SIZE="${1}"
+ WITHOUT_JOURNAL_FILESYSTEM="${2}"
+
+ case "${WITHOUT_JOURNAL_FILESYSTEM}" in
+ ext2|ext3|ext4)
+ PERCENT="6"
+ ;;
+ *)
+ PERCENT="3"
+ ;;
+ esac
+
+ echo $(expr ${WITHOUT_JOURNAL_ORIGINAL_SIZE} + ${WITHOUT_JOURNAL_ORIGINAL_SIZE} \* ${PERCENT} / 100 + 1)
+}
+
+Calculate_partition_size ()
+{
+ ORIGINAL_SIZE="${1}"
+ FILESYSTEM="${2}"
+
+ case "${FILESYSTEM}" in
+ ext3|ext4)
+ NON_JOURNAL_SIZE=$(Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM})
+ PROJECTED_JOURNAL_SIZE=$(ext2fs_default_journal_size ${NON_JOURNAL_SIZE})
+ PROJECTED_PARTITION_SIZE=$(expr ${ORIGINAL_SIZE} + ${PROJECTED_JOURNAL_SIZE})
+ PRE_FINAL_PARTITION_SIZE=$(Calculate_partition_size_without_journal ${PROJECTED_PARTITION_SIZE} ${FILESYSTEM})
+ JOURNAL_SIZE=$(ext2fs_default_journal_size ${PRE_FINAL_PARTITION_SIZE})
+
+ expr $(Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM}) + ${JOURNAL_SIZE}
+ ;;
+ *)
+ Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM}
+ ;;
+ esac
+}