IMFS: Documentation

This commit is contained in:
Sebastian Huber
2012-12-21 21:38:00 +01:00
parent f58fd9702e
commit 9fd4d0d106

View File

@@ -159,42 +159,113 @@ typedef union {
IMFS_generic_t generic; IMFS_generic_t generic;
} IMFS_types_union; } IMFS_types_union;
/**
* @addtogroup IMFSGenericNodes
*
* @{
*/
/**
* @brief Initializes an IMFS node.
*
* @param[in,out] node The IMFS node.
* @param[in] info The IMFS type information.
*
* @retval node Successful operation.
* @retval NULL An error occurred. The @c errno indicates the error. This
* will abort the make operation.
*
* @see IMFS_node_control, IMFS_node_initialize_default(), and
* IMFS_node_initialize_generic().
*/
typedef IMFS_jnode_t *(*IMFS_node_control_initialize)( typedef IMFS_jnode_t *(*IMFS_node_control_initialize)(
IMFS_jnode_t *node, IMFS_jnode_t *node,
const IMFS_types_union *info const IMFS_types_union *info
); );
/** /**
* @brief Initialize Default IMFS Node * @brief Returns the node and does nothing else.
*
* @param[in,out] node The IMFS node.
* @param[in] info The IMFS type information.
*
* @retval node Returns always the node passed as parameter.
*
* @see IMFS_node_control.
*/ */
IMFS_jnode_t *IMFS_node_initialize_default( IMFS_jnode_t *IMFS_node_initialize_default(
IMFS_jnode_t *node, IMFS_jnode_t *node,
const IMFS_types_union *info const IMFS_types_union *info
); );
/**
* @brief Returns the node and sets the generic node context.
*
* @param[in,out] node The IMFS node.
* @param[in] info The IMFS type information.
*
* @retval node Returns always the node passed as parameter.
*
* @see IMFS_node_control.
*/
IMFS_jnode_t *IMFS_node_initialize_generic( IMFS_jnode_t *IMFS_node_initialize_generic(
IMFS_jnode_t *node, IMFS_jnode_t *node,
const IMFS_types_union *info const IMFS_types_union *info
); );
/**
* @brief Prepares the removal of an IMFS node from its parent directory.
*
* @param[in,out] node The IMFS node.
*
* @retval node Successful operation.
* @retval NULL An error occurred. The @c errno indicates the error. This
* will abort the removal operation.
*
* @see IMFS_node_control and IMFS_node_remove_default().
*/
typedef IMFS_jnode_t *(*IMFS_node_control_remove)( typedef IMFS_jnode_t *(*IMFS_node_control_remove)(
IMFS_jnode_t *node IMFS_jnode_t *node
); );
/** /**
* @brief Remove Default IMFS Node * @brief Returns the node and does nothing else.
*
* @param[in,out] node The IMFS node.
*
* @retval node Returns always the node passed as parameter.
*
* @see IMFS_node_control.
*/ */
IMFS_jnode_t *IMFS_node_remove_default( IMFS_jnode_t *IMFS_node_remove_default(
IMFS_jnode_t *node IMFS_jnode_t *node
); );
/**
* @brief Destroys an IMFS node.
*
* @param[in,out] node The IMFS node.
*
* @retval node Returns always the node passed as parameter.
*
* @see IMFS_node_control and IMFS_node_destroy_default().
*/
typedef IMFS_jnode_t *(*IMFS_node_control_destroy)( IMFS_jnode_t *node ); typedef IMFS_jnode_t *(*IMFS_node_control_destroy)( IMFS_jnode_t *node );
/** /**
* @brief Destroy Default IMFS Node * @brief Returns the node and does nothing else.
*
* @param[in,out] node The IMFS node.
*
* @retval node Returns always the node passed as parameter.
*
* @see IMFS_node_control.
*/ */
IMFS_jnode_t *IMFS_node_destroy_default( IMFS_jnode_t *node ); IMFS_jnode_t *IMFS_node_destroy_default( IMFS_jnode_t *node );
/**
* @brief IMFS node control.
*/
typedef struct { typedef struct {
IMFS_jnode_types_t imfs_type; IMFS_jnode_types_t imfs_type;
const rtems_filesystem_file_handlers_r *handlers; const rtems_filesystem_file_handlers_r *handlers;
@@ -203,12 +274,19 @@ typedef struct {
IMFS_node_control_destroy node_destroy; IMFS_node_control_destroy node_destroy;
} IMFS_node_control; } IMFS_node_control;
/** @} */
/* /*
* Major device number for the IMFS. This is not a real device number because * Major device number for the IMFS. This is not a real device number because
* the IMFS is just a file system and does not have a driver. * the IMFS is just a file system and does not have a driver.
*/ */
#define IMFS_DEVICE_MAJOR_NUMBER (0xfffe) #define IMFS_DEVICE_MAJOR_NUMBER (0xfffe)
/**
* @ingroup IMFSGenericNodes
*
* @brief Generic IMFS device major number.
*/
#define IMFS_GENERIC_DEVICE_MAJOR_NUMBER (0xfffd) #define IMFS_GENERIC_DEVICE_MAJOR_NUMBER (0xfffd)
/* /*
@@ -513,8 +591,62 @@ extern bool IMFS_is_imfs_instance(
const rtems_filesystem_location_info_t *loc const rtems_filesystem_location_info_t *loc
); );
/** /**
* @brief IMFS Make a Generic Node * @defgroup IMFSGenericNodes IMFS Generic Nodes
*
* @ingroup LibIO
*
* @brief Generic nodes are an alternative to standard drivers in RTEMS.
*
* The handlers of a generic node are called with less overhead compared to the
* standard driver operations. The usage of file system node handlers enable
* more features like support for fsync() and fdatasync(). The generic nodes
* use the reference counting of the IMFS. This provides automatic node
* destruction when the last reference vanishes.
*
* @{
*/
/**
* @brief Makes a generic IMFS node.
*
* @param[in] path The path to the new generic IMFS node.
* @param[in] mode The node mode.
* @param[in] node_control The node control.
* @param[in] context The node control handler context.
*
* @retval 0 Successful operation.
* @retval -1 An error occurred. The @c errno indicates the error.
*
* @code
* #include <sys/stat.h>
* #include <assert.h>
* #include <fcntl.h>
*
* #include <rtems/imfs.h>
*
* static const IMFS_node_control some_node_control = {
* .imfs_type = IMFS_GENERIC,
* .handlers = &some_node_handlers,
* .node_initialize = IMFS_node_initialize_generic,
* .node_remove = IMFS_node_remove_default,
* .node_destroy = some_node_destroy
* };
*
* void example(void *some_node_context)
* {
* int rv;
*
* rv = IMFS_make_generic_node(
* "/path/to/some/generic/node",
* S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO,
* &some_node_control,
* some_node_context
* );
* assert(rv == 0);
* }
* @endcode
*/ */
extern int IMFS_make_generic_node( extern int IMFS_make_generic_node(
const char *path, const char *path,
@@ -523,6 +655,8 @@ extern int IMFS_make_generic_node(
void *context void *context
); );
/** @} */
/** /**
* @brief Mount an IMFS * @brief Mount an IMFS
*/ */
@@ -805,6 +939,12 @@ static inline IMFS_jnode_t *IMFS_create_node(
); );
} }
/**
* @addtogroup IMFSGenericNodes
*
* @{
*/
static inline void *IMFS_generic_get_context_by_node( static inline void *IMFS_generic_get_context_by_node(
const IMFS_jnode_t *node const IMFS_jnode_t *node
) )
@@ -838,6 +978,8 @@ static inline dev_t IMFS_generic_get_device_identifier_by_node(
); );
} }
/** @} */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif