diff options
Diffstat (limited to '')
-rw-r--r-- | decoder.cc | 23 |
1 files changed, 12 insertions, 11 deletions
@@ -54,19 +54,20 @@ void Pretty_print::operator()( const char * const msg, FILE * const f ) const /* Returns the number of bytes really read. If (returned value < size) and (errno == 0), means EOF was reached. */ -int readblock( const int fd, uint8_t * const buf, const int size ) +long readblock( const int fd, uint8_t * const buf, const long size ) { - int rest = size; + long pos = 0; errno = 0; - while( rest > 0 ) + while( pos < size ) { - const int n = read( fd, buf + size - rest, rest ); - if( n > 0 ) rest -= n; + const int sz = std::min( 65536L, size - pos ); + const int n = read( fd, buf + pos, sz ); + if( n > 0 ) pos += n; else if( n == 0 ) break; // EOF else if( errno != EINTR ) break; errno = 0; } - return size - rest; + return pos; } @@ -75,16 +76,16 @@ int readblock( const int fd, uint8_t * const buf, const int size ) */ int writeblock( const int fd, const uint8_t * const buf, const int size ) { - int rest = size; + int pos = 0; errno = 0; - while( rest > 0 ) + while( pos < size ) { - const int n = write( fd, buf + size - rest, rest ); - if( n > 0 ) rest -= n; + const int n = write( fd, buf + pos, size - pos ); + if( n > 0 ) pos += n; else if( n < 0 && errno != EINTR ) break; errno = 0; } - return size - rest; + return pos; } |