/*****************************************************************************
* Preamble
*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_sout.h>
static ssize_t Write( sout_access_out_t *, block_t * );
static int Seek ( sout_access_out_t *, off_t );
static ssize_t Read ( sout_access_out_t *, block_t * );
+static int Control( sout_access_out_t *, int, va_list );
struct sout_access_out_sys_t
{
p_access->pf_write = Write;
p_access->pf_read = Read;
p_access->pf_seek = Seek;
+ p_access->pf_control = Control;
p_access->p_sys = (void *)(intptr_t)fd;
msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path );
if (append)
lseek (fd, 0, SEEK_END);
- /* Update pace control flag */
- if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) )
- p_access->p_sout->i_out_pace_nocontrol++;
-
return VLC_SUCCESS;
}
close( (intptr_t)p_access->p_sys );
- /* Update pace control flag */
- if( p_access->psz_access && !strcmp( p_access->psz_access, "stream" ) )
- p_access->p_sout->i_out_pace_nocontrol--;
-
msg_Dbg( p_access, "file access output closed" );
}
+static int Control( sout_access_out_t *p_access, int i_query, va_list args )
+{
+ switch( i_query )
+ {
+ case ACCESS_OUT_CONTROLS_PACE:
+ {
+ bool *pb = va_arg( args, bool * );
+ *pb = strcmp( p_access->psz_access, "stream" );
+ break;
+ }
+
+ default:
+ return VLC_EGENERIC;
+ }
+ return VLC_SUCCESS;
+}
+
/*****************************************************************************
* Read: standard read on a file descriptor.
*****************************************************************************/
static ssize_t Read( sout_access_out_t *p_access, block_t *p_buffer )
{
- return read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
- p_buffer->i_buffer );
+ ssize_t val;
+
+ do
+ val = read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
+ p_buffer->i_buffer );
+ while (val == -1 && errno == EINTR);
+ return val;
}
/*****************************************************************************
while( p_buffer )
{
- block_t *p_next = p_buffer->p_next;;
-
- i_write += write( (intptr_t)p_access->p_sys,
- p_buffer->p_buffer, p_buffer->i_buffer );
- block_Release( p_buffer );
-
- p_buffer = p_next;
+ ssize_t val = write ((intptr_t)p_access->p_sys,
+ p_buffer->p_buffer, p_buffer->i_buffer);
+ if (val == -1)
+ {
+ if (errno == EINTR)
+ continue;
+ block_ChainRelease (p_buffer);
+ return -1;
+ }
+
+ if ((size_t)val >= p_buffer->i_buffer)
+ {
+ block_t *p_next = p_buffer->p_next;
+ block_Release (p_buffer);
+ p_buffer = p_next;
+ }
+ else
+ {
+ p_buffer->p_buffer += val;
+ p_buffer->i_buffer -= val;
+ }
+ i_write += val;
}
-
return i_write;
}