Fwd: esd vs. disk eject
Bernhard Kaindl <[email protected]> Sun, 16 Oct 2005 20:29:18 +0200 (CEST)
| Newsgroups | gmane.comp.multimedia.grip.user |
|---|---|
| Message-ID | <[email protected]> |
Hi, I ran into a problem of grip not being able to eject on Linux, while the eject command was able to eject. After investigating, I found that at least the Linux 2.6 kernels do not define CDIOEJECT, but with the order of #ifdefs in grip-3.3.1/src/cddev.c, it would need to be defined to allow that CDROM_LOCKDOOR, which is provided by Linux 2.6, to be checked. What helped me was to move the #ifdef for it the the ioctl call where this IOCTL is called, thus freeing the CDROM_LOCKDOOR #ifdef and ioctl from this overlaying ifdef requirement, so the CDROM_LOCKDOOR ioctl is then compiled whenever it's provided by the platform. As far as I could find out CDIOEJECT is a FreeBSD ioctl and Linux uses CDROM_LOCKDOOR and CDROMEJECT instead. The change causes that both were done on Linux and my eject problems were solved. I think the location of the ifdef must have been a mistake originally since I cannot see much sense in require an FreeBSD define as precondition for cheking if a Linux ioctls is available and can be called. The attached patch contains the diff which I have been using since August on two Linux machines where I had this problem. Besides moving the ifdef in place, I also adds a missing "Eject failed" printout for the cases that the CDROMEJECT may fail. With this g_print call, this error string would be printed, togther the the errno, should the Linux kernel return an error from CDROMEJECT call, to allow better diagnosis. I propose to apply the attached patch to the next release. Bernhard
grip-3.3.1-linux-ejectfix.diff
(text/plain, 886 B)
--- grip-3.3.1/src/cddev.c 2004-04-15 20:23:09.000000000 +0200
+++ grip-3.3.1-ejectfix/src/cddev.c 2005-08-16 15:31:08.000000000 +0200
@@ -618,25 +618,29 @@
return FALSE;
}
-#ifdef CDIOCEJECT
/* always unlock door before an eject in case something else locked it */
#if defined(CDROM_LOCKDOOR)
if(ioctl(disc->cd_desc,CDROM_LOCKDOOR,0)<0)
g_print(_("Unlock failed: %d"), errno);
#endif
+
#ifdef CDIOCALLOW
if(ioctl(disc->cd_desc,CDIOCALLOW)<0)
g_print(_("Unlock failed: %d"),errno);
#endif
+#ifdef CDIOCEJECT
if(ioctl(disc->cd_desc,CDIOCEJECT)<0) {
g_print(_("CDIOCEJECT"));
return FALSE;
}
#endif
+
#ifdef CDROMEJECT
- if(ioctl(disc->cd_desc,CDROMEJECT)<0)
+ if(ioctl(disc->cd_desc,CDROMEJECT)<0) {
+ g_print(_("Eject failed: %d"),errno);
return FALSE;
+ }
#endif
return TRUE;