summaryrefslogtreecommitdiff
path: root/include/rtems/userenv.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/rtems/userenv.h')
-rw-r--r--include/rtems/userenv.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/include/rtems/userenv.h b/include/rtems/userenv.h
new file mode 100644
index 0000000000..7d6ffb05a5
--- /dev/null
+++ b/include/rtems/userenv.h
@@ -0,0 +1,182 @@
+/**
+ * @file
+ *
+ * @ingroup LibIOEnv
+ * @brief User Environment Support
+ */
+
+/*
+ * 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.org/license/LICENSE.
+ */
+
+#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 <sys/param.h>
+#include <limits.h>
+
+#include <rtems.h>
+#include <rtems/fs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup LibIOEnv User Environment
+ *
+ * @ingroup LibIO
+ *
+ * @brief Provides a POSIX like user environment for tasks.
+ */
+/**@{**/
+
+#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
+#endif
+
+/**
+ * @brief User environment.
+ */
+typedef struct {
+ /**
+ * @brief The anchor directory for relative paths.
+ */
+ rtems_filesystem_global_location_t *current_directory;
+
+ /**
+ * @brief The anchor directory for absolute paths.
+ */
+ rtems_filesystem_global_location_t *root_directory;
+
+ /**
+ * @brief The file mode creation mask.
+ */
+ mode_t umask;
+
+ /**
+ * @brief The real user ID.
+ */
+ uid_t uid;
+
+ /**
+ * @brief The real group ID.
+ */
+ gid_t gid;
+
+ /**
+ * @brief The effective user ID.
+ */
+ uid_t euid;
+
+ /**
+ * @brief The effective group ID.
+ */
+ gid_t egid;
+
+ /**
+ * @brief The login buffer.
+ */
+ char login_buffer[LOGIN_NAME_MAX];
+
+ /**
+ * @brief The process group ID.
+ */
+ pid_t pgrp;
+
+ /**
+ * @brief The count of supplementary group IDs.
+ */
+ size_t ngroups;
+
+ /**
+ * @brief The list of supplementary group IDs.
+ */
+ gid_t groups[NGROUPS];
+} rtems_user_env_t;
+
+extern rtems_user_env_t rtems_global_user_env;
+
+/**
+ * @brief Fetch the pointer to the current user environment.
+ *
+ * If the task has a private user environment the pointer to it will be
+ * returned. Otherwise the pointer to rtems_global_user_env will be returned.
+ */
+rtems_user_env_t * rtems_current_user_env_get(void);
+
+#define rtems_current_user_env rtems_current_user_env_get()
+
+#define rtems_filesystem_current (rtems_current_user_env->current_directory)
+#define rtems_filesystem_root (rtems_current_user_env->root_directory)
+#define rtems_filesystem_umask (rtems_current_user_env->umask)
+
+#define _POSIX_types_Uid (rtems_current_user_env->uid)
+#define _POSIX_types_Gid (rtems_current_user_env->gid)
+#define _POSIX_types_Euid (rtems_current_user_env->euid)
+#define _POSIX_types_Egid (rtems_current_user_env->egid)
+#define _POSIX_types_Getlogin_buffer (rtems_current_user_env->login_buffer)
+
+/**
+ * @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.
+ *
+ * The private environment internally uses a POSIX key. The key is added to the
+ * configuration implicitly. But for each thread that uses a private environment
+ * a key value pair has to be configured by the application. If only the global
+ * environment is used there is no need to configure a key value pair.
+ *
+ * @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 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);
+
+/**
+ * @brief Gets the supplementary group IDs using the current user ID and
+ * updates the table of supplementary group IDs in the current user
+ * environment.
+ *
+ * In case of an error, the count of supplementary group IDs is set to zero.
+ */
+void rtems_current_user_env_getgroups(void);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */