From: Mike Frysinger <vapier@gentoo.org>
To: util-linux-ng@vger.kernel.org
Subject: [PATCH 3/3] eject: use CDROM_DRIVE_STATUS if available for tray toggling
Date: Thu, 5 Apr 2012 11:50:46 -0400 [thread overview]
Message-ID: <1333641046-13125-3-git-send-email-vapier@gentoo.org> (raw)
In-Reply-To: <1333641046-13125-1-git-send-email-vapier@gentoo.org>
One some platforms, the -T option can be unreliable (see reference bug
report for some examples). Instead, if the kernel supports the cdrom
status ioctl, use that to ask explicitly for the current tray status
and then open/close accordingly.
The eject_cdrom() func was reworked slightly, but none of the existing
callers care about the explicit normalization to [0,1] values, so have
it return the raw value so we can convert toggle_tray() over to using
that.
Finally, now that toggle_tray() uses a lot of helper functions, drop
the check on CDROMCLOSETRAY. The sub-functions take care of that.
Reference: https://bugs.gentoo.org/261880
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
sys-utils/eject.c | 52 ++++++++++++++++++++++++++++++++--------------------
1 files changed, 32 insertions(+), 20 deletions(-)
diff --git a/sys-utils/eject.c b/sys-utils/eject.c
index 68d5e9c..245c028 100644
--- a/sys-utils/eject.c
+++ b/sys-utils/eject.c
@@ -386,6 +386,22 @@ static void close_tray(int fd)
}
/*
+ * Eject using CDROMEJECT ioctl.
+ */
+static int eject_cdrom(int fd)
+{
+#if defined(CDROMEJECT)
+ return ioctl(fd, CDROMEJECT);
+#elif defined(CDIOCEJECT)
+ return ioctl(fd, CDIOCEJECT);
+#else
+ warnx(_("CD-ROM eject unsupported"));
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+/*
* Toggle tray.
*
* Written by Benjamin Schwenk <benjaminschwenk@yahoo.de> and
@@ -400,7 +416,21 @@ static void toggle_tray(int fd)
struct timeval time_start, time_stop;
int time_elapsed;
-#ifdef CDROMCLOSETRAY
+#ifdef CDROM_DRIVE_STATUS
+ /* First ask the CDROM for info, otherwise fall back to manual. */
+ switch (ioctl(fd, CDROM_DRIVE_STATUS)) {
+ case CDS_TRAY_OPEN:
+ close_tray(fd);
+ return;
+
+ case CDS_NO_DISC:
+ case CDS_DISC_OK:
+ if (eject_cdrom(fd))
+ err(EXIT_FAILURE, _("CD-ROM eject command failed"));
+ return;
+ }
+#endif
+
/* Try to open the CDROM tray and measure the time therefor
* needed. In my experience the function needs less than 0.05
* seconds if the tray was already open, and at least 1.5 seconds
@@ -408,7 +438,7 @@ static void toggle_tray(int fd)
gettimeofday(&time_start, NULL);
/* Send the CDROMEJECT command to the device. */
- if (ioctl(fd, CDROMEJECT, 0) < 0)
+ if (eject_cdrom(fd) < 0)
err(EXIT_FAILURE, _("CD-ROM eject command failed"));
/* Get the second timestamp, to measure the time needed to open
@@ -423,10 +453,6 @@ static void toggle_tray(int fd)
* closed before. This would mean that we are done. */
if (time_elapsed < TRAY_WAS_ALREADY_OPEN_USECS)
close_tray(fd);
-#else
- warnx(_("CD-ROM tray toggle command not supported by this kernel"));
-#endif
-
}
/*
@@ -531,20 +557,6 @@ static void list_speeds(const char *name, int fd)
}
/*
- * Eject using CDROMEJECT ioctl. Return 1 if successful, 0 otherwise.
- */
-static int eject_cdrom(int fd)
-{
-#if defined(CDROMEJECT)
- return ioctl(fd, CDROMEJECT) == 0;
-#elif defined(CDIOCEJECT)
- return ioctl(fd, CDIOCEJECT) == 0;
-#else
- warnx(_("CD-ROM eject unsupported"));
-#endif
-}
-
-/*
* Eject using SCSI SG_IO commands. Return 1 if successful, 0 otherwise.
*/
static int eject_scsi(int fd)
--
1.7.8.5
next prev parent reply other threads:[~2012-04-05 15:50 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-05 15:50 [PATCH 1/3] eject: constify array Mike Frysinger
2012-04-05 15:50 ` [PATCH 2/3] eject(1): fix typo in mount(1) reference Mike Frysinger
2012-04-10 10:24 ` Karel Zak
2012-04-05 15:50 ` Mike Frysinger [this message]
2012-04-10 10:25 ` [PATCH 3/3] eject: use CDROM_DRIVE_STATUS if available for tray toggling Karel Zak
2012-04-10 10:24 ` [PATCH 1/3] eject: constify array Karel Zak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1333641046-13125-3-git-send-email-vapier@gentoo.org \
--to=vapier@gentoo.org \
--cc=util-linux-ng@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox