diff options
Diffstat (limited to 'cpukit/include/rtems/userenv.h')
-rw-r--r-- | cpukit/include/rtems/userenv.h | 95 |
1 files changed, 69 insertions, 26 deletions
diff --git a/cpukit/include/rtems/userenv.h b/cpukit/include/rtems/userenv.h index 28ac69ebd3..123da98af5 100644 --- a/cpukit/include/rtems/userenv.h +++ b/cpukit/include/rtems/userenv.h @@ -1,13 +1,16 @@ /** - * @file rtems/userenv.h + * @file * - * This file defines the interface for POSIX per-process environment. + * @ingroup LibIOEnv */ /* * COPYRIGHT (c) 1989-2011. * 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.com/license/LICENSE. @@ -18,6 +21,13 @@ #ifndef _RTEMS_USERENV_H #define _RTEMS_USERENV_H +/* + * According to IEEE Std 1003.1-2001, + * limits.h is supposed to provide _POSIX_LOGIN_NAME_MAX + * XXX: We do not rely on this. + */ +#include <limits.h> + #include <rtems.h> #include <rtems/fs.h> @@ -25,33 +35,30 @@ extern "C" { #endif -/* - * External structures - */ - -/* - * According to IEEE Std 1003.1-2001, - * limits.h is supposed to provide _POSIX_LOGIN_NAME_MAX - * FIXME: We should not rely on this. +/** + * @defgroup LibIOEnv User Environment + * + * @ingroup LibIO + * + * @brief Provides a POSIX like user environment for tasks. + * + * @{ */ -#include <limits.h> #ifndef LOGIN_NAME_MAX -#ifdef _POSIX_LOGIN_NAME_MAX -#define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX -#else -/* Fallback */ -#define LOGIN_NAME_MAX 9 -#endif + #ifdef _POSIX_LOGIN_NAME_MAX + #define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX + #else + /* Fallback */ + #define LOGIN_NAME_MAX 9 + #endif #endif typedef struct { - rtems_id task_id; - rtems_filesystem_location_info_t current_directory; - rtems_filesystem_location_info_t root_directory; + rtems_filesystem_global_location_t *current_directory; + rtems_filesystem_global_location_t *root_directory; /* Default mode for all files. */ mode_t umask; - nlink_t link_counts; /* _POSIX_types */ uid_t uid; gid_t gid; @@ -59,6 +66,9 @@ typedef struct { gid_t egid; char login_buffer[LOGIN_NAME_MAX]; pid_t pgrp; /* process group id */ + /* User environment maintenance */ + rtems_id task_id; + int reference_count; } rtems_user_env_t; extern rtems_user_env_t * rtems_current_user_env; @@ -66,7 +76,6 @@ extern rtems_user_env_t rtems_global_user_env; #define rtems_filesystem_current (rtems_current_user_env->current_directory) #define rtems_filesystem_root (rtems_current_user_env->root_directory) -#define rtems_filesystem_link_counts (rtems_current_user_env->link_counts) #define rtems_filesystem_umask (rtems_current_user_env->umask) #define _POSIX_types_Uid (rtems_current_user_env->uid) @@ -75,14 +84,48 @@ extern rtems_user_env_t rtems_global_user_env; #define _POSIX_types_Egid (rtems_current_user_env->egid) #define _POSIX_types_Getlogin_buffer (rtems_current_user_env->login_buffer) - -/* - * Instantiate a private copy of the per user information for the calling task. +/** + * @brief Creates a private environment. + * + * If the task has already a private environment nothing will be changed. This + * function must be called from normal thread context and may block on a mutex. + * Thread dispatching is disabled to protect some critical sections. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_NO_MEMORY Not enough memory. + * @retval RTEMS_UNSATISFIED Cloning of the current environment failed. + * @retval RTEMS_TOO_MANY Cannot register the private environment. */ - rtems_status_code rtems_libio_set_private_env(void); + +/** + * @brief Creates a private environment shared with another task. + * + * An attempt to share the environment with itself has no effect. This + * function must be called from normal thread context and may block on a mutex. + * Thread dispatching is disabled to protect some critical sections. + * + * @param[in] task_id The private environment is shared with the task specified + * by this identifier. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_UNSATISFIED No shared environment is available for this task + * @retval RTEMS_TOO_MANY Cannot register the shared environment. + * identifier. + */ rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ; +/** + * @brief Use the global environment. + * + * A private environment will be released. This function may be called from + * every thread context. Thread dispatching is disabled to protect the + * critical sections. + */ +void rtems_libio_use_global_env(void); + +/** @} */ + #ifdef __cplusplus } #endif |