]> git.sesse.net Git - vlc/blobdiff - plugins/vcd/input_vcd.c
* ./extras/MacOSX_dvdioctl: removed outdated files.
[vlc] / plugins / vcd / input_vcd.c
index 3ff8fd4f4ad7e0ff03d4f9ca023c23add2794326..fa850ba7c5e2aa6af189645016d34ff2c870ea00 100644 (file)
 
 #include <fcntl.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <string.h>
 #include <errno.h>
 
-#ifdef STRNCASECMP_IN_STRINGS_H
-#   include <strings.h>
-#endif
-
 #if defined( WIN32 )
 #   include <io.h>                                                 /* read() */
 #else
@@ -121,22 +118,14 @@ static int VCDOpen( struct input_thread_s *p_input )
     char *                  psz_parser;
     char *                  psz_source;
     char *                  psz_next;
+    struct stat             stat_info;
     thread_vcd_data_t *     p_vcd;
     int                     i;
     input_area_t *          p_area;
     int                     i_title = 1;
     int                     i_chapter = 1;
 
-    p_vcd = malloc( sizeof(thread_vcd_data_t) );
-
-    if( p_vcd == NULL )
-    {
-        intf_ErrMsg( "vcd error: out of memory" );
-        return -1;
-    }
-
-    p_input->i_mtu = VCD_DATA_ONCE;
-    p_input->p_access_data = (void *)p_vcd;
+    
 
     /* parse the options passed in command line : */
     psz_orig = psz_parser = psz_source = strdup( p_input->psz_name );
@@ -175,12 +164,40 @@ static int VCDOpen( struct input_thread_s *p_input )
             free( psz_orig );
             return -1;
         }
-        psz_source = config_GetPszVariable( INPUT_VCD_DEVICE_VAR );
+        psz_source = config_GetPszVariable( "vcd_device" );
     }
+
+    /* test the type of file given */
+    
+    if( stat( psz_source, &stat_info ) == -1 )
+    {
+        intf_ErrMsg( "input: vcd: cannot stat() source `%s' (%s)",
+                     psz_source, strerror(errno));
+        return( -1 );
+    }
+    
+    if( !S_ISBLK(stat_info.st_mode) )
+    {
+        intf_WarnMsg( 3, "input : VCD plugin discarded"
+                         " (not a valid drive)" );
+        return -1;
+    }
+    
+    
+    p_vcd = malloc( sizeof(thread_vcd_data_t) );
+
+    if( p_vcd == NULL )
+    {
+        intf_ErrMsg( "vcd error: out of memory" );
+        return -1;
+    }
+    
+    p_input->p_access_data = (void *)p_vcd;
+    
+    p_input->i_mtu = VCD_DATA_ONCE;
+   
     vlc_mutex_lock( &p_input->stream.stream_lock );
 
-    /* If we are here we can control the pace... */
     p_input->stream.b_pace_control = 1;
 
     p_input->stream.b_seekable = 1;
@@ -204,20 +221,24 @@ static int VCDOpen( struct input_thread_s *p_input )
     if( p_vcd->nb_tracks < 0 )
     {
         intf_ErrMsg( "input: vcd: was unable to count tracks" );
+        close( p_vcd->i_handle );
         free( p_vcd );
         return -1;
     }
     else if( p_vcd->nb_tracks <= 1 )
     {
         intf_ErrMsg( "input: vcd: no movie tracks found" );
+        close( p_vcd->i_handle );
         free( p_vcd );
         return -1;
     }
 
     p_vcd->p_sectors = ioctl_GetSectors( p_vcd->i_handle,
                                          psz_source );
-    if ( p_vcd->p_sectors == NULL )
+    if( p_vcd->p_sectors == NULL )
     {
+        input_BuffersEnd( p_input->p_method_data );
+        close( p_vcd->i_handle );
         free( p_vcd );
         return -1;
     }
@@ -259,19 +280,17 @@ static int VCDOpen( struct input_thread_s *p_input )
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
     p_input->psz_demux = "vcd";
-    
+
     return 0;
 }
 
-    
-
 /*****************************************************************************
  * VCDClose: closes vcd
  *****************************************************************************/
 static void VCDClose( struct input_thread_s *p_input )
 {
-    thread_vcd_data_t *     p_vcd
-        = (thread_vcd_data_t *)p_input->p_access_data;
+    thread_vcd_data_t *p_vcd = (thread_vcd_data_t *)p_input->p_access_data;
+
     close( p_vcd->i_handle );
     free( p_vcd );
 }
@@ -435,6 +454,11 @@ static int VCDInit( input_thread_t * p_input )
 {
     es_descriptor_t *       p_es;
     
+    if( p_input->stream.i_method != INPUT_METHOD_VCD )
+    {
+        return -1;
+    }
+
     vlc_mutex_lock( &p_input->stream.stream_lock );
     
     /* Set program information. */
@@ -475,13 +499,7 @@ static int VCDInit( input_thread_t * p_input )
  *****************************************************************************/
 static void VCDEnd( input_thread_t * p_input )
 {
-    thread_vcd_data_t *     p_vcd;
-
-    input_BuffersEnd( p_input->p_method_data );
-
-    p_vcd = (thread_vcd_data_t*)p_input->p_access_data;
-
-    free( p_vcd );
+    ;
 }