summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
Diffstat (limited to 'c')
-rw-r--r--c/src/exec/include/rtems/libio_.h29
-rw-r--r--c/src/exec/libcsupport/include/rtems/libio_.h29
-rw-r--r--c/src/exec/libcsupport/src/Makefile.am2
-rw-r--r--c/src/exec/libcsupport/src/base_fs.c6
-rw-r--r--c/src/exec/libcsupport/src/privateenv.c37
-rw-r--r--c/src/exec/libcsupport/src/unmount.c1
-rw-r--r--c/src/lib/include/rtems/libio_.h29
-rw-r--r--c/src/lib/libc/Makefile.am2
-rw-r--r--c/src/lib/libc/base_fs.c6
-rw-r--r--c/src/lib/libc/privateenv.c37
-rw-r--r--c/src/lib/libc/unmount.c1
11 files changed, 140 insertions, 39 deletions
diff --git a/c/src/exec/include/rtems/libio_.h b/c/src/exec/include/rtems/libio_.h
index 008c7c3fb7..cda8faacf5 100644
--- a/c/src/exec/include/rtems/libio_.h
+++ b/c/src/exec/include/rtems/libio_.h
@@ -65,12 +65,6 @@ extern rtems_libio_t *rtems_libio_last_iop;
extern rtems_libio_t *rtems_libio_iop_freelist;
/*
- * Default mode for all files.
- */
-
-extern mode_t rtems_filesystem_umask;
-
-/*
* set_errno_and_return_minus_one
*
* Macro to ease common way to return an error.
@@ -214,10 +208,27 @@ extern mode_t rtems_filesystem_umask;
/*
* External structures
*/
+typedef struct {
+ rtems_filesystem_location_info_t current_directory;
+ rtems_filesystem_location_info_t root_directory;
+ /* Default mode for all files. */
+ mode_t umask;
+ nlink_t link_counts;
+} rtems_user_env_t;
+
+extern rtems_user_env_t * rtems_current_user_env;
+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)
+
+/*
+ * Instantiate a private copy of the per user information for the calling task.
+ */
-extern rtems_filesystem_location_info_t rtems_filesystem_current;
-extern rtems_filesystem_location_info_t rtems_filesystem_root;
-extern nlink_t rtems_filesystem_link_counts;
+rtems_status_code rtems_libio_set_private_env(void);
/*
diff --git a/c/src/exec/libcsupport/include/rtems/libio_.h b/c/src/exec/libcsupport/include/rtems/libio_.h
index 008c7c3fb7..cda8faacf5 100644
--- a/c/src/exec/libcsupport/include/rtems/libio_.h
+++ b/c/src/exec/libcsupport/include/rtems/libio_.h
@@ -65,12 +65,6 @@ extern rtems_libio_t *rtems_libio_last_iop;
extern rtems_libio_t *rtems_libio_iop_freelist;
/*
- * Default mode for all files.
- */
-
-extern mode_t rtems_filesystem_umask;
-
-/*
* set_errno_and_return_minus_one
*
* Macro to ease common way to return an error.
@@ -214,10 +208,27 @@ extern mode_t rtems_filesystem_umask;
/*
* External structures
*/
+typedef struct {
+ rtems_filesystem_location_info_t current_directory;
+ rtems_filesystem_location_info_t root_directory;
+ /* Default mode for all files. */
+ mode_t umask;
+ nlink_t link_counts;
+} rtems_user_env_t;
+
+extern rtems_user_env_t * rtems_current_user_env;
+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)
+
+/*
+ * Instantiate a private copy of the per user information for the calling task.
+ */
-extern rtems_filesystem_location_info_t rtems_filesystem_current;
-extern rtems_filesystem_location_info_t rtems_filesystem_root;
-extern nlink_t rtems_filesystem_link_counts;
+rtems_status_code rtems_libio_set_private_env(void);
/*
diff --git a/c/src/exec/libcsupport/src/Makefile.am b/c/src/exec/libcsupport/src/Makefile.am
index c26efcc92a..2c68aa9377 100644
--- a/c/src/exec/libcsupport/src/Makefile.am
+++ b/c/src/exec/libcsupport/src/Makefile.am
@@ -12,7 +12,7 @@ ERROR_C_FILES = error.c
ASSOCIATION_C_FILES = assoc.c assocnamebad.c
BASE_FS_C_FILES = base_fs.c mount.c unmount.c libio.c \
- libio_sockets.c eval.c fs_null_handlers.c
+ libio_sockets.c eval.c fs_null_handlers.c privateenv.c
TERMIOS_C_FILES = cfgetispeed.c cfgetospeed.c cfsetispeed.c cfsetospeed.c \
tcgetattr.c tcsetattr.c tcdrain.c tcflow.c tcflush.c tcgetprgrp.c \
diff --git a/c/src/exec/libcsupport/src/base_fs.c b/c/src/exec/libcsupport/src/base_fs.c
index 93c5a60d85..4132d52b6d 100644
--- a/c/src/exec/libcsupport/src/base_fs.c
+++ b/c/src/exec/libcsupport/src/base_fs.c
@@ -23,15 +23,13 @@
* Global information for the base file system.
*/
-rtems_filesystem_location_info_t rtems_filesystem_current;
-rtems_filesystem_location_info_t rtems_filesystem_root;
-nlink_t rtems_filesystem_link_counts;
+rtems_user_env_t rtems_global_user_env;
+rtems_user_env_t * rtems_current_user_env = &rtems_global_user_env;
/*
* Default mode for created files.
*/
-mode_t rtems_filesystem_umask;
/*
* rtems_filesystem_initialize
diff --git a/c/src/exec/libcsupport/src/privateenv.c b/c/src/exec/libcsupport/src/privateenv.c
new file mode 100644
index 0000000000..4dc0144acc
--- /dev/null
+++ b/c/src/exec/libcsupport/src/privateenv.c
@@ -0,0 +1,37 @@
+/*
+ * Instantatiate a private user environment for the calling thread.
+ *
+ * Submitted by: fernando.ruiz@ctv.es (correo@fernando-ruiz.com)
+ *
+ * COPYRIGHT (c) 1989-2000.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/libio_.h>
+
+rtems_status_code rtems_libio_set_private_env(void) {
+ rtems_status_code sc;
+
+ sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free);
+ if (sc != RTEMS_SUCCESSFUL)
+ return sc;
+
+ rtems_current_user_env = malloc(sizeof(rtems_user_env_t));
+ if (!rtems_current_user_env)
+ return RTEMS_NO_MEMORY;
+
+ *rtems_current_user_env = rtems_global_user_env;
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/exec/libcsupport/src/unmount.c b/c/src/exec/libcsupport/src/unmount.c
index 33c6f25bee..dfd1797112 100644
--- a/c/src/exec/libcsupport/src/unmount.c
+++ b/c/src/exec/libcsupport/src/unmount.c
@@ -37,7 +37,6 @@
*/
extern Chain_Control rtems_filesystem_mount_table_control;
-extern rtems_filesystem_location_info_t rtems_filesystem_current;
int search_mt_for_mount_point(
rtems_filesystem_location_info_t *location_of_mount_point
diff --git a/c/src/lib/include/rtems/libio_.h b/c/src/lib/include/rtems/libio_.h
index 008c7c3fb7..cda8faacf5 100644
--- a/c/src/lib/include/rtems/libio_.h
+++ b/c/src/lib/include/rtems/libio_.h
@@ -65,12 +65,6 @@ extern rtems_libio_t *rtems_libio_last_iop;
extern rtems_libio_t *rtems_libio_iop_freelist;
/*
- * Default mode for all files.
- */
-
-extern mode_t rtems_filesystem_umask;
-
-/*
* set_errno_and_return_minus_one
*
* Macro to ease common way to return an error.
@@ -214,10 +208,27 @@ extern mode_t rtems_filesystem_umask;
/*
* External structures
*/
+typedef struct {
+ rtems_filesystem_location_info_t current_directory;
+ rtems_filesystem_location_info_t root_directory;
+ /* Default mode for all files. */
+ mode_t umask;
+ nlink_t link_counts;
+} rtems_user_env_t;
+
+extern rtems_user_env_t * rtems_current_user_env;
+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)
+
+/*
+ * Instantiate a private copy of the per user information for the calling task.
+ */
-extern rtems_filesystem_location_info_t rtems_filesystem_current;
-extern rtems_filesystem_location_info_t rtems_filesystem_root;
-extern nlink_t rtems_filesystem_link_counts;
+rtems_status_code rtems_libio_set_private_env(void);
/*
diff --git a/c/src/lib/libc/Makefile.am b/c/src/lib/libc/Makefile.am
index c26efcc92a..2c68aa9377 100644
--- a/c/src/lib/libc/Makefile.am
+++ b/c/src/lib/libc/Makefile.am
@@ -12,7 +12,7 @@ ERROR_C_FILES = error.c
ASSOCIATION_C_FILES = assoc.c assocnamebad.c
BASE_FS_C_FILES = base_fs.c mount.c unmount.c libio.c \
- libio_sockets.c eval.c fs_null_handlers.c
+ libio_sockets.c eval.c fs_null_handlers.c privateenv.c
TERMIOS_C_FILES = cfgetispeed.c cfgetospeed.c cfsetispeed.c cfsetospeed.c \
tcgetattr.c tcsetattr.c tcdrain.c tcflow.c tcflush.c tcgetprgrp.c \
diff --git a/c/src/lib/libc/base_fs.c b/c/src/lib/libc/base_fs.c
index 93c5a60d85..4132d52b6d 100644
--- a/c/src/lib/libc/base_fs.c
+++ b/c/src/lib/libc/base_fs.c
@@ -23,15 +23,13 @@
* Global information for the base file system.
*/
-rtems_filesystem_location_info_t rtems_filesystem_current;
-rtems_filesystem_location_info_t rtems_filesystem_root;
-nlink_t rtems_filesystem_link_counts;
+rtems_user_env_t rtems_global_user_env;
+rtems_user_env_t * rtems_current_user_env = &rtems_global_user_env;
/*
* Default mode for created files.
*/
-mode_t rtems_filesystem_umask;
/*
* rtems_filesystem_initialize
diff --git a/c/src/lib/libc/privateenv.c b/c/src/lib/libc/privateenv.c
new file mode 100644
index 0000000000..4dc0144acc
--- /dev/null
+++ b/c/src/lib/libc/privateenv.c
@@ -0,0 +1,37 @@
+/*
+ * Instantatiate a private user environment for the calling thread.
+ *
+ * Submitted by: fernando.ruiz@ctv.es (correo@fernando-ruiz.com)
+ *
+ * COPYRIGHT (c) 1989-2000.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/libio_.h>
+
+rtems_status_code rtems_libio_set_private_env(void) {
+ rtems_status_code sc;
+
+ sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free);
+ if (sc != RTEMS_SUCCESSFUL)
+ return sc;
+
+ rtems_current_user_env = malloc(sizeof(rtems_user_env_t));
+ if (!rtems_current_user_env)
+ return RTEMS_NO_MEMORY;
+
+ *rtems_current_user_env = rtems_global_user_env;
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libc/unmount.c b/c/src/lib/libc/unmount.c
index 33c6f25bee..dfd1797112 100644
--- a/c/src/lib/libc/unmount.c
+++ b/c/src/lib/libc/unmount.c
@@ -37,7 +37,6 @@
*/
extern Chain_Control rtems_filesystem_mount_table_control;
-extern rtems_filesystem_location_info_t rtems_filesystem_current;
int search_mt_for_mount_point(
rtems_filesystem_location_info_t *location_of_mount_point