Add files from parent branch HEAD:
[pkgsrc.git] / bootstrap / darwindiskimage
1 #!/bin/sh
2 #
3 # $NetBSD$
4
5 _getdevice_and_halfway_mount()
6 {
7         hdid -nomount "$1" | _getdevicebasename | tail -1
8 }
9
10 _getdevicebasename()
11 {
12         awk '{print $1}' | sed -e 's|^/dev/||'
13 }
14
15 _normalize_filename()
16 {
17         echo "$1" | sed -e 's|\.dmg$||' -e 's|$|.dmg|'
18 }
19
20 dmg_create()
21 {
22         local fstype fs osmajor file mountedname megabytes device
23         [ $# -eq 2 ] || die 1 "Usage: $0 create <file> <megabytes>"
24
25         # Use case-sensitive HFS+ where available (Darwin >= 7)
26         fstype='Apple_UFS'
27         fs='UFS'
28         osmajor=`uname -r | awk 'BEGIN {FS="."} {print $1}'`
29         if [ ${osmajor} -ge 7 ]; then
30                 fstype='Apple_HFSX'
31                 fs='HFSX'
32         fi
33
34         file="`_normalize_filename \"$1\"`"
35         mountedname="`basename \"${file}\" .dmg`"
36         megabytes=$2
37
38         # create
39         hdiutil create -quiet "${file}" -megabytes ${megabytes} \
40                 -partitionType ${fstype} -layout SPUD -fs ${fs}
41
42         # rename
43         device=`_getdevice_and_halfway_mount "${file}"`
44         hdiutil mount "${file}"
45         disktool -n "${device}" "${mountedname}"
46         hdiutil eject -quiet "${device}"
47 }
48
49 dmg_mount()
50 {
51         local file device exitcode
52         [ $# -eq 1 ] || die 1 "Usage: $0 mount <file>"
53
54         file="`_normalize_filename \"$1\"`"
55
56         hdiutil mount ${file}
57 }
58
59
60 dmg_umount()
61 {
62         local mountpoint device
63         [ $# -eq 1 ] || die 1 "Usage: $0 umount <mount-point>"
64
65         mountpoint="$1"
66         device=`mount | grep "${mountpoint} (local" | _getdevicebasename`
67
68         [ "${device}" ] || die 1 "error: no device mounted at ${mountpoint}"
69
70         hdiutil eject -quiet "${device}"
71 }
72
73 die()
74 {
75         local exitcode
76         exitcode=$1; shift
77         warn "$@"
78         exit ${exitcode}
79 }
80
81 warn()
82 {
83         echo >&2 "$@"
84 }
85
86 try()
87 {
88         exitcode=$1; shift
89         action=$1; shift
90         error=`"${action}" "$@" 2>&1` || die ${exitcode} "${error}"
91 }
92
93 main()
94 {
95         [ $# -eq 0 ] && die 1 "Usage: $0 <create|mount|umount>"
96         ACTION="$1"; shift
97         case ${ACTION} in
98                 create|mount|umount)
99                         try 1 "dmg_${ACTION}" "$@"
100                         return 0
101                         ;;
102                 *)
103                         die 1 "Usage: $0 <create|mount|umount>"
104                         ;;
105         esac
106 }
107
108 PATH=${PATH}:/sbin:/usr/sbin
109 main "$@"
110 exit $?