Do not eject USB flash drives (Closes: #457070).
authorRonny Standtke <Ronny.Standtke@fhnw.ch>
Sat, 7 Feb 2009 23:14:03 +0000 (00:14 +0100)
committerDaniel Baumann <daniel@debian.org>
Wed, 9 Mar 2011 16:48:04 +0000 (17:48 +0100)
debian/init

index 149314b..1dd72cc 100644 (file)
@@ -56,6 +56,29 @@ 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 +112,30 @@ 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)"