1247280Sdteskeif [ ! "$_MEDIA_CDROM_SUBR" ]; then _MEDIA_CDROM_SUBR=1
2247280Sdteske#
3247280Sdteske# Copyright (c) 2012-2013 Devin Teske
4252980Sdteske# All rights reserved.
5247280Sdteske#
6247280Sdteske# Redistribution and use in source and binary forms, with or without
7247280Sdteske# modification, are permitted provided that the following conditions
8247280Sdteske# are met:
9247280Sdteske# 1. Redistributions of source code must retain the above copyright
10247280Sdteske#    notice, this list of conditions and the following disclaimer.
11247280Sdteske# 2. Redistributions in binary form must reproduce the above copyright
12247280Sdteske#    notice, this list of conditions and the following disclaimer in the
13247280Sdteske#    documentation and/or other materials provided with the distribution.
14247280Sdteske#
15247280Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16252987Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17247280Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18247280Sdteske# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19247280Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20252987Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21247280Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22247280Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23247280Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24247280Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25247280Sdteske# SUCH DAMAGE.
26247280Sdteske#
27247280Sdteske# $FreeBSD$
28247280Sdteske#
29247280Sdteske############################################################ INCLUDES
30247280Sdteske
31247280SdteskeBSDCFG_SHARE="/usr/share/bsdconfig"
32247280Sdteske. $BSDCFG_SHARE/common.subr || exit 1
33247280Sdteskef_dprintf "%s: loading includes..." media/cdrom.subr
34247280Sdteskef_include $BSDCFG_SHARE/device.subr
35247280Sdteskef_include $BSDCFG_SHARE/dialog.subr
36252077Sdteskef_include $BSDCFG_SHARE/media/common.subr
37252077Sdteskef_include $BSDCFG_SHARE/struct.subr
38247280Sdteskef_include $BSDCFG_SHARE/variable.subr
39247280Sdteske
40247280SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig"
41247280Sdteskef_include_lang $BSDCFG_LIBE/include/messages.subr
42247280Sdteske
43247280Sdteske############################################################ GLOBALS
44247280Sdteske
45247280SdteskeCDROM_MOUNTED=
46247280SdteskeCDROM_PREVIOUSLY_MOUNTED=
47247280SdteskeCDROM_INIT_QUIET=
48247280Sdteske
49247280Sdteske############################################################ FUNCTIONS
50247280Sdteske
51247280Sdteske# f_media_set_cdrom
52247280Sdteske#
53247280Sdteske# Return success if we both found and set the media type to be a CD.
54247280Sdteske#
55247280Sdteskef_media_set_cdrom()
56247280Sdteske{
57247280Sdteske	f_media_close
58247280Sdteske
59247280Sdteske	local devs ndevs
60247280Sdteske	f_device_find "" $DEVICE_TYPE_CDROM devs
61260678Sdteske	f_count ndevs $devs
62247280Sdteske
63247280Sdteske	if [ ${ndevs:=0} -eq 0 ]; then
64252795Sdteske		f_interactive && f_show_msg "$msg_no_cd_dvd_devices_found"
65247280Sdteske		return $FAILURE
66266290Sdteske	elif [ $ndevs -eq 1 ]; then
67266290Sdteske		f_struct_copy $devs device_media
68266290Sdteske	else
69266290Sdteske		local dev
70247280Sdteske		local title="$msg_choose_a_cd_dvd_type"
71247280Sdteske		local prompt="$msg_please_select_a_cd_dvd_drive"
72266290Sdteske		local hline=
73247280Sdteske
74247280Sdteske		dev=$( f_device_menu \
75247280Sdteske			"$title" "$prompt" "$hline" $DEVICE_TYPE_CDROM \
76266290Sdteske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) ||
77266290Sdteske			return $FAILURE
78247280Sdteske
79266290Sdteske		f_struct_copy "$dev" device_media
80247280Sdteske	fi
81247280Sdteske
82247280Sdteske	f_struct device_media || return $FAILURE
83247280Sdteske}
84247280Sdteske
85247280Sdteske# f_media_init_cdrom $device
86247280Sdteske#
87247280Sdteske# Initializes the CDROM media device. Returns success if able to mount the CD
88247280Sdteske# device using mount_cd9660(8).
89247280Sdteske#
90247280Sdteskef_media_init_cdrom()
91247280Sdteske{
92260678Sdteske	local funcname=f_media_init_cdrom
93247280Sdteske	local dev="$1" devname err
94247280Sdteske
95266290Sdteske	f_struct "$dev" get devname devname || return $FAILURE
96247280Sdteske	f_dprintf "Init routine called for CDROM device. devname=[%s]" \
97247280Sdteske	          "$devname"
98247280Sdteske
99247280Sdteske	if [ "$CDROM_MOUNTED" ]; then
100247280Sdteske		f_dprintf "CDROM device already mounted."
101247280Sdteske		return $SUCCESS
102247280Sdteske	fi
103247280Sdteske
104260678Sdteske	if [ ! -e "$MOUNTPOINT" ]; then
105260678Sdteske		f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" ||
106260678Sdteske			return $FAILURE
107247280Sdteske	fi
108247280Sdteske
109260678Sdteske	if ! f_eval_catch -dk err $funcname mount_cd9660 \
110260678Sdteske		'mount_cd9660 "%s" "%s"' "$devname" "$MOUNTPOINT"
111247280Sdteske	then
112247280Sdteske		err="${err#mount_cd9660: }"; err="${err#$devname: }"
113247280Sdteske		case "$err" in
114247280Sdteske		"Device busy")
115247280Sdteske			# Perhaps the CDROM drive is already mounted as /cdrom
116247280Sdteske			if f_mounted /cdrom; then
117247280Sdteske				CDROM_PREVIOUSLY_MOUNTED=1
118247280Sdteske				MOUNTPOINT=/cdrom
119247280Sdteske				err=
120247280Sdteske			fi
121247280Sdteske			;;
122247280Sdteske		esac
123247280Sdteske		case "$err" in
124247280Sdteske		"") : good ;; # no error
125247280Sdteske		*)
126247280Sdteske			[ "$CDROM_INIT_QUIET" ] ||
127247280Sdteske				f_show_msg "$msg_error_mounting_device" \
128247280Sdteske				           "$devname" "$MOUNTPOINT" "$err"
129247280Sdteske			return $FAILURE
130247280Sdteske		esac
131247280Sdteske	fi
132247280Sdteske	CDROM_MOUNTED=1
133247280Sdteske
134247280Sdteske	: xxx # /cdrom.inf has been deprecated since 9.0-R
135247280Sdteske
136247280Sdteske	# No other CDROM media validation at this time
137247280Sdteske
138247280Sdteske	return $SUCCESS
139247280Sdteske}
140247280Sdteske
141253333Sdteske# f_media_get_cdrom $device $file [$probe_type]
142247280Sdteske#
143252721Sdteske# Returns data from $file on a mounted CDROM device. Similar to cat(1). If
144253333Sdteske# $probe_type is present and non-NULL, returns success if $file exists. If
145253333Sdteske# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
146253333Sdteske# standard-out.
147247280Sdteske#
148247280Sdteskef_media_get_cdrom()
149247280Sdteske{
150253333Sdteske	local dev="$1" file="$2" probe_type="$3"
151266290Sdteske	local name
152247280Sdteske
153266290Sdteske	$dev get name name
154253333Sdteske	f_dprintf "f_media_get_cdrom: dev=[%s] file=[%s] probe_type=%s" \
155266290Sdteske	          "$name" "$file" "$probe_type"
156247280Sdteske
157253333Sdteske	f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
158247280Sdteske}
159247280Sdteske
160247280Sdteske# f_media_shutdown_cdrom $device
161247280Sdteske#
162258420Sdteske# Shuts down the CDROM device. Return status should be ignored.
163247280Sdteske#
164247280Sdteskef_media_shutdown_cdrom()
165247280Sdteske{
166260678Sdteske	local funcname=f_media_shutdown_cdrom
167247280Sdteske	local dev="$1" err
168247280Sdteske
169256181Sdteske	[ "$CDROM_MOUNTED" ] || return $FAILURE
170247280Sdteske
171247280Sdteske	if [ "$CDROM_PREVIOUSLY_MOUNTED" ]; then
172247280Sdteske		CDROM_MOUNTED=
173247280Sdteske		return $SUCCESS
174247280Sdteske	fi
175247280Sdteske
176260678Sdteske	if ! f_eval_catch -dk err $funcname umount \
177266290Sdteske		'umount -f "%s"' "$MOUNTPOINT"
178260678Sdteske	then
179247280Sdteske		err="${err#umount: }"; err="${err#*: }"
180247280Sdteske		f_show_msg "$msg_could_not_unmount_the_cdrom_dvd" \
181247280Sdteske		           "$MOUNTPOINT" "$err"
182247280Sdteske	else
183247280Sdteske		CDROM_MOUNTED=
184247280Sdteske	fi
185247280Sdteske}
186247280Sdteske
187247280Sdteske# f_media_eject_cdrom $device
188247280Sdteske#
189247280Sdteske# Eject the media from the CDROM device. Returns success.
190247280Sdteske#
191247280Sdteskef_media_eject_cdrom()
192247280Sdteske{
193260678Sdteske	local funcname=f_media_eject_cdrom
194266290Sdteske	local dev="$1" name devname err
195266290Sdteske
196266290Sdteske	f_struct "$dev" || return $SUCCESS
197266290Sdteske	$dev get name name || return $SUCCESS
198266290Sdteske	$dev get devname devname || return $SUCCESS
199266290Sdteske
200266290Sdteske	# Don't eject labels
201266290Sdteske	case "$name" in */*) return $SUCCESS; esac
202266290Sdteske
203247280Sdteske	f_dprintf "Ejecting CDROM/DVD at %s" "$devname"
204260678Sdteske	if ! f_eval_catch -dk err $funcname cdcontrol \
205260678Sdteske		'cdcontrol -f "%s" eject' "$devname"
206260678Sdteske	then
207247280Sdteske		f_dprintf "Could not eject the CDROM/DVD from %s: %s" \
208247280Sdteske		          "$devname" "${err#cdcontrol: }"
209247280Sdteske	fi
210247280Sdteske	return $SUCCESS
211247280Sdteske}
212247280Sdteske
213247280Sdteske############################################################ MAIN
214247280Sdteske
215247280Sdteskef_dprintf "%s: Successfully loaded." media/cdrom.subr
216247280Sdteske
217247280Sdteskefi # ! $_MEDIA_CDROM_SUBR
218