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

[PATCH] do not eject USB flash drives



Hi all

I noticed that rebooting a system with Debian Live put on a USB flash
drives almost always fails. This is because most USB flash drives
actually understand the "eject" call and remember that they are in a
ejected state until they are powerless.

The attached patch fixes this problem for me. The patch works great for
me in all situations I tested. But as always, my mandatory disclaimer: I
am a shell script n00b. Feel free to correct the patch.

I noticed different indentation style within the same file (tabs,
spaces, ...). I tried to keep the style used within every section but I
wonder if there is a style everybody has agreed upon?

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
>From 04f1a8617c6153ef58b5ff791015f50222c69c12 Mon Sep 17 00:00:00 2001
From: Ronny Standtke <ronny@ronny-laptop.(none)>
Date: Wed, 4 Feb 2009 18:23:14 +0100
Subject: [PATCH] do not eject USB flash drives

---
 debian/init |   42 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/debian/init b/debian/init
index 149314b..1dd72cc 100644
--- a/debian/init
+++ b/debian/init
@@ -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)"
-- 
1.5.6.3


Reply to: