From: RĂ©mi Denis-Courmont Date: Thu, 12 Jun 2008 16:54:10 +0000 (+0300) Subject: access_out_file: fix non-atomic write and error handling X-Git-Tag: 0.9.0-test0~196 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=ce5d66353521887ee67482d2a13178ee240216f1;p=vlc access_out_file: fix non-atomic write and error handling --- diff --git a/modules/access_output/file.c b/modules/access_output/file.c index 9cf4d98c99..639954889b 100644 --- a/modules/access_output/file.c +++ b/modules/access_output/file.c @@ -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 ) { - 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; } /***************************************************************************** @@ -186,15 +191,29 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer ) 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; }