eject: -T fix
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 5 Oct 2006 23:12:49 +0000 (23:12 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 5 Oct 2006 23:12:49 +0000 (23:12 -0000)
miscutils/eject.c
networking/tftp.c
util-linux/rdate.c

index d49396b..b07f536 100644 (file)
@@ -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;
 }
index 5f0c190..bfe94ac 100644 (file)
@@ -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;
 }
index c24465d..6ad0554 100644 (file)
@@ -73,10 +73,10 @@ int rdate_main(int argc, char **argv)
 
                time(&current_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)