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