X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=mount.vdi;h=16bbf72ce89ad555cec8c6547545c0fe32deb89f;hb=074d094e2fc41df015195c40d10d86e15337667c;hp=649c6a5c3165a97c247d2954ec6dee61f2fcc0fa;hpb=24855e509a16d4b493bf5aa777622ebb1668db18;p=packages%2FVirtualBox.git diff --git a/mount.vdi b/mount.vdi index 649c6a5..16bbf72 100644 --- a/mount.vdi +++ b/mount.vdi @@ -27,7 +27,7 @@ export PATH=/bin:/sbin:/usr/bin:/usr/sbin # Commands LOSETUP=/sbin/losetup MOUNT=/bin/mount -SFDISK=/sbin/sfdisk +PARTED=/usr/sbin/parted SED=/bin/sed PROGRAM=${0##*/} @@ -95,10 +95,15 @@ fi # check magic magic=$(head -n 1 "$DEVICE") -if [ "$magic" != "<<< innotek VirtualBox Disk Image >>>" ]; then +case "$magic" in +"<<< innotek VirtualBox Disk Image >>>") + ;; +"<<< Sun VirtualBox Disk Image >>>") + ;; +*) echo >&2 "$PROGRAM: $DEVICE: bad magic, not VDI image" exit 1 -fi +esac MOUNTOPTIONS= PARTITION= @@ -135,41 +140,23 @@ fi dskoff=8704 # find free loop device. XXX race possible -imgdev=$($LOSETUP -f) +imgdev=$($LOSETUP -f) || exit 1 $LOSETUP $imgdev -o $dskoff "$DEVICE" -# http://vserver.13thfloor.at/Stuff/QEMU/hdloop.sh -sfd=$($SFDISK -dump $imgdev 2>/dev/null | $SED -n ' - /:/ s/[a-zA-Z]*=\ *\([0-9a-f]*\)\(,\|$\)/\1/g; - T; s/^.*:\ //; p' | tr ' ' '.') -$LOSETUP -d $imgdev - -getoffset() { - pstart=$1 - psize=$2 - - blksize=512 - offset=$((pstart*blksize)) - size=$((psize*blksize)) - echo $((offset+dskoff)) -} - -p=1 -for a in $sfd; do - if [ "$p" = "$PARTITION" ]; then - OFFSET=$(getoffset $(echo "$a" | tr '.' ' ')) - fi - x=$((p++)) -done +dump=$($PARTED -s -m $imgdev unit B print) +$LOSETUP -d $imgdev || exit 1 + +partoff=$(echo "$dump" | $SED -ne "s/^$PARTITION:"'\([0-9]*\)B:.*/\1/p') +OFFSET=$((dskoff + partoff)) -if [ -z "$OFFSET" ]; then +if [ -z "$partoff" -o -z "$OFFSET" ]; then echo >&2 "$PROGRAM: couldn't figure out offset, perhaps out of range?" exit 1 fi if [ -z "$MOUNTOPTIONS" ]; then - MOUNTOPTIONS="offset=$OFFSET" + MOUNTOPTIONS="loop,offset=$OFFSET" else - MOUNTOPTIONS="$MOUNTOPTIONS,offset=$OFFSET" + MOUNTOPTIONS="$MOUNTOPTIONS,loop,offset=$OFFSET" fi # $MOUNTPOINT might not exist as mount can try to read it from /etc/fstab