#endif
}
+/*
+ * 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.
*
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
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
* 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
-
}
/*
#endif
}
-/*
- * 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.
*/