1
0
mirror of https://git.code.sf.net/p/fuse-emulator/fuse-utils synced 2025-04-19 08:42:15 +03:00
fuse-utils/utils.c
Fredrick Meunier 87e0351fe3 Switch to using libspectrum_buffer in libspectrum_szx_write() and
libspectrum_snap_write().

Legacy-ID: 5788
2016-08-31 11:27:16 +00:00

167 lines
4.1 KiB
C

/* utils.c: useful utility functions
Copyright (c) 2002-2007 Philip Kendall
$Id$
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Author contact information:
E-mail: philip-fuse@shadowmagic.org.uk
*/
#include <config.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#ifndef WIN32
#include <sys/utsname.h>
#endif
#include <libspectrum.h>
#include "compat.h"
#include "utils.h"
extern char *progname;
/* The minimum version of libspectrum we need */
static const char *LIBSPECTRUM_MIN_VERSION = "0.2.0";
int
init_libspectrum( void )
{
if( libspectrum_check_version( LIBSPECTRUM_MIN_VERSION ) ) {
if( libspectrum_init() ) return 1;
} else {
fprintf( stderr, "libspectrum version %s found, but %s required",
libspectrum_version(), LIBSPECTRUM_MIN_VERSION );
return 1;
}
return 0;
}
int
get_creator( libspectrum_creator **creator, const char *program )
{
char *custom;
int version[4] = { 0, 0, 0, 0 };
size_t i;
#ifndef WIN32
char osname[ 256 ];
int sys_error;
sys_error = compat_osname( osname, sizeof( osname ) );
if( sys_error ) return 1;
#endif
*creator = libspectrum_creator_alloc();
libspectrum_creator_set_program( *creator, program );
sscanf( VERSION, "%u.%u.%u.%u",
&version[0], &version[1], &version[2], &version[3] );
for( i=0; i<4; i++ ) if( version[i] > 0xff ) version[i] = 0xff;
libspectrum_creator_set_major( *creator, version[0] * 0x100 + version[1] );
libspectrum_creator_set_minor( *creator, version[2] * 0x100 + version[3] );
custom = malloc( 256 );
if( !custom ) {
fprintf( stderr, "%s: out of memory at %s:%d\n", progname,
__FILE__, __LINE__ );
libspectrum_creator_free( *creator );
return 1;
}
#ifdef WIN32
snprintf( custom, 256, "libspectrum: %s\nsystem: windows\n",
libspectrum_version() );
#else
snprintf( custom, 256, "libspectrum: %s\nuname: %s\n",
libspectrum_version(),
osname );
#endif
libspectrum_creator_set_custom( *creator, (libspectrum_byte*)custom,
strlen( custom ) );
return 0;
}
int
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,
strerror( errno ) );
return 1;
}
if( fstat( fd, &file_info) ) {
fprintf( stderr, "%s: couldn't stat `%s': %s\n", progname, filename,
strerror( errno ) );
close(fd);
return 1;
}
*length = file_info.st_size;
*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 ) );
free( *buffer );
return 1;
}
return 0;
}