Hi, Charles Curley wrote: > If I read the source for VLC correctly, VLC uses a SCSI ioctl to attempt to > eject. > https://github.com/videolan/vlc/blob/master/modules/gui/eject.c
Yes. EjectSCSI() in line 67 does what a burn program would do for ejecting an optical medium. But the ioctl SCSI_IOCTL_SEND_COMMAND is the dull way to perform an SCSI transaction. If the drive does not like the command, then the caller of this ioctl gets no specific error indication. (I wonder about the middle ioctl SCSI_IOCTL_SEND_COMMAND which tells the drive to speed up. The third ioctl then tells it to slow down and to eject the tray.) (The call of ioctl( i_fd, BLKRRPART ) will do nothing with /dev/sr. Regrettably Linux does not offer an ioctl to re-assess optical media.) The message "could not eject" seems to come from a combined attempt in line 163 with ioctl( fd, CDROMEJECT, 0 ) and above SCSI gesture. The ioctl CDROMEJECT will in the kernel cause similar SCSI commands as EjectSCSI() emits. > One of those four methods is via SCSI. When I specify that method, > eject ejects the CD/DVD. > charles@jhegaala:~$ eject -s /dev/sr0 Does eject -r /dev/sr0 work too ? > Any thoughts? One would have to modify the code to learn which errno comes back from the ioctls when one of them fails. I.e.: Line 163: Separate the call of ioctl( fd, CDROMEJECT, 0 ) from the call of EjectSCSI( fd ) and print the errno value after each of them. Lines 85, 96, 107: Print the failed SCSI command name ("ALLOW_MEDIA_REMOVAL", "START", or "STOP_EJECT") and the errno value before returning VLC_EGENERIC. If one of the ioctls SCSI_IOCTL_SEND_COMMAND indicates failure, then one would have to replace it by ioctl(SG_IO) with its more elaborate struct sg_io_hdr_t , which would return the SCSI error code triple. I could make proposals how to do that.But this will be no picknick. Have a nice day :) Thomas