diff options
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_handlers_directory.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_handlers_directory.c | 45 |
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 +}; |