diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-16 13:56:08 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-19 07:22:01 +0200 |
commit | d496e0979afb99a1d131d3b9183506d56f83ea26 (patch) | |
tree | af239d6dbacfd6dc13653a8f24ae10a840dbfc3b /cpukit/libfs/src/imfs/imfs_node.c | |
parent | imfs: Fix IMFS_stat_file() (diff) | |
download | rtems-d496e0979afb99a1d131d3b9183506d56f83ea26.tar.bz2 |
imfs: Untangle dependencies
This helps to use IMFS_make_generic_node() without pulling in the
complete IMFS implementation.
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_node.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_node.c | 115 |
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 ); +} |