From d496e0979afb99a1d131d3b9183506d56f83ea26 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 16 Sep 2016 13:56:08 +0200 Subject: imfs: Untangle dependencies This helps to use IMFS_make_generic_node() without pulling in the complete IMFS implementation. --- cpukit/libfs/Makefile.am | 1 + cpukit/libfs/src/imfs/imfs_initsupp.c | 89 -------------------------- cpukit/libfs/src/imfs/imfs_node.c | 115 ++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 89 deletions(-) create mode 100644 cpukit/libfs/src/imfs/imfs_node.c diff --git a/cpukit/libfs/Makefile.am b/cpukit/libfs/Makefile.am index 7fccc2e11b..89e7581b28 100644 --- a/cpukit/libfs/Makefile.am +++ b/cpukit/libfs/Makefile.am @@ -59,6 +59,7 @@ libimfs_a_SOURCES += src/imfs/deviceio.c \ src/imfs/imfs_stat.c src/imfs/imfs_stat_file.c src/imfs/imfs_symlink.c \ src/imfs/imfs_unmount.c src/imfs/imfs_utime.c src/imfs/ioman.c \ src/imfs/imfs_memfile.c src/imfs/imfs.h +libimfs_a_SOURCES += src/imfs/imfs_node.c # POSIX FIFO/pipe libimfs_a_SOURCES += src/pipe/fifo.c src/pipe/pipe.c src/pipe/pipe.h diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c index 83018313e2..27b93cb41f 100644 --- a/cpukit/libfs/src/imfs/imfs_initsupp.c +++ b/cpukit/libfs/src/imfs/imfs_initsupp.c @@ -51,52 +51,6 @@ static int IMFS_determine_bytes_per_block( return 0; } -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_initialize_support( rtems_filesystem_mount_table_entry_t *mt_entry, const void *data @@ -133,33 +87,6 @@ int IMFS_initialize_support( return 0; } -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 ); - } -} - static IMFS_jnode_t *IMFS_node_initialize_enosys( IMFS_jnode_t *node, void *arg @@ -178,22 +105,6 @@ IMFS_jnode_t *IMFS_node_initialize_default( return 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 ); -} - const IMFS_mknod_control IMFS_mknod_control_enosys = { { .handlers = &rtems_filesystem_handlers_default, 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 + +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 ); +} -- cgit v1.2.3