Attached is a simple patch to add support to upstart's halt command for
ejecting a given device.  This is really nice to make it so that you can
eject a livecd on shutdown without having to do some of the contortions
that are currently done on the shutdown of the Ubuntu livecd ;)

And while a little ugly, it's not any worse than having -h and -i there.
And it makes the rest of the shutdown process substantially cleaner.
Patch is  against current bzr trunk, although I've only tested atm with
it applied to 0.3.19.  There's nothing to speak of changed, though, so
should be fine.

Thoughts?

Jeremy
=== modified file 'compat/sysv/reboot.c'
--- compat/sysv/reboot.c	2008-02-29 16:17:17 +0000
+++ compat/sysv/reboot.c	2008-05-29 20:05:10 +0000
@@ -39,6 +39,7 @@
 
 #include <linux/if.h>
 #include <linux/hdreg.h>
+#include <linux/cdrom.h>
 
 #include <nih/macros.h>
 #include <nih/main.h>
@@ -95,6 +96,7 @@
 /* Prototypes for static functions */
 static void down_drives     (void);
 static void down_interfaces (void);
+static void eject_drive     (void);
 
 
 /**
@@ -139,6 +141,8 @@
  **/
 static int exit_only = FALSE;
 
+static char *eject_device = NULL;
+
 
 /**
  * options:
@@ -156,6 +160,8 @@
 	  NULL, NULL, &disk_standby, NULL },
 	{ 'i', NULL, N_("bring down network interfaces"),
 	  NULL, NULL, &interface_down, NULL },
+	{ 'e', NULL, N_("eject the given device"),
+	  NULL, "DEVICE", &eject_device, NULL },
 
 	/* Compatibility option, just causes us to exit */
 	{ 'w', NULL, NULL, NULL, NULL, &exit_only, NULL },
@@ -275,6 +281,10 @@
 	if (disk_standby)
 		down_drives ();
 
+	/* If we need to eject a device, do it now */
+	if (eject_device)
+		eject_drive ();
+
 	/* Do the syscall */
 	switch (mode) {
 	case REBOOT:
@@ -298,6 +308,28 @@
 	return 0;
 }
 
+/**
+ * eject_drive:
+ *
+ * Eject the drive given on the command line
+ **/
+static void
+eject_drive (void)
+{
+	int fd;
+	
+	fd = open(eject_device, O_RDONLY | O_NONBLOCK);
+	if (fd < 0) {
+		nih_warn (_("Unable to open device %s to eject: %s"), eject_device,
+			  strerror(errno));
+		return;
+	}
+	
+	if (ioctl(fd, CDROMEJECT, 1)) {
+		nih_warn (_("Unable to eject device %s: %s"), eject_device,
+			  strerror(errno));
+	}
+}
 
 /**
  * down_drives:

-- 
upstart-devel mailing list
upstart-devel@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to