Commit ce5d6635 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

access_out_file: fix non-atomic write and error handling

parent fbeaf830
...@@ -173,8 +173,13 @@ static void Close( vlc_object_t * p_this ) ...@@ -173,8 +173,13 @@ static void Close( vlc_object_t * p_this )
*****************************************************************************/ *****************************************************************************/
static ssize_t Read( sout_access_out_t *p_access, block_t *p_buffer ) 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, ssize_t val;
do
val = read( (intptr_t)p_access->p_sys, p_buffer->p_buffer,
p_buffer->i_buffer ); p_buffer->i_buffer );
while (val == -1 && errno == EINTR);
return val;
} }
/***************************************************************************** /*****************************************************************************
...@@ -186,15 +191,29 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer ) ...@@ -186,15 +191,29 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer )
while( p_buffer ) while( p_buffer )
{ {
block_t *p_next = p_buffer->p_next;; ssize_t val = write ((intptr_t)p_access->p_sys,
p_buffer->p_buffer, p_buffer->i_buffer);
i_write += write( (intptr_t)p_access->p_sys, if (val == -1)
p_buffer->p_buffer, p_buffer->i_buffer ); {
block_Release( p_buffer ); 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; p_buffer = p_next;
} }
else
{
p_buffer->p_buffer += val;
p_buffer->i_buffer -= val;
}
i_write += val;
}
return i_write; return i_write;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment