From 000b9ba91f64a348d697fb22a546cfb4db1d9f0e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 5 Oct 2006 23:12:49 +0000 Subject: [PATCH] eject: -T fix --- miscutils/eject.c | 36 ++++++++++++++++++++---------------- networking/tftp.c | 6 ++---- util-linux/rdate.c | 4 ++-- 3 files changed, 24 insertions(+), 22 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 @@ /* various defines swiped from linux/cdrom.h */ #define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ #define CDROMEJECT 0x5309 /* Ejects the cdrom media */ -#define DEFAULT_CDROM "/dev/cdrom" +#define CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */ +/* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */ +#define CDS_TRAY_OPEN 2 #define FLAG_CLOSE 1 #define FLAG_SMART 2 @@ -29,32 +31,34 @@ int eject_main(int argc, char **argv) unsigned long flags; char *device; struct mntent *m; - int dev; + int dev, cmd; - /*opt_complementary = "t--T:T--t";*/ + opt_complementary = "?:?1:t--T:T--t"; flags = getopt32(argc, argv, "tT"); - device = argv[optind] ? : DEFAULT_CDROM; + device = argv[optind] ? : "/dev/cdrom"; + // FIXME: what if something is mounted OVER our cdrom? + // We will unmount something else??! + // What if cdrom is mounted many times? m = find_mount_point(device, bb_path_mtab_file); if (m) { - if (umount(m->mnt_dir)) { - bb_error_msg_and_die("can't umount"); - } else if (ENABLE_FEATURE_MTAB_SUPPORT) { + if (umount(m->mnt_dir)) + bb_error_msg_and_die("can't umount %s", device); + if (ENABLE_FEATURE_MTAB_SUPPORT) erase_mtab(m->mnt_fsname); - } } dev = xopen(device, O_RDONLY|O_NONBLOCK); - - if (flags & FLAG_CLOSE) goto close_tray; - - if (ioctl(dev, CDROMEJECT)) { -close_tray: - if (ioctl(dev, CDROMCLOSETRAY)) - bb_perror_msg_and_die("%s", device); + cmd = CDROMEJECT; + if (flags & FLAG_CLOSE + || (flags & FLAG_SMART && ioctl(dev, CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN)) + cmd = CDROMCLOSETRAY; + if (ioctl(dev, cmd)) { + bb_perror_msg_and_die("%s", device); } - if (ENABLE_FEATURE_CLEAN_UP) close(dev); + if (ENABLE_FEATURE_CLEAN_UP) + close(dev); return EXIT_SUCCESS; } diff --git a/networking/tftp.c b/networking/tftp.c index 5f0c190e2..bfe94aca2 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -502,9 +502,7 @@ int tftp_main(int argc, char **argv) opt_complementary = GET_COMPL PUT_COMPL; #endif - - cmd = getopt32(argc, argv, GET PUT "l:r:" BS, - &localfile, &remotefile BS_ARG); + cmd = getopt32(argc, argv, GET PUT "l:r:" BS, &localfile, &remotefile BS_ARG); cmd &= (tftp_cmd_get | tftp_cmd_put); #ifdef CONFIG_FEATURE_TFTP_GET @@ -559,5 +557,5 @@ int tftp_main(int argc, char **argv) if (cmd == tftp_cmd_get && result != EXIT_SUCCESS) unlink(localfile); } - return (result); + return result; } diff --git a/util-linux/rdate.c b/util-linux/rdate.c index c24465dc3..6ad055434 100644 --- a/util-linux/rdate.c +++ b/util-linux/rdate.c @@ -73,10 +73,10 @@ int rdate_main(int argc, char **argv) time(¤t_time); if (current_time == remote_time) - bb_error_msg("Current time matches remote time."); + bb_error_msg("current time matches remote time"); else if (stime(&remote_time) < 0) - bb_perror_msg_and_die("Could not set time of day"); + bb_perror_msg_and_die("cannot set time of day"); } if ((flags & 1) == 0)