pkgsrc/bootstrap/darwindiskimage
schmonz 3e66a7cf3d If creating a disk image on Darwin 7.0 or newer, create a case-sensitive
HFS+ rather than a UFS. The result performs better, among other things.
2006-08-30 04:36:10 +00:00

110 lines
1.9 KiB
Bash
Executable file

#!/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 <file> <megabytes>"
# 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>"
file="`_normalize_filename \"$1\"`"
hdiutil mount ${file}
}
dmg_umount()
{
local mountpoint device
[ $# -eq 1 ] || die 1 "Usage: $0 umount <mount-point>"
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 <create|mount|umount>"
ACTION="$1"; shift
case ${ACTION} in
create|mount|umount)
try 1 "dmg_${ACTION}" "$@"
return 0
;;
*)
die 1 "Usage: $0 <create|mount|umount>"
;;
esac
}
PATH=${PATH}:/sbin:/usr/sbin
main "$@"
exit $?