diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-05 23:12:49 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-05 23:12:49 +0000 |
| commit | 000b9ba91f64a348d697fb22a546cfb4db1d9f0e (patch) | |
| tree | a36bca5413a3305c46a24a95f45556125ebc2508 /miscutils | |
| parent | de59c0f58fa5dc75b753f94da61be92bfa0935ec (diff) | |
| download | busybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.tar.gz busybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.tar.bz2 busybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.zip | |
eject: -T fix
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 | } |
