summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_dir_default.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-14 20:07:19 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-14 21:34:42 +0100
commitf78549221be6d9142263b70e246ec6adf1d58ba9 (patch)
tree5a155d27479100c2f096a587b18328136a47c1a6 /cpukit/libfs/src/imfs/imfs_dir_default.c
parentlpc1768_mbed_ahb_ram_eth-testsuite.tcfg: Add ftp01 (diff)
downloadrtems-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 )
+};