diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-02-14 20:07:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-02-14 21:34:42 +0100 |
commit | f78549221be6d9142263b70e246ec6adf1d58ba9 (patch) | |
tree | 5a155d27479100c2f096a587b18328136a47c1a6 /cpukit/libfs/src/imfs/imfs_dir_default.c | |
parent | lpc1768_mbed_ahb_ram_eth-testsuite.tcfg: Add ftp01 (diff) | |
download | rtems-f78549221be6d9142263b70e246ec6adf1d58ba9.tar.bz2 |
IMFS: Add CONFIGURE_IMFS_DISABLE_READDIR
Diffstat (limited to '')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_dir_default.c (renamed from cpukit/libfs/src/imfs/imfs_directory.c) | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_directory.c b/cpukit/libfs/src/imfs/imfs_dir_default.c index 5769e0741b..98f06dfce4 100644 --- a/cpukit/libfs/src/imfs/imfs_directory.c +++ b/cpukit/libfs/src/imfs/imfs_dir_default.c @@ -1,7 +1,6 @@ /** * @file * - * @brief IMFS Read Next Directory * @ingroup IMFS */ @@ -20,10 +19,10 @@ #include "imfs.h" -#include <string.h> #include <dirent.h> +#include <string.h> -ssize_t imfs_dir_read( +static ssize_t IMFS_dir_read( rtems_libio_t *iop, void *buffer, size_t count @@ -86,3 +85,59 @@ ssize_t imfs_dir_read( return bytes_transferred; } + +static size_t IMFS_directory_size( const IMFS_jnode_t *node ) +{ + size_t size = 0; + const IMFS_directory_t *dir = (const IMFS_directory_t *) node; + const rtems_chain_control *chain = &dir->Entries; + const rtems_chain_node *current = rtems_chain_immutable_first( chain ); + const rtems_chain_node *tail = rtems_chain_immutable_tail( chain ); + + while ( current != tail ) { + size += sizeof( struct dirent ); + current = rtems_chain_immutable_next( current ); + } + + return size; +} + +static int IMFS_stat_directory( + const rtems_filesystem_location_info_t *loc, + struct stat *buf +) +{ + const IMFS_jnode_t *node = loc->node_access; + + buf->st_size = IMFS_directory_size( node ); + + return IMFS_stat( loc, buf ); +} + +static const rtems_filesystem_file_handlers_r IMFS_dir_default_handlers = { + .open_h = rtems_filesystem_default_open, + .close_h = rtems_filesystem_default_close, + .read_h = IMFS_dir_read, + .write_h = rtems_filesystem_default_write, + .ioctl_h = rtems_filesystem_default_ioctl, + .lseek_h = rtems_filesystem_default_lseek_directory, + .fstat_h = IMFS_stat_directory, + .ftruncate_h = rtems_filesystem_default_ftruncate_directory, + .fsync_h = rtems_filesystem_default_fsync_or_fdatasync_success, + .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success, + .fcntl_h = rtems_filesystem_default_fcntl, + .kqfilter_h = rtems_filesystem_default_kqfilter, + .poll_h = rtems_filesystem_default_poll, + .readv_h = rtems_filesystem_default_readv, + .writev_h = rtems_filesystem_default_writev +}; + +const IMFS_mknod_control IMFS_mknod_control_dir_default = { + { + .handlers = &IMFS_dir_default_handlers, + .node_initialize = IMFS_node_initialize_directory, + .node_remove = IMFS_node_remove_directory, + .node_destroy = IMFS_node_destroy_default + }, + .node_size = sizeof( IMFS_directory_t ) +}; |