From 2a929cc87152fc499715d43a808e7cb78c2e01cf Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 25 Jan 2001 15:59:58 +0000 Subject: 2001-01-25 Fernando Ruiz * Alternate email is correo@fernando-ruiz.com * libc/privateenv.c: New file. * include/rtems/libio_.h, libc/Makefile.am, libc/base_fs.c, libc/unmount.c: Moved default umask, current working directory, root, and links followed count into a structure "user environment" that can then be treated as a unit. This enable giving unique copies of these to individual threads or collection of threads. --- cpukit/include/rtems/libio_.h | 29 ++++++++++++++++-------- cpukit/libcsupport/include/rtems/libio_.h | 29 ++++++++++++++++-------- cpukit/libcsupport/src/base_fs.c | 6 ++--- cpukit/libcsupport/src/privateenv.c | 37 +++++++++++++++++++++++++++++++ cpukit/libcsupport/src/unmount.c | 1 - 5 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 cpukit/libcsupport/src/privateenv.c (limited to 'cpukit') diff --git a/cpukit/include/rtems/libio_.h b/cpukit/include/rtems/libio_.h index 008c7c3fb7..cda8faacf5 100644 --- a/cpukit/include/rtems/libio_.h +++ b/cpukit/include/rtems/libio_.h @@ -64,12 +64,6 @@ extern rtems_libio_t *rtems_libio_iops; 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 * @@ -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/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h index 008c7c3fb7..cda8faacf5 100644 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -64,12 +64,6 @@ extern rtems_libio_t *rtems_libio_iops; 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 * @@ -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/cpukit/libcsupport/src/base_fs.c b/cpukit/libcsupport/src/base_fs.c index 93c5a60d85..4132d52b6d 100644 --- a/cpukit/libcsupport/src/base_fs.c +++ b/cpukit/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/cpukit/libcsupport/src/privateenv.c b/cpukit/libcsupport/src/privateenv.c new file mode 100644 index 0000000000..4dc0144acc --- /dev/null +++ b/cpukit/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 +#include +#include + +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/cpukit/libcsupport/src/unmount.c b/cpukit/libcsupport/src/unmount.c index 33c6f25bee..dfd1797112 100644 --- a/cpukit/libcsupport/src/unmount.c +++ b/cpukit/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 -- cgit v1.2.3