summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_handlers_directory.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_handlers_directory.c')
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_directory.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_directory.c b/cpukit/libfs/src/imfs/imfs_handlers_directory.c
index 842f098fc8..56b1461648 100644
--- a/cpukit/libfs/src/imfs/imfs_handlers_directory.c
+++ b/cpukit/libfs/src/imfs/imfs_handlers_directory.c
@@ -17,11 +17,7 @@
#include "imfs.h"
-/*
- * Set of operations handlers for operations on directories.
- */
-
-const rtems_filesystem_file_handlers_r IMFS_directory_handlers = {
+static const rtems_filesystem_file_handlers_r IMFS_directory_handlers = {
rtems_filesystem_default_open,
rtems_filesystem_default_close,
imfs_dir_read,
@@ -34,3 +30,42 @@ const rtems_filesystem_file_handlers_r IMFS_directory_handlers = {
rtems_filesystem_default_fsync_or_fdatasync_success,
rtems_filesystem_default_fcntl
};
+
+static IMFS_jnode_t *IMFS_node_initialize_directory(
+ IMFS_jnode_t *node,
+ const IMFS_types_union *info
+)
+{
+ rtems_chain_initialize_empty( &node->info.directory.Entries );
+
+ return node;
+}
+
+static bool IMFS_is_mount_point( const IMFS_jnode_t *node )
+{
+ return node->info.directory.mt_fs != NULL;
+}
+
+static IMFS_jnode_t *IMFS_node_remove_directory(
+ IMFS_jnode_t *node,
+ const IMFS_jnode_t *root_node
+)
+{
+ if ( !rtems_chain_is_empty( &node->info.directory.Entries ) ) {
+ errno = ENOTEMPTY;
+ node = NULL;
+ } else if ( node == root_node || IMFS_is_mount_point( node ) ) {
+ errno = EBUSY;
+ node = NULL;
+ }
+
+ return node;
+}
+
+const IMFS_node_control IMFS_node_control_directory = {
+ .imfs_type = IMFS_DIRECTORY,
+ .handlers = &IMFS_directory_handlers,
+ .node_initialize = IMFS_node_initialize_directory,
+ .node_remove = IMFS_node_remove_directory,
+ .node_destroy = IMFS_node_destroy_default
+};