]> git.sesse.net Git - vlc/commitdiff
* modules/access/*: pf_read() in access modules is now blocking. We still
authorGildas Bazin <gbazin@videolan.org>
Mon, 24 Mar 2003 17:15:30 +0000 (17:15 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 24 Mar 2003 17:15:30 +0000 (17:15 +0000)
   check regularly for p_input->b_die though. Now the demuxers can safely
   assume that pf_read() == 0 means EOF.
* ALL: got rid of the p_input->b_connected flag.
* src/input/input_ext-plugins.c, src/input/input.c: fixed the infinite loop
   of "decoder stuck" messages that sometimes happened.
* src/interface/intf_eject.c, modules/misc/network/ipv4.c: fixed compilation
   warnings.

18 files changed:
include/input_ext-intf.h
modules/access/directory.c
modules/access/dvd/access.c
modules/access/dvdplay/access.c
modules/access/dvdread/input.c
modules/access/file.c
modules/access/ftp.c
modules/access/http.c
modules/access/mms/mms.c
modules/access/satellite/access.c
modules/access/slp.c
modules/access/udp.c
modules/access/v4l/v4l.c
modules/access/vcd/vcd.c
modules/misc/network/ipv4.c
src/input/input.c
src/input/input_ext-plugins.c
src/interface/intf_eject.c

index 99e37b93c43085a1c3ff380c4ef44c14bbb6d316..fa6acdbd1be06d84977bca6112485be72d65d495 100644 (file)
@@ -4,7 +4,7 @@
  * control the pace of reading.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: input_ext-intf.h,v 1.86 2003/03/09 23:39:05 jlj Exp $
+ * $Id: input_ext-intf.h,v 1.87 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -222,7 +222,6 @@ struct stream_descriptor_t
                                                disc or network */
     vlc_bool_t              b_pace_control;    /* can we read when we want ? */
     vlc_bool_t              b_seekable;               /* can we do lseek() ? */
-    vlc_bool_t              b_connected;     /* does read() == 0 imply EOF ? */
 
     /* if (b_seekable) : */
     unsigned int            i_area_nb;
index de33727c11f6ad48caab106bc330ef3575faf330..ce08002bac3f3b407aa0152b7252b48aa6375f4b 100644 (file)
@@ -2,7 +2,7 @@
  * directory.c: expands a directory (directory: access plug-in)
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: directory.c,v 1.2 2003/03/24 01:39:58 gbazin Exp $
+ * $Id: directory.c,v 1.3 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Derk-Jan Hartman <thedj@users.sourceforge.net>
  *
@@ -238,7 +238,6 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
         p_access_data->i_buf_pos += i_ret;
         return (ssize_t) i_ret;
     }
-    
-    p_input->stream.b_connected = VLC_TRUE;
+
     return 0;
 }
index 0ce1fae5faa44656673357bdc2681e68078589ff..ffeba628d899dd417cf6ac8a416af24e08132342 100644 (file)
@@ -8,7 +8,7 @@
  *  -udf.* to find files
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: access.c,v 1.11 2003/03/11 23:56:53 gbazin Exp $
+ * $Id: access.c,v 1.12 2003/03/24 17:15:29 gbazin Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -191,7 +191,6 @@ int E_(DVDOpen) ( vlc_object_t *p_this )
     p_input->stream.i_method = INPUT_METHOD_DVD;
     p_input->stream.b_pace_control = 1;
     p_input->stream.b_seekable = 1;
-    p_input->stream.b_connected = 1;
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.p_selected_area->i_tell = 0;
 
index f0787d7050e3b57649299d011c8b4154d1d8079f..6fe3685a9e504a5392b0b729ce748f0360efebf9 100644 (file)
@@ -2,7 +2,7 @@
  * access.c: access capabilities for dvdplay plugin.
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: access.c,v 1.14 2003/03/24 14:18:28 hartman Exp $
+ * $Id: access.c,v 1.15 2003/03/24 17:15:29 gbazin Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -130,7 +130,6 @@ int E_(OpenDVD) ( vlc_object_t *p_this )
     p_input->stream.b_pace_control = 1;
     /* seek is only allowed when we have size info */
     p_input->stream.b_seekable = 0;
-    p_input->stream.b_connected = 1;
 
     /* Initialize ES structures */
     input_InitStream( p_input, sizeof( stream_ps_data_t ) );
index e8cf171911d691cbb642f026a9dfbb41965dbb73..eb52382314ce4ec511fcc62170a255fc7342b5f7 100644 (file)
@@ -6,7 +6,7 @@
  * It depends on: libdvdread for ifo files and block reading.
  *****************************************************************************
  * Copyright (C) 2001, 2003 VideoLAN
- * $Id: input.c,v 1.18 2003/03/24 14:18:28 hartman Exp $
+ * $Id: input.c,v 1.19 2003/03/24 17:15:29 gbazin Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -364,7 +364,6 @@ int E_(OpenDVD) ( vlc_object_t *p_this )
     /* If we are here we can control the pace... */
     p_input->stream.b_pace_control = VLC_TRUE;
     p_input->stream.b_seekable = VLC_TRUE;
-    p_input->stream.b_connected = VLC_TRUE;
 
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.p_selected_area->i_tell = 0;
index e75048d38e1d2700f34a04fe0f728038cf718b1c..98553b64a88c2a06ac463d540fd31b12f12013db 100644 (file)
@@ -2,7 +2,7 @@
  * file.c: file input (file: access plug-in)
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: file.c,v 1.13 2003/03/04 21:12:04 gbazin Exp $
+ * $Id: file.c,v 1.14 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -130,7 +130,6 @@ static int Open( vlc_object_t *p_this )
 
     vlc_mutex_lock( &p_input->stream.stream_lock );
 
-    p_input->stream.b_connected = 1;
     if( *p_input->psz_access && !strncmp( p_input->psz_access, "stream", 7 ) )
     {
         /* stream:%s */
index f16d9589332396282e705d54834c19030f3c3553..8d77c52b29b8c0b6e56ca1f5ab3fb1d56caa0845 100644 (file)
@@ -2,7 +2,7 @@
  * ftp.c:
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: ftp.c,v 1.9 2003/03/03 14:21:08 gbazin Exp $
+ * $Id: ftp.c,v 1.10 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -374,7 +374,6 @@ static int Open( vlc_object_t *p_this )
     p_input->stream.b_pace_control = 1;
     p_input->stream.p_selected_area->i_tell = 0;
     p_input->stream.b_seekable = 1;
-    p_input->stream.b_connected = 1;
     p_input->stream.p_selected_area->i_size = p_access->i_filesize;
     p_input->stream.i_method = INPUT_METHOD_NETWORK;
     vlc_mutex_unlock( &p_input->stream.stream_lock );
@@ -817,6 +816,7 @@ static ssize_t NetRead( input_thread_t *p_input,
 #else
     struct timeval  timeout;
     fd_set          fds;
+    ssize_t         i_recv;
     int             i_ret;
 
     /* Initialize file descriptor set */
@@ -828,26 +828,30 @@ static ssize_t NetRead( input_thread_t *p_input,
     timeout.tv_usec = 1000000;
 
     /* Find if some data is available */
-    i_ret = select( p_socket->i_handle + 1, &fds,
-                    NULL, NULL, &timeout );
+    while( (i_ret = select( p_socket->i_handle + 1, &fds,
+                            NULL, NULL, &timeout )) == 0
+           || (i_ret < 0 && errno == EINTR) )
+    {
+        if( p_input->b_die || p_input->b_error )
+        {
+            return 0;
+        }
+    }
 
-    if( i_ret == -1 && errno != EINTR )
+    if( i_ret < 0 )
     {
         msg_Err( p_input, "network select error (%s)", strerror(errno) );
+        return -1;
     }
-    else if( i_ret > 0 )
-    {
-        ssize_t i_recv = recv( p_socket->i_handle, p_buffer, i_len, 0 );
 
-        if( i_recv < 0 )
-        {
-            msg_Err( p_input, "recv failed (%s)", strerror(errno) );
-        }
+    i_recv = recv( p_socket->i_handle, p_buffer, i_len, 0 );
 
-        return i_recv;
+    if( i_recv < 0 )
+    {
+        msg_Err( p_input, "recv failed (%s)", strerror(errno) );
     }
 
-    return 0;
+    return i_recv;
 
 #endif
 }
index 9c83c6a4800391cd1c8d52fa6990280923541b01..1494a54c8fe8bf63cf90bcbea6abd9b0edbf7f76 100644 (file)
@@ -2,7 +2,7 @@
  * http.c: HTTP access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: http.c,v 1.27 2003/03/22 23:03:02 sigmunau Exp $
+ * $Id: http.c,v 1.28 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -611,7 +611,6 @@ static int Open( vlc_object_t *p_this )
     vlc_mutex_lock( &p_input->stream.stream_lock );
     p_input->stream.b_pace_control = VLC_TRUE;
     p_input->stream.b_seekable = VLC_TRUE;
-    p_input->stream.b_connected = VLC_TRUE;
     p_input->stream.p_selected_area->i_tell = 0;
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.i_method = INPUT_METHOD_NETWORK;
@@ -700,6 +699,7 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
     input_socket_t * p_access_data = (input_socket_t *)p_input->p_access_data;
     struct timeval  timeout;
     fd_set          fds;
+    ssize_t         i_recv;
     int             i_ret;
 
     /* Initialize file descriptor set */
@@ -711,35 +711,35 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
     timeout.tv_usec = 500000;
 
     /* Find if some data is available */
-    i_ret = select( p_access_data->i_handle + 1, &fds,
-                    NULL, NULL, &timeout );
-
+    while( (i_ret = select( p_access_data->i_handle + 1, &fds,
+                            NULL, NULL, &timeout )) == 0
 #ifdef HAVE_ERRNO_H
-    if( i_ret == -1 && errno != EINTR )
+           || (i_ret < 0 && errno == EINTR)
+#endif
+           )
     {
-        msg_Err( p_input, "network select error (%s)", strerror(errno) );
+        if( p_input->b_die || p_input->b_error )
+        {
+            return 0;
+        }
     }
-#else
-    if( i_ret == -1 )
+
+    if( i_ret < 0 )
     {
         msg_Err( p_input, "network select error" );
+        return -1;
     }
-#endif
-    else if( i_ret > 0 )
-    {
-        ssize_t i_recv = recv( p_access_data->i_handle, p_buffer, i_len, 0 );
 
-        if( i_recv < 0 )
-        {
+    i_recv = recv( p_access_data->i_handle, p_buffer, i_len, 0 );
+
+    if( i_recv < 0 )
+    {
 #ifdef HAVE_ERRNO_H
-            msg_Err( p_input, "recv failed (%s)", strerror(errno) );
+        msg_Err( p_input, "recv failed (%s)", strerror(errno) );
 #else
-            msg_Err( p_input, "recv failed" );
+        msg_Err( p_input, "recv failed" );
 #endif
-        }
-
-        return i_recv;
     }
 
-    return 0;
+    return i_recv;
 }
index da5e2f347e7cd3e780e79a6f4fde613505b32c91..bfaeb16a580e7ad74b51760c2ae2cf3707ceef32 100644 (file)
@@ -2,7 +2,7 @@
  * mms.c: MMS access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mms.c,v 1.27 2003/03/16 01:49:28 fenrir Exp $
+ * $Id: mms.c,v 1.28 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -252,14 +252,6 @@ static int Open( vlc_object_t *p_this )
     /* *** finished to set some variable *** */
     vlc_mutex_lock( &p_input->stream.stream_lock );
     p_input->stream.b_pace_control = 0;
-    if( p_access->i_proto == MMS_PROTO_UDP )
-    {
-        p_input->stream.b_connected = 0;
-    }
-    else
-    {
-        p_input->stream.b_connected = 1;
-    }
     p_input->stream.p_selected_area->i_tell = 0;
     /*
      * i_flags_broadcast
@@ -1477,11 +1469,17 @@ static int  NetFillBuffer( input_thread_t *p_input )
     timeout.tv_usec = 500000;
 
     /* Find if some data is available */
-    i_ret = select( i_handle_max + 1,
-                    &fds,
-                    NULL, NULL, &timeout );
+    while( (i_ret = select( i_handle_max + 1, &fds,
+                            NULL, NULL, &timeout )) == 0
+           || (i_ret < 0 && errno == EINTR) )
+    {
+        if( p_input->b_die || p_input->b_error )
+        {
+            return 0;
+        }
+    }
 
-    if( i_ret == -1 && errno != EINTR )
+    if( i_ret < 0 )
     {
         msg_Err( p_input, "network select error (%s)", strerror(errno) );
         return -1;
index 252f3a0b4a6d7d42229c01f9fcc1b4526c73e71e..e4a9269ddde55f7dadee121a3db1779bb5533f6f 100644 (file)
@@ -287,7 +287,6 @@ int E_(Open) ( vlc_object_t *p_this )
 
     p_input->stream.b_pace_control = 1;
     p_input->stream.b_seekable = 0;
-    p_input->stream.b_connected = 0;
     p_input->stream.p_selected_area->i_tell = 0;
 
     vlc_mutex_unlock( &p_input->stream.stream_lock );
index 45cc05cb3f2953080d34e854b4e2c812ae94afc8..8fb92dbae277813ea0a0bdd4e1d1cb0e3d3f71e8 100644 (file)
@@ -2,7 +2,7 @@
  * slp.c: SLP access plugin
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: slp.c,v 1.8 2003/02/20 01:52:45 sigmunau Exp $
+ * $Id: slp.c,v 1.9 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Loïc Minier <lool@videolan.org>
  *
@@ -340,7 +340,6 @@ static int Open( vlc_object_t * p_this )
     vlc_mutex_lock( &p_input->stream.stream_lock );
     p_input->stream.b_pace_control = VLC_FALSE;
     p_input->stream.b_seekable = VLC_FALSE;
-    p_input->stream.b_connected = VLC_TRUE;
     p_input->stream.p_selected_area->i_tell = 0;
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.i_method = INPUT_METHOD_SLP;
index b84c69dd27f3a8a608db06e847f414104d15c6f3..6957eed6eeb9b2a0b4a9d628c95ab0844ba2a7e2 100644 (file)
@@ -2,7 +2,7 @@
  * udp.c: raw UDP & RTP access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: udp.c,v 1.15 2003/03/03 14:21:08 gbazin Exp $
+ * $Id: udp.c,v 1.16 2003/03/24 17:15:29 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Tristan Leteurtre <tooney@via.ecp.fr>
@@ -235,7 +235,6 @@ static int Open( vlc_object_t *p_this )
     vlc_mutex_lock( &p_input->stream.stream_lock );
     p_input->stream.b_pace_control = 0;
     p_input->stream.b_seekable = 0;
-    p_input->stream.b_connected = 0;
     p_input->stream.p_selected_area->i_tell = 0;
     p_input->stream.i_method = INPUT_METHOD_NETWORK;
     vlc_mutex_unlock( &p_input->stream.stream_lock );
@@ -324,6 +323,7 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
     input_socket_t * p_access_data = (input_socket_t *)p_input->p_access_data;
     struct timeval  timeout;
     fd_set          fds;
+    ssize_t         i_recv;
     int             i_ret;
 
     /* Initialize file descriptor set */
@@ -335,38 +335,42 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
     timeout.tv_usec = 500000;
 
     /* Find if some data is available */
-    i_ret = select( p_access_data->i_handle + 1, &fds,
-                    NULL, NULL, &timeout );
+    while( (i_ret = select( p_access_data->i_handle + 1, &fds,
+                            NULL, NULL, &timeout )) == 0
+           || (i_ret < 0 && errno == EINTR) )
+    {
+        if( p_input->b_die || p_input->b_error )
+        {
+            return 0;
+        }
+    }
 
-    if( i_ret == -1 && errno != EINTR )
+    if( i_ret < 0 )
     {
         msg_Err( p_input, "network select error (%s)", strerror(errno) );
+        return -1;
     }
-    else if( i_ret > 0 )
-    {
-        ssize_t i_recv = recv( p_access_data->i_handle, p_buffer, i_len, 0 );
 
-        if( i_recv < 0 )
-        {
+    i_recv = recv( p_access_data->i_handle, p_buffer, i_len, 0 );
+
+    if( i_recv < 0 )
+    {
 #ifdef WIN32
-            /* On win32 recv() will fail if the datagram doesn't fit inside
-             * the passed buffer, even though the buffer will be filled with
-             * the first part of the datagram. */
-            if( WSAGetLastError() == WSAEMSGSIZE )
-            {
-                msg_Err( p_input, "recv() failed. "
-                                  "Increase the mtu size (--mtu option)" );
-                i_recv = i_len;
-            }
-            else
+        /* On win32 recv() will fail if the datagram doesn't fit inside
+        * the passed buffer, even though the buffer will be filled with
+        * the first part of the datagram. */
+        if( WSAGetLastError() == WSAEMSGSIZE )
+       {
+           msg_Err( p_input, "recv() failed. "
+                    "Increase the mtu size (--mtu option)" );
+           i_recv = i_len;
+       }
+       else
 #endif
-            msg_Err( p_input, "recv failed (%s)", strerror(errno) );
-        }
-
-        return i_recv;
+           msg_Err( p_input, "recv failed (%s)", strerror(errno) );
     }
 
-    return 0;
+    return i_recv;
 
 #endif
 }
index d02bd2b95a7e33e0b148e2186aa524e98e94133d..0a1d203e0b47058b3f044ee0ac2d3249fc15c0f1 100644 (file)
@@ -2,7 +2,7 @@
  * v4l.c : Video4Linux input module for vlc
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: v4l.c,v 1.2 2002/12/31 01:54:36 massiot Exp $
+ * $Id: v4l.c,v 1.3 2003/03/24 17:15:30 gbazin Exp $
  *
  * Author: Samuel Hocevar <sam@zoy.org>
  *
@@ -64,7 +64,6 @@ static int V4lOpen( vlc_object_t *p_this )
     vlc_mutex_lock( &p_input->stream.stream_lock );
     p_input->stream.b_pace_control = 0;
     p_input->stream.b_seekable = 0;
-    p_input->stream.b_connected = 0;
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.p_selected_area->i_tell = 0;
     p_input->stream.i_method = INPUT_METHOD_FILE;
index 14e84ed2cd642650d3865f91a4e8e3f02bae5cad..3a7257adbbc10e2a3cba1909cc660a877c85b05c 100644 (file)
@@ -2,7 +2,7 @@
  * vcd.c : VCD input module for vlc
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: vcd.c,v 1.16 2003/03/11 23:56:54 gbazin Exp $
+ * $Id: vcd.c,v 1.17 2003/03/24 17:15:30 gbazin Exp $
  *
  * Author: Johan Bilien <jobi@via.ecp.fr>
  *
@@ -171,7 +171,6 @@ static int VCDOpen( vlc_object_t *p_this )
 
     p_input->stream.b_pace_control = 1;
     p_input->stream.b_seekable = 1;
-    p_input->stream.b_connected = 1;
     p_input->stream.p_selected_area->i_size = 0;
     p_input->stream.p_selected_area->i_tell = 0;
 
index 3501ffbb587efeff156e8b36b213182cd068516b..ec0e589316affb28fbd72bc68c0699d25e84dbea 100644 (file)
@@ -2,7 +2,7 @@
  * ipv4.c: IPv4 network abstraction layer
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: ipv4.c,v 1.16 2003/03/11 13:52:25 titer Exp $
+ * $Id: ipv4.c,v 1.17 2003/03/24 17:15:30 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Mathias Kretschmer <mathias@research.att.com>
@@ -384,7 +384,7 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
                 ttl = 1;
 
             if( setsockopt( i_handle, IPPROTO_IP, IP_MULTICAST_TTL,
-                            &ttl, sizeof( ttl ) ) < 0 )
+                            (void *) &ttl, sizeof( ttl ) ) < 0 )
             {
 #ifdef HAVE_ERRNO_H
                 msg_Warn( p_this, "failed to set ttl (%s)",
index 8060c5928eb72e81ab173503e0674cbf92bdbcae..55cf7c01f634ac4e97e34e0924dd95831a318f1e 100644 (file)
@@ -4,7 +4,7 @@
  * decoders.
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: input.c,v 1.225 2003/03/14 00:24:08 sigmunau Exp $
+ * $Id: input.c,v 1.226 2003/03/24 17:15:30 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -341,7 +341,7 @@ static int RunThread( input_thread_t *p_input )
         /* Read and demultiplex some data. */
         i_count = p_input->pf_demux( p_input );
 
-        if( i_count == 0 && p_input->stream.b_connected )
+        if( i_count == 0 )
         {
             /* End of file - we do not set b_die because only the
              * playlist is allowed to do so. */
index 14b6f4eca14a5123d5e0785f910ea7c772a7ef04..2802c14ac01fb88bc42533e06324ec04365a3996 100644 (file)
@@ -2,7 +2,7 @@
  * input_ext-plugins.c: useful functions for access and demux plug-ins
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: input_ext-plugins.c,v 1.30 2003/03/05 17:55:13 gbazin Exp $
+ * $Id: input_ext-plugins.c,v 1.31 2003/03/24 17:15:30 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -517,6 +517,12 @@ ssize_t input_FillBuffer( input_thread_t * p_input )
                               (byte_t *)p_buf + sizeof(data_buffer_t)
                                + i_remains,
                               p_input->i_bufsize );
+    if( i_ret < 0 && i_remains == 0 )
+    {
+        /* Our internal buffers are empty, we can signal the error */
+        return -1;
+    }
+
     if( i_ret < 0 ) i_ret = 0;
 
     p_input->p_data_buffer = p_buf;
@@ -538,7 +544,7 @@ ssize_t input_Peek( input_thread_t * p_input, byte_t ** pp_byte, size_t i_size )
         /* Go to the next buffer */
         ssize_t i_ret = input_FillBuffer( p_input );
 
-        if( i_ret == -1 )
+        if( i_ret < 0 )
         {
             return -1;
         }
@@ -564,7 +570,7 @@ ssize_t input_SplitBuffer( input_thread_t * p_input,
         /* Go to the next buffer */
         ssize_t i_ret = input_FillBuffer( p_input );
 
-        if( i_ret == -1 )
+        if( i_ret < 0 )
         {
             return -1;
         }
index 58a45d92f75da4eb87098e8819b43c97e4bf8586..36e0f5e13136fd6daac20c9a83a80584519be0a4 100644 (file)
@@ -2,7 +2,7 @@
  * intf_eject.c: CD/DVD-ROM ejection handling functions
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: intf_eject.c,v 1.19 2003/03/21 17:14:56 gbazin Exp $
+ * $Id: intf_eject.c,v 1.20 2003/03/24 17:15:30 gbazin Exp $
  *
  * Author: Julien Blache <jb@technologeek.org> for the Linux part
  *               with code taken from the Linux "eject" command
@@ -157,11 +157,13 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device )
     {
         st.dwItem = MCI_STATUS_READY;
        /* Eject disc */
-        mciSendCommand( op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0 );
+        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;
 
+    return i_ret;
 #else   /* WIN32 */
 
     int i_fd;