[vlc-commits] intf_Eject: remove Linux <= 2.0 support, fix error handling

Rémi Denis-Courmont git at videolan.org
Fri Nov 25 15:45:41 CET 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Nov 25 16:30:03 2011 +0200| [fd1b32a38c5a29b300bda0433d97bf595722d467] | committer: Rémi Denis-Courmont

intf_Eject: remove Linux <= 2.0 support, fix error handling

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fd1b32a38c5a29b300bda0433d97bf595722d467
---

 src/interface/intf_eject.c |  231 ++++++++++++++++----------------------------
 1 files changed, 85 insertions(+), 146 deletions(-)

diff --git a/src/interface/intf_eject.c b/src/interface/intf_eject.c
index 98f95d4..21818a3 100644
--- a/src/interface/intf_eject.c
+++ b/src/interface/intf_eject.c
@@ -34,53 +34,83 @@
 #endif
 
 #include <vlc_common.h>
+#include <vlc_fs.h>
+#include <vlc_interface.h>
 
-#ifdef HAVE_UNISTD_H
-#    include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-#   include <fcntl.h>
-#endif
-
-#ifdef HAVE_DVD_H
-#   include <dvd.h>
-#endif
-
-#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H)
-#   include <linux/version.h>
-    /* handy macro found in 2.1 kernels, but not in older ones */
-#   ifndef KERNEL_VERSION
-#       define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-#   endif
-
+#if defined( WIN32 ) && !defined( UNDER_CE )
+#   include <mmsystem.h>
+#elif defined(__linux__)
 #   include <sys/types.h>
-#   include <sys/ioctl.h>
-
+#   include <unistd.h>
+#   include <fcntl.h>
 #   include <sys/ioctl.h>
 #   include <sys/mount.h>
 
 #   include <linux/cdrom.h>
-#   if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
-#       include <linux/ucdrom.h>
-#   endif
 
 #   include <scsi/scsi.h>
 #   include <scsi/sg.h>
 #   include <scsi/scsi_ioctl.h>
+#elif defined (HAVE_DVD_H)
+#   include <unistd.h>
+#   include <fcntl.h>
+#   include <dvd.h>
 #endif
 
-#if defined( WIN32 ) && !defined( UNDER_CE )
-#   include <mmsystem.h>
-#endif
+#if defined(__linux__)
+/**
+ * \brief Ejects the CD /DVD using SCSI commands
+ * \ingroup vlc_interface
+ * This function is local
+ * \param i_fd a device nummber
+ * \return 0 on success, VLC_EGENERIC on failure
+ */
+static int EjectSCSI( int i_fd )
+{
+    struct sdata
+    {
+        int  inlen;
+        int  outlen;
+        char cmd[256];
+    } scsi_cmd;
 
-#include <vlc_interface.h>
+    scsi_cmd.inlen  = 0;
+    scsi_cmd.outlen = 0;
+    scsi_cmd.cmd[0] = ALLOW_MEDIUM_REMOVAL;
+    scsi_cmd.cmd[1] = 0;
+    scsi_cmd.cmd[2] = 0;
+    scsi_cmd.cmd[3] = 0;
+    scsi_cmd.cmd[4] = 0;
+    scsi_cmd.cmd[5] = 0;
+    if( ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd ) < 0 )
+        return VLC_EGENERIC;
 
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H)
-static int EjectSCSI ( int i_fd );
+    scsi_cmd.inlen  = 0;
+    scsi_cmd.outlen = 0;
+    scsi_cmd.cmd[0] = START_STOP;
+    scsi_cmd.cmd[1] = 0;
+    scsi_cmd.cmd[2] = 0;
+    scsi_cmd.cmd[3] = 0;
+    scsi_cmd.cmd[4] = 1;
+    scsi_cmd.cmd[5] = 0;
+    if( ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd ) < 0 )
+        return VLC_EGENERIC;
+
+    scsi_cmd.inlen  = 0;
+    scsi_cmd.outlen = 0;
+    scsi_cmd.cmd[0] = START_STOP;
+    scsi_cmd.cmd[1] = 0;
+    scsi_cmd.cmd[2] = 0;
+    scsi_cmd.cmd[3] = 0;
+    scsi_cmd.cmd[4] = 2;
+    scsi_cmd.cmd[5] = 0;
+    if( ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd ) < 0 )
+        return VLC_EGENERIC;
+
+    /* Force kernel to reread partition table when new disc inserted */
+    ioctl( i_fd, BLKRRPART );
+    return VLC_SUCCESS;
+}
 #endif
 
 #undef intf_Eject
@@ -94,12 +124,12 @@ static int EjectSCSI ( int i_fd );
 int intf_Eject( vlc_object_t *p_this, const char *psz_device )
 {
     VLC_UNUSED(p_this);
-    int i_ret = VLC_SUCCESS;
 
 #ifdef __APPLE__
     FILE *p_eject;
     char *psz_disk;
     char sz_cmd[32];
+    int i_ret;
 
     /*
      * The only way to cleanly unmount the disc under MacOS X
@@ -139,10 +169,6 @@ int intf_Eject( vlc_object_t *p_this, const char *psz_device )
 
     return VLC_EGENERIC;
 
-#elif defined(UNDER_CE)
-    msg_Warn( p_this, "CD-Rom ejection unsupported on this platform" );
-    return i_ret;
-
 #elif defined(WIN32)
     MCI_OPEN_PARMS op;
     DWORD i_flags;
@@ -159,128 +185,41 @@ int intf_Eject( vlc_object_t *p_this, const char *psz_device )
     i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
               MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE;
 
-    if( !mciSendCommand( 0, MCI_OPEN, i_flags, (uintptr_t)&op ) )
-    {
-        /* Eject disc */
-        i_ret = mciSendCommand( op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0 );
-        /* Release access to the device */
-        mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 );
-    }
-    else i_ret = VLC_EGENERIC;
+    if( mciSendCommand( 0, MCI_OPEN, i_flags, (uintptr_t)&op ) )
+        return VLC_EGENERIC;
 
-    return i_ret;
-#else   /* WIN32 */
+    /* Eject disc */
+    mciSendCommand( op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0 );
+    /* Release access to the device */
+    mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 );
 
-    int i_fd;
+    return VLC_SUCCESS;
 
+#elif defined (__linux__) || defined (HAVE_DVD_H)
     /* This code could be extended to support CD/DVD-ROM chargers */
-
-    i_fd = open( psz_device, O_RDONLY | O_NONBLOCK );
-
-    if( i_fd == -1 )
+    int fd = vlc_open( psz_device, O_RDONLY | O_NONBLOCK );
+    if( fd == -1 )
     {
         msg_Err( p_this, "could not open device %s", psz_device );
         return VLC_EGENERIC;
     }
 
-#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H)
+# if defined(__linux__)
     /* Try a simple ATAPI eject */
-    i_ret = ioctl( i_fd, CDROMEJECT, 0 );
-
-    if( i_ret != 0 )
-    {
-        i_ret = EjectSCSI( i_fd );
-    }
-
-    if( i_ret != 0 )
+    if( ioctl( fd, CDROMEJECT, 0 ) < 0
+     && EjectSCSI( fd ) )
+# else
+    if( ioctl( fd, CDROMEJECT, 0 ) < 0 )
+# endif
     {
         msg_Err( p_this, "could not eject %s", psz_device );
+        close( fd );
+        return VLC_EGENERIC;
     }
-
-#elif defined (HAVE_DVD_H)
-    i_ret = ioctl( i_fd, CDROMEJECT, 0 );
+    return VLC_SUCCESS;
 
 #else
-    msg_Warn( p_this, "CD-ROM ejection unsupported on this platform" );
-    i_ret = -1;
-
-#endif
-    close( i_fd );
-
-    return i_ret;
+    msg_Warn( p_this, "CD-Rom ejection unsupported on this platform" );
+    return VLC_EGENERIC;
 #endif
 }
-
-/* The following functions are local */
-
-#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H)
-/*****************************************************************************
- * Eject using SCSI commands. Return 0 if successful
- *****************************************************************************/
-/**
- * \brief Ejects the CD /DVD using SCSI commands
- * \ingroup vlc_interface
- * This function is local
- * \param i_fd a device nummber
- * \return 0 on success, VLC_EGENERIC on failure
- */
-static int EjectSCSI( int i_fd )
-{
-    int i_status;
-
-    struct sdata
-    {
-        int  inlen;
-        int  outlen;
-        char cmd[256];
-    } scsi_cmd;
-
-    scsi_cmd.inlen  = 0;
-    scsi_cmd.outlen = 0;
-    scsi_cmd.cmd[0] = ALLOW_MEDIUM_REMOVAL;
-    scsi_cmd.cmd[1] = 0;
-    scsi_cmd.cmd[2] = 0;
-    scsi_cmd.cmd[3] = 0;
-    scsi_cmd.cmd[4] = 0;
-    scsi_cmd.cmd[5] = 0;
-    i_status = ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd );
-    if( i_status != 0 )
-    {
-        return VLC_EGENERIC;
-    }
-
-    scsi_cmd.inlen  = 0;
-    scsi_cmd.outlen = 0;
-    scsi_cmd.cmd[0] = START_STOP;
-    scsi_cmd.cmd[1] = 0;
-    scsi_cmd.cmd[2] = 0;
-    scsi_cmd.cmd[3] = 0;
-    scsi_cmd.cmd[4] = 1;
-    scsi_cmd.cmd[5] = 0;
-    i_status = ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd );
-    if( i_status != 0 )
-    {
-        return VLC_EGENERIC;
-    }
-
-    scsi_cmd.inlen  = 0;
-    scsi_cmd.outlen = 0;
-    scsi_cmd.cmd[0] = START_STOP;
-    scsi_cmd.cmd[1] = 0;
-    scsi_cmd.cmd[2] = 0;
-    scsi_cmd.cmd[3] = 0;
-    scsi_cmd.cmd[4] = 2;
-    scsi_cmd.cmd[5] = 0;
-    i_status = ioctl( i_fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd );
-    if( i_status != 0 )
-    {
-        return VLC_EGENERIC;
-    }
-
-    /* Force kernel to reread partition table when new disc inserted */
-    i_status = ioctl( i_fd, BLKRRPART );
-
-    return i_status;
-}
-#endif
-



More information about the vlc-commits mailing list