summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/userenv.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/include/rtems/userenv.h')
-rw-r--r--cpukit/include/rtems/userenv.h95
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