@ -308,21 +308,9 @@ int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
@@ -308,21 +308,9 @@ int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
return fd ;
}
static bool supports_pread_pwrite ( uint32_t mod e)
static ssize_t zvfs_rw ( int fd , void * buf , size_t sz , bool is_writ e)
{
switch ( mode & ZVFS_MODE_IFMT ) {
case ZVFS_MODE_IFSHM :
return true ;
default :
return false ;
}
}
static ssize_t zvfs_rw ( int fd , void * buf , size_t sz , bool is_write , const size_t * from_offset )
{
bool prw ;
ssize_t res ;
const size_t * off ;
if ( _check_fd ( fd ) < 0 ) {
return - 1 ;
@ -330,40 +318,24 @@ static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write, const size_t
@@ -330,40 +318,24 @@ static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write, const size_t
( void ) k_mutex_lock ( & fdtable [ fd ] . lock , K_FOREVER ) ;
prw = supports_pread_pwrite ( fdtable [ fd ] . mode ) ;
if ( from_offset ! = NULL & & ! prw ) {
/*
* Seekable file types should support pread ( ) / pwrite ( ) and per - fd offset passing .
* Otherwise , it ' s a bug .
*/
errno = ENOTSUP ;
res = - 1 ;
goto unlock ;
}
/* If there is no specified from_offset, then use the current offset of the fd */
off = ( from_offset = = NULL ) ? & fdtable [ fd ] . offset : from_offset ;
if ( is_write ) {
if ( fdtable [ fd ] . vtable - > write_offs = = NULL ) {
if ( fdtable [ fd ] . vtable - > write_offset = = NULL ) {
res = - 1 ;
errno = EIO ;
} else {
res = fdtable [ fd ] . vtable - > write_offs ( fdtable [ fd ] . obj , buf , sz , * off ) ;
res = fdtable [ fd ] . vtable - > write_offset ( fdtable [ fd ] . obj , buf , sz ,
fdtable [ fd ] . offset ) ;
}
} else {
if ( fdtable [ fd ] . vtable - > read_offs = = NULL ) {
if ( fdtable [ fd ] . vtable - > read = = NULL ) {
res = - 1 ;
errno = EIO ;
} else {
res = fdtable [ fd ] . vtable - > read_offs ( fdtable [ fd ] . obj , buf , sz , * off ) ;
res = fdtable [ fd ] . vtable - > read_offset ( fdtable [ fd ] . obj , buf , sz ,
fdtable [ fd ] . offset ) ;
}
}
if ( res > 0 & & prw & & from_offset = = NULL ) {
/*
* only update the fd offset when from_offset is not specified
* See pread ( ) / pwrite ( )
*/
if ( res > 0 ) {
fdtable [ fd ] . offset + = res ;
}
@ -373,14 +345,14 @@ unlock:
@@ -373,14 +345,14 @@ unlock:
return res ;
}
ssize_t zvfs_read ( int fd , void * buf , size_t sz , const size_t * from_offset )
ssize_t zvfs_read ( int fd , void * buf , size_t sz )
{
return zvfs_rw ( fd , buf , sz , false , from_offset ) ;
return zvfs_rw ( fd , buf , sz , false ) ;
}
ssize_t zvfs_write ( int fd , const void * buf , size_t sz , const size_t * from_offset )
ssize_t zvfs_write ( int fd , const void * buf , size_t sz )
{
return zvfs_rw ( fd , ( void * ) buf , sz , true , from_offset ) ;
return zvfs_rw ( fd , ( void * ) buf , sz , true ) ;
}
int zvfs_close ( int fd )
@ -522,7 +494,7 @@ static ssize_t stdinout_read_vmeth(void *obj, void *buffer, size_t count)
@@ -522,7 +494,7 @@ static ssize_t stdinout_read_vmeth(void *obj, void *buffer, size_t count)
static ssize_t stdinout_write_vmeth ( void * obj , const void * buffer , size_t count )
{
# if defined(CONFIG_BOARD_NATIVE_POSIX)
return zvfs_write ( 1 , buffer , count , NULL ) ;
return zvfs_write ( 1 , buffer , count ) ;
# elif defined(CONFIG_NEWLIB_LIBC) || defined(CONFIG_ARCMWDT_LIBC)
return z_impl_zephyr_write_stdout ( buffer , count ) ;
# else