diff --git a/hacking/ChangeLog b/hacking/ChangeLog index bd63fbe..f2281a3 100644 --- a/hacking/ChangeLog +++ b/hacking/ChangeLog @@ -186,3 +186,6 @@ address (Stuart). 20070611 man/fuse-utils.1: mention tape2wav (Stuart). 20070611 .: ignore tape2wav. +20070727 listbasic.c,rzxcheck.c,rzxdump.c,rzxtool.c,snap2tzx.c,snapconv.c, + tape2wav.c,tapeconv.c,tzxlist.c,utils.[ch]: remove use of mmap(): + added complexity for no real benefit. diff --git a/listbasic.c b/listbasic.c index abedcfa..47ed951 100644 --- a/listbasic.c +++ b/listbasic.c @@ -75,44 +75,39 @@ int main(int argc, char* argv[]) error = init_libspectrum(); if( error ) return error; - error = mmap_file( argv[1], &buffer, &length ); if( error ) return error; + error = read_file( argv[1], &buffer, &length ); if( error ) return error; error = libspectrum_identify_file_with_class( &type, &class, argv[1], buffer, length ); - if( error ) { munmap( buffer, length ); return error; } + if( error ) { free( buffer ); return error; } switch( class ) { case LIBSPECTRUM_CLASS_SNAPSHOT: error = parse_snapshot_file( buffer, length, type ); - if( error ) { munmap( buffer, length ); return error; } + if( error ) { free( buffer ); return error; } break; case LIBSPECTRUM_CLASS_TAPE: error = parse_tape_file( buffer, length, type ); - if( error ) { munmap( buffer, length ); return error; } + if( error ) { free( buffer ); return error; } break; case LIBSPECTRUM_CLASS_UNKNOWN: fprintf( stderr, "%s: couldn't identify the file type of `%s'\n", progname, argv[1] ); - munmap( buffer, length ); + free( buffer ); return 1; default: fprintf( stderr, "%s: `%s' is an unsupported file type\n", progname, argv[1] ); - munmap( buffer, length ); + free( buffer ); return 1; } - error = munmap( buffer, length ); - if( error ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, argv[1], - strerror( errno ) ); - return 1; - } + free( buffer ); return 0; } diff --git a/rzxcheck.c b/rzxcheck.c index 55548a6..824ac8f 100644 --- a/rzxcheck.c +++ b/rzxcheck.c @@ -66,10 +66,10 @@ main( int argc, char **argv ) if( libspectrum_rzx_alloc( &rzx ) ) return 16; - if( mmap_file( rzxfile, &buffer, &length ) ) return 16; + if( read_file( rzxfile, &buffer, &length ) ) return 16; if( libspectrum_rzx_read( rzx, buffer, length ) ) { - munmap( buffer, length ); + free( buffer ); return 16; } @@ -77,7 +77,7 @@ main( int argc, char **argv ) if( !keyid ) { printf( "%s: no key ID found in '%s'\n", progname, rzxfile ); libspectrum_rzx_free( rzx ); - munmap( buffer, length ); + free( buffer ); return 16; } @@ -88,14 +88,14 @@ main( int argc, char **argv ) printf( "%s: don't know anything about key ID %08x\n", progname, keyid ); libspectrum_rzx_free( rzx ); - munmap( buffer, length ); + free( buffer ); return 16; } error = libspectrum_rzx_get_signature( rzx, &signature ); if( error ) { libspectrum_rzx_free( rzx ); - munmap( buffer, length ); + free( buffer ); return 16; } @@ -103,17 +103,11 @@ main( int argc, char **argv ) if( error && error != LIBSPECTRUM_ERROR_SIGNATURE ) { libspectrum_signature_free( &signature ); libspectrum_rzx_free( rzx ); - munmap( buffer, length ); + free( buffer ); return 16; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, rzxfile, - strerror( errno ) ); - libspectrum_signature_free( &signature ); - libspectrum_rzx_free( rzx ); - return 16; - } + free( buffer ); libspectrum_rzx_free( rzx ); free( rzx ); libspectrum_signature_free( &signature ); diff --git a/rzxdump.c b/rzxdump.c index 25f1141..530e933 100644 --- a/rzxdump.c +++ b/rzxdump.c @@ -108,7 +108,7 @@ do_file( const char *filename ) printf( "Examining file %s\n", filename ); - error = mmap_file( filename, &buffer, &length ); if( error ) return error; + error = read_file( filename, &buffer, &length ); if( error ) return error; ptr = buffer; end = buffer + length; @@ -118,14 +118,14 @@ do_file( const char *filename ) fprintf( stderr, "%s: Not enough bytes for RZX header (%ld bytes)\n", progname, (unsigned long)strlen( rzx_signature ) + 6 ); - munmap( buffer, length ); + free( buffer ); return 1; } if( memcmp( ptr, rzx_signature, strlen( rzx_signature ) ) ) { fprintf( stderr, "%s: Wrong signature: expected `%s'\n", progname, rzx_signature ); - munmap( buffer, length ); + free( buffer ); return 1; } @@ -152,19 +152,15 @@ do_file( const char *filename ) default: fprintf( stderr, "%s: Unknown block type 0x%02x\n", progname, id ); - munmap( buffer, length ); + free( buffer ); return 1; } - if( error ) { munmap( buffer, length ); return 1; } + if( error ) { free( buffer ); return 1; } } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, filename, - strerror( errno ) ); - return 1; - } + free( buffer ); return 0; } diff --git a/rzxtool.c b/rzxtool.c index 2a134fa..abb64a8 100644 --- a/rzxtool.c +++ b/rzxtool.c @@ -89,18 +89,14 @@ main( int argc, char **argv ) if( libspectrum_rzx_alloc( &rzx ) ) return 1; - if( mmap_file( options.rzxfile, &buffer, &length ) ) return 1; + if( read_file( options.rzxfile, &buffer, &length ) ) return 1; if( libspectrum_rzx_read( rzx, buffer, length ) ) { - munmap( buffer, length ); + free( buffer ); return 1; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, - options.rzxfile, strerror( errno ) ); - return 1; - } + free( buffer ); if( options.extract ) { diff --git a/snap2tzx.c b/snap2tzx.c index f2ad4f6..825b2f8 100644 --- a/snap2tzx.c +++ b/snap2tzx.c @@ -483,7 +483,7 @@ load_snap( libspectrum_snap **snap, const char *filename ) error = libspectrum_snap_alloc( snap ); if( error ) return error; - if( mmap_file( filename, &buffer, &length ) ) { + if( read_file( filename, &buffer, &length ) ) { libspectrum_snap_free( *snap ); return 1; } @@ -491,16 +491,11 @@ load_snap( libspectrum_snap **snap, const char *filename ) error = libspectrum_snap_read( *snap, buffer, length, LIBSPECTRUM_ID_UNKNOWN, filename ); if( error ) { - libspectrum_snap_free( *snap ); munmap( buffer, length ); + libspectrum_snap_free( *snap ); free( buffer ); return error; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap '%s': %s\n", progname, filename, - strerror( errno ) ); - libspectrum_snap_free( *snap ); - return 1; - } + free( buffer ); return 0; } diff --git a/snapconv.c b/snapconv.c index beef2f3..70da67d 100644 --- a/snapconv.c +++ b/snapconv.c @@ -80,7 +80,7 @@ main( int argc, char **argv ) error = libspectrum_snap_alloc( &snap ); if( error ) return error; - if( mmap_file( argv[0], &buffer, &length ) ) { + if( read_file( argv[0], &buffer, &length ) ) { libspectrum_snap_free( snap ); return 1; } @@ -88,16 +88,11 @@ main( int argc, char **argv ) error = libspectrum_snap_read( snap, buffer, length, LIBSPECTRUM_ID_UNKNOWN, argv[0] ); if( error ) { - libspectrum_snap_free( snap ); munmap( buffer, length ); + libspectrum_snap_free( snap ); free( buffer ); return error; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap '%s': %s\n", progname, argv[1], - strerror( errno ) ); - libspectrum_snap_free( snap ); - return 1; - } + free( buffer ); error = libspectrum_identify_file_with_class( &type, &class, argv[1], NULL, 0 ); diff --git a/tape2wav.c b/tape2wav.c index c0c5176..98210a3 100644 --- a/tape2wav.c +++ b/tape2wav.c @@ -91,25 +91,20 @@ read_tape( char *filename, libspectrum_tape **tape ) { libspectrum_byte *buffer; size_t length; - if( mmap_file( filename, &buffer, &length ) ) return 1; + if( read_file( filename, &buffer, &length ) ) return 1; if( libspectrum_tape_alloc( tape ) ) { - munmap( buffer, length ); + free( buffer ); return 1; } if( libspectrum_tape_read( *tape, buffer, length, LIBSPECTRUM_ID_UNKNOWN, filename ) ) { - munmap( buffer, length ); + free( buffer ); return 1; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, filename, - strerror( errno ) ); - libspectrum_tape_free( *tape ); - return 1; - } + free( buffer ); return 0; } diff --git a/tapeconv.c b/tapeconv.c index ff2218d..b386200 100644 --- a/tapeconv.c +++ b/tapeconv.c @@ -94,25 +94,20 @@ read_tape( char *filename, libspectrum_tape **tape ) { libspectrum_byte *buffer; size_t length; - if( mmap_file( filename, &buffer, &length ) ) return 1; + if( read_file( filename, &buffer, &length ) ) return 1; if( libspectrum_tape_alloc( tape ) ) { - munmap( buffer, length ); + free( buffer ); return 1; } if( libspectrum_tape_read( *tape, buffer, length, LIBSPECTRUM_ID_UNKNOWN, filename ) ) { - munmap( buffer, length ); + free( buffer ); return 1; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, filename, - strerror( errno ) ); - libspectrum_tape_free( *tape ); - return 1; - } + free( buffer ); return 0; } diff --git a/tzxlist.c b/tzxlist.c index a902cb2..60bebbe 100644 --- a/tzxlist.c +++ b/tzxlist.c @@ -130,26 +130,22 @@ process_tape( char *filename ) size_t i; - error = mmap_file( filename, &buffer, &length ); if( error ) return error; + error = read_file( filename, &buffer, &length ); if( error ) return error; error = libspectrum_tape_alloc( &tape ); if( error != LIBSPECTRUM_ERROR_NONE ) { - munmap( buffer, length ); + free( buffer ); return 1; } error = libspectrum_tape_read( tape, buffer, length, LIBSPECTRUM_ID_UNKNOWN, filename ); if( error != LIBSPECTRUM_ERROR_NONE ) { - munmap( buffer, length ); + free( buffer ); return error; } - if( munmap( buffer, length ) == -1 ) { - fprintf( stderr, "%s: couldn't munmap `%s': %s\n", progname, filename, - strerror( errno ) ); - return 1; - } + free( buffer ); printf("Listing of `%s':\n\n", filename ); @@ -322,10 +318,7 @@ process_tape( char *filename ) } error = libspectrum_tape_free( tape ); - if( error != LIBSPECTRUM_ERROR_NONE ) { - munmap( buffer, length ); - return error; - } + if( error != LIBSPECTRUM_ERROR_NONE ) return error; return 0; } diff --git a/utils.c b/utils.c index c2f4492..f73f3e9 100644 --- a/utils.c +++ b/utils.c @@ -117,9 +117,10 @@ get_creator( libspectrum_creator **creator, const char *program ) } int -mmap_file( const char *filename, unsigned char **buffer, size_t *length ) +read_file( const char *filename, unsigned char **buffer, size_t *length ) { int fd; struct stat file_info; + ssize_t bytes; if( ( fd = open( filename, O_RDONLY | O_BINARY ) ) == -1 ) { fprintf( stderr, "%s: couldn't open `%s': %s\n", progname, filename, @@ -134,20 +135,35 @@ mmap_file( const char *filename, unsigned char **buffer, size_t *length ) return 1; } - (*length) = file_info.st_size; + *length = file_info.st_size; - (*buffer) = mmap( 0, *length, PROT_READ, MAP_SHARED, fd, 0 ); - if( (*buffer) == (void*)-1 ) { - fprintf( stderr, "%s: couldn't mmap `%s': %s\n", progname, filename, - strerror( errno ) ); + *buffer = malloc( *length ); + if( !*buffer ) { + fprintf( stderr, "%s: out of memory allocating %lu bytes\n", progname, + (unsigned long)*length ); close(fd); return 1; } + bytes = read( fd, *buffer, *length ); + if( bytes == -1 ) { + fprintf( stderr, "%s: error reading from `%s': %s\n", progname, filename, + strerror( errno ) ); + free( *buffer ); + close(fd); + return 1; + } else if( bytes < *length ) { + fprintf( stderr, "%s: could read only %lu out of %lu bytes from `%s'\n", + progname, (unsigned long)bytes, (unsigned long)*length, filename ); + free( *buffer ); + close(fd); + return 1; + } + if( close(fd) ) { fprintf( stderr, "%s: couldn't close `%s': %s\n", progname, filename, strerror( errno ) ); - munmap( *buffer, *length ); + free( *buffer ); return 1; } diff --git a/utils.h b/utils.h index c6babf0..36a8c51 100644 --- a/utils.h +++ b/utils.h @@ -30,7 +30,7 @@ int init_libspectrum( void ); int get_creator( libspectrum_creator **creator, const char *program ); -int mmap_file( const char *filename, unsigned char **buffer, size_t *length ); +int read_file( const char *filename, unsigned char **buffer, size_t *length ); struct rzx_key { libspectrum_dword id;