diff options
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/eject.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/miscutils/eject.c b/miscutils/eject.c index d49396be6..b07f536b1 100644 --- a/miscutils/eject.c +++ b/miscutils/eject.c | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | /* various defines swiped from linux/cdrom.h */ | 19 | /* various defines swiped from linux/cdrom.h */ |
| 20 | #define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ | 20 | #define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ |
| 21 | #define CDROMEJECT 0x5309 /* Ejects the cdrom media */ | 21 | #define CDROMEJECT 0x5309 /* Ejects the cdrom media */ |
| 22 | #define DEFAULT_CDROM "/dev/cdrom" | 22 | #define CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */ |
| 23 | /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */ | ||
| 24 | #define CDS_TRAY_OPEN 2 | ||
| 23 | 25 | ||
| 24 | #define FLAG_CLOSE 1 | 26 | #define FLAG_CLOSE 1 |
| 25 | #define FLAG_SMART 2 | 27 | #define FLAG_SMART 2 |
| @@ -29,32 +31,34 @@ int eject_main(int argc, char **argv) | |||
| 29 | unsigned long flags; | 31 | unsigned long flags; |
| 30 | char *device; | 32 | char *device; |
| 31 | struct mntent *m; | 33 | struct mntent *m; |
| 32 | int dev; | 34 | int dev, cmd; |
| 33 | 35 | ||
| 34 | /*opt_complementary = "t--T:T--t";*/ | 36 | opt_complementary = "?:?1:t--T:T--t"; |
| 35 | flags = getopt32(argc, argv, "tT"); | 37 | flags = getopt32(argc, argv, "tT"); |
| 36 | device = argv[optind] ? : DEFAULT_CDROM; | 38 | device = argv[optind] ? : "/dev/cdrom"; |
| 37 | 39 | ||
| 40 | // FIXME: what if something is mounted OVER our cdrom? | ||
| 41 | // We will unmount something else??! | ||
| 42 | // What if cdrom is mounted many times? | ||
| 38 | m = find_mount_point(device, bb_path_mtab_file); | 43 | m = find_mount_point(device, bb_path_mtab_file); |
| 39 | if (m) { | 44 | if (m) { |
| 40 | if (umount(m->mnt_dir)) { | 45 | if (umount(m->mnt_dir)) |
| 41 | bb_error_msg_and_die("can't umount"); | 46 | bb_error_msg_and_die("can't umount %s", device); |
| 42 | } else if (ENABLE_FEATURE_MTAB_SUPPORT) { | 47 | if (ENABLE_FEATURE_MTAB_SUPPORT) |
| 43 | erase_mtab(m->mnt_fsname); | 48 | erase_mtab(m->mnt_fsname); |
| 44 | } | ||
| 45 | } | 49 | } |
| 46 | 50 | ||
| 47 | dev = xopen(device, O_RDONLY|O_NONBLOCK); | 51 | dev = xopen(device, O_RDONLY|O_NONBLOCK); |
| 48 | 52 | cmd = CDROMEJECT; | |
| 49 | if (flags & FLAG_CLOSE) goto close_tray; | 53 | if (flags & FLAG_CLOSE |
| 50 | 54 | || (flags & FLAG_SMART && ioctl(dev, CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN)) | |
| 51 | if (ioctl(dev, CDROMEJECT)) { | 55 | cmd = CDROMCLOSETRAY; |
| 52 | close_tray: | 56 | if (ioctl(dev, cmd)) { |
| 53 | if (ioctl(dev, CDROMCLOSETRAY)) | 57 | bb_perror_msg_and_die("%s", device); |
| 54 | bb_perror_msg_and_die("%s", device); | ||
| 55 | } | 58 | } |
| 56 | 59 | ||
| 57 | if (ENABLE_FEATURE_CLEAN_UP) close(dev); | 60 | if (ENABLE_FEATURE_CLEAN_UP) |
| 61 | close(dev); | ||
| 58 | 62 | ||
| 59 | return EXIT_SUCCESS; | 63 | return EXIT_SUCCESS; |
| 60 | } | 64 | } |
