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

Reply via email to