summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_node.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-09-16 13:56:08 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-09-19 07:22:01 +0200
commitd496e0979afb99a1d131d3b9183506d56f83ea26 (patch)
treeaf239d6dbacfd6dc13653a8f24ae10a840dbfc3b /cpukit/libfs/src/imfs/imfs_node.c
parentimfs: Fix IMFS_stat_file() (diff)
downloadrtems-d496e0979afb99a1d131d3b9183506d56f83ea26.tar.bz2
imfs: Untangle dependencies
This helps to use IMFS_make_generic_node() without pulling in the complete IMFS implementation.
Diffstat (limited to '')
-rw-r--r--cpukit/libfs/src/imfs/imfs_node.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_node.c b/cpukit/libfs/src/imfs/imfs_node.c
new file mode 100644
index 0000000000..5dd22c1542
--- /dev/null
+++ b/cpukit/libfs/src/imfs/imfs_node.c
@@ -0,0 +1,115 @@
+/**
+ * @file
+ *
+ * @brief IMFS Node Support
+ * @ingroup IMFS
+ */
+
+/*
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * Modifications to support reference counting in the file system are
+ * Copyright (c) 2012 embedded brains GmbH.
+ *
+ * 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 <stdlib.h>
+
+IMFS_jnode_t *IMFS_initialize_node(
+ IMFS_jnode_t *node,
+ const IMFS_node_control *node_control,
+ const char *name,
+ size_t namelen,
+ mode_t mode,
+ void *arg
+)
+{
+ struct timeval tv;
+
+ if ( namelen > IMFS_NAME_MAX ) {
+ errno = ENAMETOOLONG;
+
+ return NULL;
+ }
+
+ gettimeofday( &tv, 0 );
+
+ /*
+ * Fill in the basic information
+ */
+ node->name = name;
+ node->namelen = namelen;
+ node->reference_count = 1;
+ node->st_nlink = 1;
+ node->control = node_control;
+
+ /*
+ * Fill in the mode and permission information for the jnode structure.
+ */
+ node->st_mode = mode;
+ node->st_uid = geteuid();
+ node->st_gid = getegid();
+
+ /*
+ * Now set all the times.
+ */
+
+ node->stat_atime = (time_t) tv.tv_sec;
+ node->stat_mtime = (time_t) tv.tv_sec;
+ node->stat_ctime = (time_t) tv.tv_sec;
+
+ return (*node_control->node_initialize)( node, arg );
+}
+
+int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
+{
+ IMFS_jnode_t *node = loc->node_access;
+
+ ++node->reference_count;
+
+ return 0;
+}
+
+void IMFS_node_destroy( IMFS_jnode_t *node )
+{
+ IMFS_assert( node->reference_count == 0 );
+
+ (*node->control->node_destroy)( node );
+}
+
+void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
+{
+ IMFS_jnode_t *node = loc->node_access;
+
+ --node->reference_count;
+
+ if ( node->reference_count == 0 ) {
+ IMFS_node_destroy( node );
+ }
+}
+
+IMFS_jnode_t *IMFS_node_remove_default(
+ IMFS_jnode_t *node
+)
+{
+ return node;
+}
+
+void IMFS_node_destroy_default( IMFS_jnode_t *node )
+{
+ if ( ( node->flags & IMFS_NODE_FLAG_NAME_ALLOCATED ) != 0 ) {
+ free( RTEMS_DECONST( char *, node->name ) );
+ }
+
+ free( node );
+}