aboutsummaryrefslogtreecommitdiff
path: root/miscutils/eject.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-10-05 23:12:49 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-10-05 23:12:49 +0000
commit000b9ba91f64a348d697fb22a546cfb4db1d9f0e (patch)
treea36bca5413a3305c46a24a95f45556125ebc2508 /miscutils/eject.c
parentde59c0f58fa5dc75b753f94da61be92bfa0935ec (diff)
downloadbusybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.tar.gz
busybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.tar.bz2
busybox-w32-000b9ba91f64a348d697fb22a546cfb4db1d9f0e.zip
eject: -T fix
Diffstat (limited to 'miscutils/eject.c')
-rw-r--r--miscutils/eject.c36
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;
52close_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}