@ -23,11 +23,6 @@
# define MODE_READ 0x0
# define MODE_READBIN 0x1
static long smh_read ( long fd , void * memp , size_t len ) ;
static long smh_open ( const char * fname , char * modestr ) ;
static long smh_close ( long fd ) ;
static long smh_len_fd ( long fd ) ;
/*
* Call the handler
*/
@ -44,60 +39,43 @@ static long smh_trap(unsigned int sysnum, void *addr)
}
/*
* Open , load a file into memory , and close it . Check that the available space
* is sufficient to store the entire file . Return the bytes actually read from
* the file as seen by the read function . The verbose flag enables some extra
* printing of successful read status .
* Open a file on the host . Mode is " r " or " rb " currently . Returns a file
* descriptor or - 1 on error .
*/
int smh_load ( const char * fname , void * memp , int avail , int verbose )
static long smh_open ( const char * fname , char * modestr )
{
long ret ;
long fd ;
size_t len ;
ret = - 1 ;
debug ( " %s: fname \' %s \' , avail %u, memp %p \n " , __func__ , fname ,
avail , memp ) ;
/* Open the file */
fd = smh_open ( fname , " rb " ) ;
if ( fd = = - 1 )
return - 1 ;
unsigned long mode ;
struct smh_open_s {
const char * fname ;
unsigned long mode ;
size_t len ;
} open ;
/* Get the file length */
ret = smh_len_fd ( fd ) ;
if ( ret = = - 1 ) {
smh_close ( fd ) ;
return - 1 ;
}
debug ( " %s: file \' %s \' , mode \' %s \' \n " , __func__ , fname , modestr ) ;
/* Check that the file will fit in the supplied buffer */
if ( ret > avail ) {
printf ( " %s: ERROR ret %ld, avail %u \n " , __func__ , ret ,
avail ) ;
smh_close ( fd ) ;
/* Check the file mode */
if ( ! ( strcmp ( modestr , " r " ) ) ) {
mode = MODE_READ ;
} else if ( ! ( strcmp ( modestr , " rb " ) ) ) {
mode = MODE_READBIN ;
} else {
printf ( " %s: ERROR mode \' %s \' not supported \n " , __func__ ,
modestr ) ;
return - 1 ;
}
len = ret ;
/* Read the file into the buffer */
ret = smh_read ( fd , memp , len ) ;
if ( ret = = 0 ) {
/* Print successful load information if requested */
if ( verbose ) {
printf ( " \n %s \n " , fname ) ;
printf ( " 0x%8p dest \n " , memp ) ;
printf ( " 0x%08lx size \n " , len ) ;
printf ( " 0x%08x avail \n " , avail ) ;
}
}
open . fname = fname ;
open . len = strlen ( fname ) ;
open . mode = mode ;
/* Close the file */
smh_close ( fd ) ;
/* Open the file on the host */
fd = smh_trap ( SYSOPEN , & open ) ;
if ( fd = = - 1 )
printf ( " %s: ERROR fd %ld for file \' %s \' \n " , __func__ , fd ,
fname ) ;
return ret ;
return fd ;
}
/*
@ -135,46 +113,6 @@ static long smh_read(long fd, void *memp, size_t len)
}
/*
* Open a file on the host . Mode is " r " or " rb " currently . Returns a file
* descriptor or - 1 on error .
*/
static long smh_open ( const char * fname , char * modestr )
{
long fd ;
unsigned long mode ;
struct smh_open_s {
const char * fname ;
unsigned long mode ;
size_t len ;
} open ;
debug ( " %s: file \' %s \' , mode \' %s \' \n " , __func__ , fname , modestr ) ;
/* Check the file mode */
if ( ! ( strcmp ( modestr , " r " ) ) ) {
mode = MODE_READ ;
} else if ( ! ( strcmp ( modestr , " rb " ) ) ) {
mode = MODE_READBIN ;
} else {
printf ( " %s: ERROR mode \' %s \' not supported \n " , __func__ ,
modestr ) ;
return - 1 ;
}
open . fname = fname ;
open . len = strlen ( fname ) ;
open . mode = mode ;
/* Open the file on the host */
fd = smh_trap ( SYSOPEN , & open ) ;
if ( fd = = - 1 )
printf ( " %s: ERROR fd %ld for file \' %s \' \n " , __func__ , fd ,
fname ) ;
return fd ;
}
/*
* Close the file using the file descriptor
*/
static long smh_close ( long fd )
@ -207,6 +145,63 @@ static long smh_len_fd(long fd)
}
/*
* Open , load a file into memory , and close it . Check that the available space
* is sufficient to store the entire file . Return the bytes actually read from
* the file as seen by the read function . The verbose flag enables some extra
* printing of successful read status .
*/
int smh_load ( const char * fname , void * memp , int avail , int verbose )
{
long ret ;
long fd ;
size_t len ;
ret = - 1 ;
debug ( " %s: fname \' %s \' , avail %u, memp %p \n " , __func__ , fname ,
avail , memp ) ;
/* Open the file */
fd = smh_open ( fname , " rb " ) ;
if ( fd = = - 1 )
return - 1 ;
/* Get the file length */
ret = smh_len_fd ( fd ) ;
if ( ret = = - 1 ) {
smh_close ( fd ) ;
return - 1 ;
}
/* Check that the file will fit in the supplied buffer */
if ( ret > avail ) {
printf ( " %s: ERROR ret %ld, avail %u \n " , __func__ , ret ,
avail ) ;
smh_close ( fd ) ;
return - 1 ;
}
len = ret ;
/* Read the file into the buffer */
ret = smh_read ( fd , memp , len ) ;
if ( ret = = 0 ) {
/* Print successful load information if requested */
if ( verbose ) {
printf ( " \n %s \n " , fname ) ;
printf ( " 0x%8p dest \n " , memp ) ;
printf ( " 0x%08lx size \n " , len ) ;
printf ( " 0x%08x avail \n " , avail ) ;
}
}
/* Close the file */
smh_close ( fd ) ;
return ret ;
}
/*
* Get the file length from the filename
*/
long smh_len ( const char * fname )