[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [PATCH] do not eject USB flash drives



> i started to comment on the patch, but then saw that all of the first
> five things i came up with for the two functions you added, are already
> covered in the manual. could you please reformat your new additions?

Done. Reformatted patch is attached. I don't know if I hit all the five+ 
things because you did not specify them. If I still got something wrong feel 
free to correct the patch yourself before merging and tell me what the 
problem was.

I did not understand the last point of 
http://live.debian.net/manual/html/compatibilty.html:
- Do check your scripts with 'sh -n' and 'checkbasishm'.

What does 'sh -n' do? How do I check the patched init script with it? What on 
earth is 'checkbasishm'? I searched with Google and got only three hits. All 
just pointed to the Debian Live Manual section above. :-P

Greetings

Ronny

-- 
Ronny Standtke                 Fachhochschule Nordwestschweiz
Dozent Medienpädagogik / ICT   Pädagogische Hochschule
Telefon: +41 32 627 92 47      Obere Sternengasse 7
Mobil  : +41 79 786 81 82      4502 Solothurn
diff --git a/debian/init b/debian/init
index 149314b..a0d248c 100644
--- a/debian/init
+++ b/debian/init
@@ -56,6 +56,32 @@ cache_path() {
     fi
 }
 
+get_boot_device()
+{
+	# search in /proc/mounts for the device that is mounted at /live/image
+	while read DEVICE MOUNT REST; do
+		if [ "${MOUNT}" == "/live/image" ]
+		then
+			echo "${DEVICE}"
+			exit 0
+		fi
+	done < /proc/mounts
+}
+
+device_is_USB_flash_drive()
+{
+	# remove leading "/dev/" and all trailing numbers from input
+	DEVICE="$(expr substr ${1} 6 3)"
+	# check that device starts with "sd"
+	[ "$(expr substr ${DEVICE} 1 2)" != "sd" ] && return 1
+	# check that the device is an USB device
+	if readlink /sys/block/${DEVICE}/device | grep -q usb 
+	then
+		return 0
+	fi
+	return 1
+}
+
 do_stop ()
 {
     if [ ! -z "${ROOTSNAP}" ]; then
@@ -89,17 +115,31 @@ do_stop ()
     done
 
     if [ -z ${QUICKREBOOT} ]; then
+	# TODO: i18n, dialog
 	if [ -x /usr/bin/eject ]
 	then
-		eject -p -m /live/image >/dev/null 2>&1
+		BOOT_DEVICE="$(get_boot_device)"
+		if device_is_USB_flash_drive "${BOOT_DEVICE}"
+		then
+			# do NOT eject USB flash drives!
+			# otherwise rebooting with most USB flash drives failes because
+			# they actually remember the "ejected" state even after reboot
+  			MESSAGE="Please remove the USB flash drive"
+		else
+			# ejecting is a very good idea here
+			eject -p -m /live/image >/dev/null 2>&1
+			# TODO: detect CD
+			MEDIUM="DVD"
+			MESSAGE="Please remove the ${MEDIUM}, close the ${MEDIUM} tray (if any)"
+		fi
+		MESSAGE="${MESSAGE} and press ENTER:"
 
 		[ "$prompt" ] || return 0
 	fi
 
 	stty sane < /dev/console
 
-	# XXX - i18n
-	echo "Please remove the disc and close the tray (if any) then press ENTER: " > /dev/console
+	echo -n -e "\n\n${MESSAGE}" > /dev/console
 	if [ -x /sbin/usplash_write ]; then
 	    /sbin/usplash_write "TIMEOUT 86400"
 	    /sbin/usplash_write "TEXT-URGENT Please remove the disc, close the tray (if any)"

Reply to: