summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/libfs/Makefile.am6
-rw-r--r--cpukit/libfs/src/imfs/imfs.h30
-rw-r--r--cpukit/libfs/src/imfs/imfs_dir.c52
-rw-r--r--cpukit/libfs/src/imfs/imfs_dir_default.c (renamed from cpukit/libfs/src/imfs/imfs_directory.c)61
-rw-r--r--cpukit/libfs/src/imfs/imfs_dir_minimal.c48
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_directory.c113
-rw-r--r--cpukit/libfs/src/imfs/imfs_init.c2
-rw-r--r--cpukit/sapi/include/confdefs.h6
-rw-r--r--doc/user/conf.t27
-rw-r--r--testsuites/fstests/fsimfsconfig01/init.c20
10 files changed, 224 insertions, 141 deletions
diff --git a/cpukit/libfs/Makefile.am b/cpukit/libfs/Makefile.am
index 802dfdb141..531e080cb7 100644
--- a/cpukit/libfs/Makefile.am
+++ b/cpukit/libfs/Makefile.am
@@ -42,13 +42,15 @@ libimfs_a_SOURCES =
libimfs_a_SOURCES += src/imfs/deviceio.c \
src/imfs/imfs_chown.c src/imfs/imfs_config.c \
- src/imfs/imfs_creat.c src/imfs/imfs_directory.c \
+ src/imfs/imfs_creat.c \
src/imfs/imfs_eval.c src/imfs/imfs_fchmod.c \
+ src/imfs/imfs_dir.c \
+ src/imfs/imfs_dir_default.c \
+ src/imfs/imfs_dir_minimal.c \
src/imfs/imfs_fifo.c \
src/imfs/imfs_make_generic_node.c \
src/imfs/imfs_fsunmount.c \
src/imfs/imfs_handlers_device.c \
- src/imfs/imfs_handlers_directory.c \
src/imfs/imfs_init.c \
src/imfs/imfs_initsupp.c src/imfs/imfs_link.c src/imfs/imfs_load_tar.c \
src/imfs/imfs_linfile.c \
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h
index c03257a0fa..2a1eddcfcc 100644
--- a/cpukit/libfs/src/imfs/imfs.h
+++ b/cpukit/libfs/src/imfs/imfs.h
@@ -135,6 +135,11 @@ IMFS_jnode_t *IMFS_node_initialize_default(
void *arg
);
+IMFS_jnode_t *IMFS_node_initialize_directory(
+ IMFS_jnode_t *node,
+ void *arg
+);
+
/**
* @brief Returns the node and sets the generic node context.
*
@@ -179,6 +184,8 @@ IMFS_jnode_t *IMFS_node_remove_default(
IMFS_jnode_t *node
);
+IMFS_jnode_t *IMFS_node_remove_directory( IMFS_jnode_t *node );
+
/**
* @brief Destroys an IMFS node.
*
@@ -384,7 +391,8 @@ typedef struct {
* Shared Data
*/
-extern const IMFS_mknod_control IMFS_mknod_control_directory;
+extern const IMFS_mknod_control IMFS_mknod_control_dir_default;
+extern const IMFS_mknod_control IMFS_mknod_control_dir_minimal;
extern const IMFS_mknod_control IMFS_mknod_control_device;
extern const IMFS_mknod_control IMFS_mknod_control_memfile;
extern const IMFS_node_control IMFS_node_control_linfile;
@@ -700,26 +708,6 @@ extern int IMFS_unmount(
);
/**
- * @brief Read the next directory of the IMFS.
- *
- * This routine will read the next directory entry based on the directory
- * offset. The offset should be equal to -n- time the size of an individual
- * dirent structure. If n is not an integer multiple of the sizeof a
- * dirent structure, an integer division will be performed to determine
- * directory entry that will be returned in the buffer. Count should reflect
- * -m- times the sizeof dirent bytes to be placed in the buffer.
- * If there are not -m- dirent elements from the current directory position
- * to the end of the exisiting file, the remaining entries will be placed in
- * the buffer and the returned value will be equal to -m actual- times the
- * size of a directory entry.
- */
-extern ssize_t imfs_dir_read(
- rtems_libio_t *iop, /* IN */
- void *buffer, /* IN */
- size_t count /* IN */
-);
-
-/**
* @name IMFS Memory File Handlers
*
* This section contains the set of handlers used to process operations on
diff --git a/cpukit/libfs/src/imfs/imfs_dir.c b/cpukit/libfs/src/imfs/imfs_dir.c
new file mode 100644
index 0000000000..2aefc936b4
--- /dev/null
+++ b/cpukit/libfs/src/imfs/imfs_dir.c
@@ -0,0 +1,52 @@
+/**
+ * @file
+ *
+ * @ingroup IMFS
+ */
+
+/*
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "imfs.h"
+
+IMFS_jnode_t *IMFS_node_initialize_directory(
+ IMFS_jnode_t *node,
+ void *arg
+)
+{
+ IMFS_directory_t *dir = (IMFS_directory_t *) node;
+
+ rtems_chain_initialize_empty( &dir->Entries );
+
+ return node;
+}
+
+static bool IMFS_is_mount_point( const IMFS_directory_t *dir )
+{
+ return dir->mt_fs != NULL;
+}
+
+IMFS_jnode_t *IMFS_node_remove_directory( IMFS_jnode_t *node )
+{
+ IMFS_directory_t *dir = (IMFS_directory_t *) node;
+
+ if ( !rtems_chain_is_empty( &dir->Entries ) ) {
+ errno = ENOTEMPTY;
+ dir = NULL;
+ } else if ( IMFS_is_mount_point( dir ) ) {
+ errno = EBUSY;
+ dir = NULL;
+ }
+
+ return &dir->Node;
+}
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 )
+};
diff --git a/cpukit/libfs/src/imfs/imfs_dir_minimal.c b/cpukit/libfs/src/imfs/imfs_dir_minimal.c
new file mode 100644
index 0000000000..3ef5173535
--- /dev/null
+++ b/cpukit/libfs/src/imfs/imfs_dir_minimal.c
@@ -0,0 +1,48 @@
+/**
+ * @file
+ *
+ * @ingroup IMFS
+ */
+
+/*
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "imfs.h"
+
+static const rtems_filesystem_file_handlers_r IMFS_dir_minimal_handlers = {
+ .open_h = rtems_filesystem_default_open,
+ .close_h = rtems_filesystem_default_close,
+ .read_h = rtems_filesystem_default_read,
+ .write_h = rtems_filesystem_default_write,
+ .ioctl_h = rtems_filesystem_default_ioctl,
+ .lseek_h = rtems_filesystem_default_lseek_directory,
+ .fstat_h = IMFS_stat,
+ .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_minimal = {
+ {
+ .handlers = &IMFS_dir_minimal_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 )
+};
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_directory.c b/cpukit/libfs/src/imfs/imfs_handlers_directory.c
deleted file mode 100644
index bcfe3e7365..0000000000
--- a/cpukit/libfs/src/imfs/imfs_handlers_directory.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @file
- *
- * @brief Operations Table for Directories
- * @ingroup IMFS
- */
-
-/*
- * COPYRIGHT (c) 1989-1999.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
- #include "config.h"
-#endif
-
-#include "imfs.h"
-
-#include <dirent.h>
-
-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_directory_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
-};
-
-static IMFS_jnode_t *IMFS_node_initialize_directory(
- IMFS_jnode_t *node,
- void *arg
-)
-{
- IMFS_directory_t *dir = (IMFS_directory_t *) node;
-
- rtems_chain_initialize_empty( &dir->Entries );
-
- return node;
-}
-
-static bool IMFS_is_mount_point( const IMFS_directory_t *dir )
-{
- return dir->mt_fs != NULL;
-}
-
-static IMFS_jnode_t *IMFS_node_remove_directory(
- IMFS_jnode_t *node
-)
-{
- IMFS_directory_t *dir = (IMFS_directory_t *) node;
-
- if ( !rtems_chain_is_empty( &dir->Entries ) ) {
- errno = ENOTEMPTY;
- dir = NULL;
- } else if ( IMFS_is_mount_point( dir ) ) {
- errno = EBUSY;
- dir = NULL;
- }
-
- return &dir->Node;
-}
-
-const IMFS_mknod_control IMFS_mknod_control_directory = {
- {
- .handlers = &IMFS_directory_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 )
-};
diff --git a/cpukit/libfs/src/imfs/imfs_init.c b/cpukit/libfs/src/imfs/imfs_init.c
index bbab2cb3e1..da4c0a8cfb 100644
--- a/cpukit/libfs/src/imfs/imfs_init.c
+++ b/cpukit/libfs/src/imfs/imfs_init.c
@@ -48,7 +48,7 @@ static const rtems_filesystem_operations_table IMFS_ops = {
};
static const IMFS_mknod_controls IMFS_default_mknod_controls = {
- .directory = &IMFS_mknod_control_directory,
+ .directory = &IMFS_mknod_control_dir_default,
.device = &IMFS_mknod_control_device,
.file = &IMFS_mknod_control_memfile,
.fifo = &IMFS_mknod_control_enosys
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index 580a1380aa..7d9e3b9e08 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -619,7 +619,11 @@ const rtems_libio_helper rtems_fs_init_helper =
};
static const IMFS_mknod_controls _Configure_IMFS_mknod_controls = {
- &IMFS_mknod_control_directory,
+ #ifdef CONFIGURE_IMFS_DISABLE_READDIR
+ &IMFS_mknod_control_dir_minimal,
+ #else
+ &IMFS_mknod_control_dir_default,
+ #endif
&IMFS_mknod_control_device,
#ifdef CONFIGURE_IMFS_DISABLE_MKNOD_FILE
&IMFS_mknod_control_enosys,
diff --git a/doc/user/conf.t b/doc/user/conf.t
index f6b203f73b..dc10816909 100644
--- a/doc/user/conf.t
+++ b/doc/user/conf.t
@@ -2895,6 +2895,33 @@ In case this configuration option is defined, then the support to rename nodes
is disabled in the root IMFS.
@c
+@c === CONFIGURE_IMFS_DISABLE_READDIR ===
+@c
+@subsection Disable Directory Read Support of Root IMFS
+
+@findex CONFIGURE_IMFS_DISABLE_READDIR
+
+@table @b
+@item CONSTANT:
+@code{CONFIGURE_IMFS_DISABLE_READDIR}
+
+@item DATA TYPE:
+Boolean feature macro.
+
+@item RANGE:
+Defined or undefined.
+
+@item DEFAULT VALUE:
+This is not defined by default.
+
+@end table
+
+@subheading DESCRIPTION:
+In case this configuration option is defined, then the support to read a
+directory is disabled in the root IMFS. It is still possible to open nodes in
+a directory.
+
+@c
@c === CONFIGURE_IMFS_DISABLE_MOUNT ===
@c
@subsection Disable Mount Support of Root IMFS
diff --git a/testsuites/fstests/fsimfsconfig01/init.c b/testsuites/fstests/fsimfsconfig01/init.c
index 1d449d6828..dd587fae4c 100644
--- a/testsuites/fstests/fsimfsconfig01/init.c
+++ b/testsuites/fstests/fsimfsconfig01/init.c
@@ -19,6 +19,7 @@
#include "tmacros.h"
#include <sys/stat.h>
+#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
@@ -46,6 +47,9 @@ static void Init(rtems_task_argument arg)
const char *fifo = "fifo";
int rv;
int fd;
+ DIR *dirp;
+ struct dirent *dire;
+ struct stat st;
TEST_BEGIN();
@@ -88,6 +92,21 @@ static void Init(rtems_task_argument arg)
rtems_test_assert(rv == -1);
rtems_test_assert(errno == ENOSYS);
+ dirp = opendir(mnt);
+ rtems_test_assert(dirp != NULL);
+
+ errno = 0;
+ dire = readdir(dirp);
+ rtems_test_assert(dire == NULL);
+ rtems_test_assert(errno == ENOTSUP);
+
+ rv = closedir(dirp);
+ rtems_test_assert(rv == 0);
+
+ rv = stat(mnt, &st);
+ rtems_test_assert(rv == 0);
+ rtems_test_assert(st.st_size == 0);
+
errno = 0;
rv = mount(
"",
@@ -145,6 +164,7 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_IMFS_DISABLE_MKNOD_FILE
#define CONFIGURE_IMFS_DISABLE_MOUNT
#define CONFIGURE_IMFS_DISABLE_RENAME
+#define CONFIGURE_IMFS_DISABLE_READDIR
#define CONFIGURE_IMFS_DISABLE_RMNOD
#define CONFIGURE_IMFS_DISABLE_SYMLINK
#define CONFIGURE_IMFS_DISABLE_UTIME