#!/bin/sh # # $NetBSD: darwindiskimage,v 1.2 2006/08/30 04:36:10 schmonz Exp $ _getdevice_and_halfway_mount() { hdid -nomount "$1" | _getdevicebasename | tail -1 } _getdevicebasename() { awk '{print $1}' | sed -e 's|^/dev/||' } _normalize_filename() { echo "$1" | sed -e 's|\.dmg$||' -e 's|$|.dmg|' } dmg_create() { local fstype fs osmajor file mountedname megabytes device [ $# -eq 2 ] || die 1 "Usage: $0 create " # Use case-sensitive HFS+ where available (Darwin >= 7) fstype='Apple_UFS' fs='UFS' osmajor=`uname -r | awk 'BEGIN {FS="."} {print $1}'` if [ ${osmajor} -ge 7 ]; then fstype='Apple_HFSX' fs='HFSX' fi file="`_normalize_filename \"$1\"`" mountedname="`basename \"${file}\" .dmg`" megabytes=$2 # create hdiutil create -quiet "${file}" -megabytes ${megabytes} \ -partitionType ${fstype} -layout SPUD -fs ${fs} # rename device=`_getdevice_and_halfway_mount "${file}"` hdiutil mount "${file}" disktool -n "${device}" "${mountedname}" hdiutil eject -quiet "${device}" } dmg_mount() { local file device exitcode [ $# -eq 1 ] || die 1 "Usage: $0 mount " file="`_normalize_filename \"$1\"`" hdiutil mount ${file} } dmg_umount() { local mountpoint device [ $# -eq 1 ] || die 1 "Usage: $0 umount " mountpoint="$1" device=`mount | grep "${mountpoint} (local" | _getdevicebasename` [ "${device}" ] || die 1 "error: no device mounted at ${mountpoint}" hdiutil eject -quiet "${device}" } die() { local exitcode exitcode=$1; shift warn "$@" exit ${exitcode} } warn() { echo >&2 "$@" } try() { exitcode=$1; shift action=$1; shift error=`"${action}" "$@" 2>&1` || die ${exitcode} "${error}" } main() { [ $# -eq 0 ] && die 1 "Usage: $0 " ACTION="$1"; shift case ${ACTION} in create|mount|umount) try 1 "dmg_${ACTION}" "$@" return 0 ;; *) die 1 "Usage: $0 " ;; esac } PATH=${PATH}:/sbin:/usr/sbin main "$@" exit $?