summaryrefslogtreecommitdiff
path: root/rtemsNfs/rtems-filesystem-patch
diff options
context:
space:
mode:
Diffstat (limited to 'rtemsNfs/rtems-filesystem-patch')
-rw-r--r--rtemsNfs/rtems-filesystem-patch860
1 files changed, 0 insertions, 860 deletions
diff --git a/rtemsNfs/rtems-filesystem-patch b/rtemsNfs/rtems-filesystem-patch
deleted file mode 100644
index c2d7861..0000000
--- a/rtemsNfs/rtems-filesystem-patch
+++ /dev/null
@@ -1,860 +0,0 @@
-# Diffed against OAR_orig (ss-20020301) on Sun Nov 3 00:24:13 PST 2002
-# T.S.
-
-For more information about this patch consult README (CAVEATS section).
-
-To apply this patch,
-
-chdir to c/src/lib/libc
-
-and issue
-
- patch -p0 < this_file
-
-It is always a good idea to try a "dry-run" before applying a patch:
-
- patch --dry-run -p0 < this_file
-
-Index: Makefile.am
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/Makefile.am,v
-retrieving revision 1.1.1.2
-retrieving revision 1.2
-diff -c -r1.1.1.2 -r1.2
-*** Makefile.am 7 Mar 2002 01:53:46 -0000 1.1.1.2
---- Makefile.am 28 Mar 2002 20:59:16 -0000 1.2
-***************
-*** 1,5 ****
- ##
-! ## $Id$
- ##
-
- AUTOMAKE_OPTIONS = foreign 1.4
---- 1,5 ----
- ##
-! ## $Id$
- ##
-
- AUTOMAKE_OPTIONS = foreign 1.4
-***************
-*** 32,37 ****
---- 32,39 ----
-
- MALLOC_C_FILES = malloc.c mallocfreespace.c __brk.c __sbrk.c
-
-+ ENVIRON_C_FILES = envlock.c
-+
- PASSWORD_GROUP_C_FILES = getpwent.c getgrent.c
-
- TERMINAL_IDENTIFICATION_C_FILES = ctermid.c isatty.c ttyname.c ttyname_r.c
-***************
-*** 42,48 ****
- UNIX_LIBC_C_FILES = unixlibc.c hosterr.c
-
- COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \
-! $(MALLOC_C_FILES) $(TERMIOS_C_FILES) $(ERROR_C_FILES) \
- $(ASSOCIATION_C_FILES)
-
- UNIX_C_FILES = $(UNIX_LIBC_C_FILES)
---- 44,50 ----
- UNIX_LIBC_C_FILES = unixlibc.c hosterr.c
-
- COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \
-! $(MALLOC_C_FILES) $(ENVIRON_C_FILES) $(TERMIOS_C_FILES) $(ERROR_C_FILES) \
- $(ASSOCIATION_C_FILES)
-
- UNIX_C_FILES = $(UNIX_LIBC_C_FILES)
-Index: base_fs.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/base_fs.c,v
-retrieving revision 1.1.1.1
-diff -c -r1.1.1.1 base_fs.c
-*** base_fs.c 14 Dec 2001 22:52:31 -0000 1.1.1.1
---- base_fs.c 26 Oct 2002 02:45:15 -0000
-***************
-*** 49,54 ****
---- 49,55 ----
- int status;
- rtems_filesystem_mount_table_entry_t *entry;
- rtems_filesystem_mount_table_t *mt;
-+ rtems_filesystem_location_info_t loc;
-
- /*
- * Set the default umask to "022".
-***************
-*** 75,82 ****
- rtems_fatal_error_occurred( 0xABCD0002 );
-
- rtems_filesystem_link_counts = 0;
- rtems_filesystem_root = entry->mt_fs_root;
-! rtems_filesystem_current = rtems_filesystem_root;
-
-
- /*
---- 76,113 ----
- rtems_fatal_error_occurred( 0xABCD0002 );
-
- rtems_filesystem_link_counts = 0;
-+
-+ /* setup the 'current' and 'root' directories
-+ *
-+ * NOTE: cloning the pathlocs is not strictly
-+ * necessary. Since we implicitely let
-+ * all threads that don't call
-+ * libio_set_private_env() share the same
-+ * (initial) 'root' and 'current' locs,
-+ * we (also implicitely) assume that the
-+ * root filesystem doesn't care about
-+ * reference counts.
-+ * I just inserted the code snippet below
-+ * to remind everybody of the fact by
-+ * making it more explicit...
-+ * Ideally, every thread would have to
-+ * call either share_private_env() or
-+ * set_private_env() - but then: that's
-+ * gonna hit performance.
-+ *
-+ * Till Straumann, 10/25/2002
-+ */
- rtems_filesystem_root = entry->mt_fs_root;
-! /* Clone the root pathloc */
-! rtems_filesystem_evaluate_path("/", 0, &loc, 0);
-! rtems_filesystem_root = loc;
-! /* One more clone for the current node */
-! rtems_filesystem_evaluate_path("/", 0, &loc, 0);
-! rtems_filesystem_current = loc;
-!
-! /* Note: the global_env's refcnt doesn't matter
-! * as the global env is never released
-! */
-
-
- /*
-Index: chroot.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/chroot.c,v
-retrieving revision 1.1.1.2
-diff -c -r1.1.1.2 chroot.c
-*** chroot.c 7 Mar 2002 01:53:47 -0000 1.1.1.2
---- chroot.c 29 Oct 2002 03:01:47 -0000
-***************
-*** 38,51 ****
- rtems_set_errno_and_return_minus_one( ENOTSUP );
- };
-
-- loc = rtems_filesystem_root; /* save the value */
--
- result = chdir(pathname);
- if (result) {
-- rtems_filesystem_root = loc; /* restore the value */
- rtems_set_errno_and_return_minus_one( errno );
- };
-! rtems_filesystem_root = rtems_filesystem_current;
-
- return 0;
- }
---- 38,53 ----
- rtems_set_errno_and_return_minus_one( ENOTSUP );
- };
-
- result = chdir(pathname);
- if (result) {
- rtems_set_errno_and_return_minus_one( errno );
- };
-! /* clone the new root location */
-! if (rtems_filesystem_evaluate_path(".", 0, &loc, 0)) {
-! rtems_set_errno_and_return_minus_one( errno );
-! }
-! rtems_filesystem_freenode(&rtems_filesystem_root);
-! rtems_filesystem_root = loc;
-
- return 0;
- }
-Index: eval.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/eval.c,v
-retrieving revision 1.1.1.2
-retrieving revision 1.2
-diff -c -r1.1.1.2 -r1.2
-*** eval.c 7 Mar 2002 01:53:48 -0000 1.1.1.2
---- eval.c 29 Oct 2002 21:03:50 -0000 1.2
-***************
-*** 10,16 ****
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
---- 10,16 ----
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
-***************
-*** 60,76 ****
-
- if ( (result == 0) && follow_link ) {
-
-! if ( !pathloc->ops->node_type_h )
- rtems_set_errno_and_return_minus_one( ENOTSUP );
-
- type = (*pathloc->ops->node_type_h)( pathloc );
-
- if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) ||
- ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) {
-
-! if ( !pathloc->ops->eval_link_h )
- rtems_set_errno_and_return_minus_one( ENOTSUP );
-
- result = (*pathloc->ops->eval_link_h)( pathloc, flags );
-
- }
---- 60,93 ----
-
- if ( (result == 0) && follow_link ) {
-
-! if ( !pathloc->ops->node_type_h ) {
-! rtems_filesystem_freenode(pathloc);
- rtems_set_errno_and_return_minus_one( ENOTSUP );
-+ }
-
- type = (*pathloc->ops->node_type_h)( pathloc );
-
- if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) ||
- ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) {
-
-! if ( !pathloc->ops->eval_link_h ) {
-! rtems_filesystem_freenode(pathloc);
- rtems_set_errno_and_return_minus_one( ENOTSUP );
-+ }
-
-+ /* what to do with the valid node pathloc points to
-+ * if eval_link_h() fails?
-+ * Let the FS implementation deal with this case. It
-+ * should probably free pathloc in either case:
-+ * - if the link evaluation fails, it must free the
-+ * original (valid) pathloc because we are going
-+ * to return -1 and hence the FS generics won't
-+ * cleanup pathloc
-+ * - if the link evaluation is successful, the updated
-+ * pathloc will be passed up (and eventually released).
-+ * Hence, the (valid) original node that we submit to
-+ * eval_link_h() should be released by the handler.
-+ */
- result = (*pathloc->ops->eval_link_h)( pathloc, flags );
-
- }
-Index: fchdir.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/fchdir.c,v
-retrieving revision 1.1.1.2
-diff -c -r1.1.1.2 fchdir.c
-*** fchdir.c 7 Mar 2002 01:53:48 -0000 1.1.1.2
---- fchdir.c 25 Oct 2002 23:59:03 -0000
-***************
-*** 29,34 ****
---- 29,35 ----
- )
- {
- rtems_libio_t *iop;
-+ rtems_filesystem_location_info_t loc;
-
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
-***************
-*** 65,74 ****
- * this node which we are making here. I can
- * see the freenode interface but do not see
- * allocnode node interface. It maybe node_type.
- */
-
- rtems_filesystem_current = iop->pathinfo;
-
- return 0;
- }
--
---- 66,80 ----
- * this node which we are making here. I can
- * see the freenode interface but do not see
- * allocnode node interface. It maybe node_type.
-+ *
-+ * FIXEC: T.Straumann: it is evaluate_path()
- */
-
- rtems_filesystem_current = iop->pathinfo;
-
-+ /* clone the current node */
-+ rtems_filesystem_evaluate_path(".", 0, &loc, 0);
-+ rtems_filesystem_current = loc;
-+
- return 0;
- }
-Index: getgrent.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/getgrent.c,v
-retrieving revision 1.1.1.1
-diff -c -r1.1.1.1 getgrent.c
-*** getgrent.c 14 Dec 2001 22:52:31 -0000 1.1.1.1
---- getgrent.c 27 Oct 2002 18:24:20 -0000
-***************
-*** 50,63 ****
---- 50,69 ----
- )
- {
- FILE *fp;
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
-
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if ((fp = fopen ("/etc/group", "r")) == NULL) {
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 72,84 ****
---- 78,94 ----
- if (!strcmp (groupname, name)) {
- fclose (fp);
- *result = grp;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return 0;
- }
- }
- fclose (fp);
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 104,118 ****
---- 114,134 ----
- )
- {
- FILE *fp;
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
-
-
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if ((fp = fopen ("/etc/group", "r")) == NULL) {
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 128,140 ****
---- 144,160 ----
- if (gid == gr_group.gr_gid) {
- fclose (fp);
- *result = grp;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return 0;
- }
- }
- fclose (fp);
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 174,188 ****
---- 194,214 ----
- void
- setgrent ()
- {
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if (group_fp != NULL)
- fclose (group_fp);
-
- group_fp = fopen ("/etc/group", "r");
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- }
-
- void
-Index: getpwent.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/getpwent.c,v
-retrieving revision 1.1.1.1
-diff -c -r1.1.1.1 getpwent.c
-*** getpwent.c 14 Dec 2001 22:52:31 -0000 1.1.1.1
---- getpwent.c 27 Oct 2002 18:18:52 -0000
-***************
-*** 97,110 ****
---- 97,116 ----
- )
- {
- FILE *fp;
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
-
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if ((fp = fopen ("/etc/passwd", "r")) == NULL) {
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 123,135 ****
---- 129,145 ----
- if (!strcmp (logname, name)) {
- fclose (fp);
- *result = pwd;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return 0;
- }
- }
- fclose (fp);
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 155,168 ****
---- 165,184 ----
- )
- {
- FILE *fp;
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
-
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if ((fp = fopen ("/etc/passwd", "r")) == NULL) {
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 181,193 ****
---- 197,213 ----
- if (uid == pwd->pw_uid) {
- fclose (fp);
- *result = pwd;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return 0;
- }
- }
- fclose (fp);
- errno = EINVAL;
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- return -1;
- }
-
-***************
-*** 230,244 ****
---- 250,270 ----
-
- void setpwent( void )
- {
-+ #if 0
- rtems_user_env_t * aux=rtems_current_user_env; /* save */
-+ #endif
- init_etc_passwd_group();
-+ #if 0
- rtems_current_user_env=&rtems_global_user_env; /* set root */
-+ #endif
-
- if (passwd_fp != NULL)
- fclose (passwd_fp);
-
- passwd_fp = fopen ("/etc/passwd", "r");
-+ #if 0
- rtems_current_user_env=aux; /* restore */
-+ #endif
- }
-
- void endpwent( void )
-Index: mknod.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/mknod.c,v
-retrieving revision 1.1.1.2
-retrieving revision 1.2
-diff -c -r1.1.1.2 -r1.2
-*** mknod.c 7 Mar 2002 01:53:51 -0000 1.1.1.2
---- mknod.c 29 Oct 2002 21:03:50 -0000 1.2
-***************
-*** 12,18 ****
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
---- 12,18 ----
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
-***************
-*** 49,55 ****
- rtems_filesystem_get_start_loc( pathname, &i, &temp_loc );
-
- if ( !temp_loc.ops->evalformake_h ) {
-- rtems_filesystem_freenode( &temp_loc );
- rtems_set_errno_and_return_minus_one( ENOTSUP );
- }
-
---- 49,54 ----
-Index: mount.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/mount.c,v
-retrieving revision 1.1.1.1
-diff -c -r1.1.1.1 mount.c
-*** mount.c 14 Dec 2001 22:52:33 -0000 1.1.1.1
---- mount.c 30 Oct 2002 06:39:09 -0000
-***************
-*** 14,20 ****
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
---- 14,20 ----
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- */
-
- #if HAVE_CONFIG_H
-***************
-*** 101,106 ****
---- 101,113 ----
- return -1;
- }
-
-+ /* Do they support being mounted at all ? */
-+ if ( !fs_ops->fsmount_me_h ) {
-+ errno = ENOTSUP;
-+ goto cleanup_and_bail;
-+ }
-+
-+
- /*
- * Allocate a mount table entry
- */
-***************
-*** 140,145 ****
---- 147,158 ----
- */
-
- loc_to_free = &loc;
-+
-+ if ( !loc.ops->node_type_h ) {
-+ errno = ENOTSUP;
-+ goto cleanup_and_bail;
-+ }
-+
- if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
- errno = ENOTDIR;
- goto cleanup_and_bail;
-***************
-*** 198,210 ****
- temp_mt_entry->mt_point_node.mt_entry = NULL;
- }
-
-! if ( !fs_ops->fsmount_me_h ) {
-! errno = ENOTSUP;
- goto cleanup_and_bail;
- }
--
-- if ( fs_ops->fsmount_me_h( temp_mt_entry ) )
-- goto cleanup_and_bail;
-
- /*
- * Add the mount table entry to the mount table chain
---- 211,223 ----
- temp_mt_entry->mt_point_node.mt_entry = NULL;
- }
-
-! if ( fs_ops->fsmount_me_h( temp_mt_entry ) ) {
-! /* try to undo the mount operation */
-! if ( loc.ops->unmount_h ) {
-! loc.ops->unmount_h( temp_mt_entry );
-! }
- goto cleanup_and_bail;
- }
-
- /*
- * Add the mount table entry to the mount table chain
-Index: newlibc.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/newlibc.c,v
-retrieving revision 1.1.1.1
-retrieving revision 1.3
-diff -c -r1.1.1.1 -r1.3
-*** newlibc.c 14 Dec 2001 22:52:33 -0000 1.1.1.1
---- newlibc.c 16 Apr 2002 19:41:03 -0000 1.3
-***************
-*** 9,15 ****
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- *
- */
-
---- 9,15 ----
- * found in the file LICENSE in this distribution or at
- * http://www.OARcorp.com/rtems/license.html.
- *
-! * $Id$
- *
- */
-
-Index: privateenv.c
-===================================================================
-RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/privateenv.c,v
-retrieving revision 1.1.1.2
-diff -c -r1.1.1.2 privateenv.c
-*** privateenv.c 7 Mar 2002 01:53:51 -0000 1.1.1.2
---- privateenv.c 27 Oct 2002 18:35:34 -0000
-***************
-*** 23,47 ****
- #include <rtems/libio.h>
- #include <rtems/libio_.h>
-
- rtems_status_code rtems_libio_set_private_env(void) {
-! rtems_status_code sc;
-! rtems_id task_id;
-
- sc=rtems_task_ident(RTEMS_SELF,0,&task_id);
- if (sc != RTEMS_SUCCESSFUL) return sc;
-
- /* Only for the first time a malloc is necesary */
-! if (rtems_current_user_env==&rtems_global_user_env) {
-! 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;
- };
-
-- /* the side effect desired . chroot("/") */
- *rtems_current_user_env = rtems_global_user_env; /* get the global values*/
- rtems_current_user_env->task_id=task_id; /* mark the local values*/
-
- return RTEMS_SUCCESSFUL;
- }
---- 23,92 ----
- #include <rtems/libio.h>
- #include <rtems/libio_.h>
-
-+ extern Chain_Control rtems_filesystem_mount_table_control;
-+
-+ #define THE_ROOT_FS_LOC \
-+ (((rtems_filesystem_mount_table_entry_t*)\
-+ rtems_filesystem_mount_table_control.first)->mt_fs_root)
-+
-+ /* cleanup a user environment
-+ * NOTE: this must be called with
-+ * thread dispatching disabled!
-+ */
-+ static void
-+ free_user_env(rtems_user_env_t *env)
-+ {
-+ if (env != &rtems_global_user_env
-+ && --env->refcnt <= 0) {
-+ rtems_filesystem_freenode( &env->current_directory);
-+ rtems_filesystem_freenode( &env->root_directory);
-+ free(env);
-+ }
-+ }
-+
- rtems_status_code rtems_libio_set_private_env(void) {
-! rtems_status_code sc;
-! rtems_id task_id;
-! rtems_filesystem_location_info_t loc;
-
- sc=rtems_task_ident(RTEMS_SELF,0,&task_id);
- if (sc != RTEMS_SUCCESSFUL) return sc;
-
- /* Only for the first time a malloc is necesary */
-! if (rtems_current_user_env==&rtems_global_user_env) {
-! rtems_user_env_t *tmp = malloc(sizeof(rtems_user_env_t));
-! if (!tmp)
- return RTEMS_NO_MEMORY;
-+
-+ tmp->refcnt = 1;
-+
-+ sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env);
-+ if (sc != RTEMS_SUCCESSFUL) {
-+ /* don't use free_user_env because the pathlocs are
-+ * not initialized yet
-+ */
-+ free(tmp);
-+ return sc;
-+ }
-+ rtems_current_user_env = tmp;
- };
-
- *rtems_current_user_env = rtems_global_user_env; /* get the global values*/
- rtems_current_user_env->task_id=task_id; /* mark the local values*/
-+
-+ /* get a clean root */
-+ rtems_filesystem_root = THE_ROOT_FS_LOC;
-+
-+ /* Clone the pathlocs. In contrast to most other
-+ * code we must _not_ free the original locs because
-+ * what we are trying to do here is forking off
-+ * clones.
-+ */
-+
-+ rtems_filesystem_evaluate_path("/", 0, &loc, 0);
-+ rtems_filesystem_root = loc;
-+ rtems_filesystem_evaluate_path("/", 0, &loc, 0);
-+ rtems_filesystem_current = loc;
-
- return RTEMS_SUCCESSFUL;
- }
-***************
-*** 51,56 ****
---- 96,115 ----
- * Task_id (remote) and RTEMS_SELF(current).
- */
-
-+ /* NOTE:
-+ *
-+ * THIS CODE HAS NO PROTECTION IMPLEMENTED
-+ *
-+ * Tasks who wish to share their environments must
-+ *
-+ * a) assert that no participants are concurrently
-+ * executing
-+ * libio_share_private_env() and/or libio_set_private_env()
-+ *
-+ * b) mutex access to rtems_filesystem_current, rtems_filesytem_root
-+ * while changing any of those (chdir(), chroot()).
-+ */
-+
- rtems_status_code rtems_libio_share_private_env(rtems_id task_id) {
- rtems_status_code sc;
- rtems_user_env_t * shared_user_env;
-***************
-*** 61,81 ****
-
- if (rtems_current_user_env->task_id==current_task_id) {
- /* kill the current user env & task_var*/
-! free(rtems_current_user_env);
- sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env);
- if (sc != RTEMS_SUCCESSFUL) return sc;
- };
-
- sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env,
- (void*)&shared_user_env );
-! if (sc != RTEMS_SUCCESSFUL) return sc;
-
-! /* don't free(NULL'ed) at the task_delete. It is a shared var... */
-! sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,NULL);
-! if (sc != RTEMS_SUCCESSFUL) return sc;
-
- /* the current_user_env is the same pointer that remote env */
- rtems_current_user_env = shared_user_env;
-
- return RTEMS_SUCCESSFUL;
- }
---- 120,152 ----
-
- if (rtems_current_user_env->task_id==current_task_id) {
- /* kill the current user env & task_var*/
-! rtems_user_env_t *tmp = rtems_current_user_env;
- sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env);
- if (sc != RTEMS_SUCCESSFUL) return sc;
-+ free_user_env(tmp);
- };
-
-+ /* AT THIS POINT, rtems_current_user_env is DANGLING */
-+
- sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env,
- (void*)&shared_user_env );
-! if (sc != RTEMS_SUCCESSFUL)
-! goto bailout;
-
-! sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env);
-! if (sc != RTEMS_SUCCESSFUL)
-! goto bailout;
-
- /* the current_user_env is the same pointer that remote env */
- rtems_current_user_env = shared_user_env;
-
-+ /* increase the reference count */
-+ rtems_current_user_env->refcnt++;
-+
- return RTEMS_SUCCESSFUL;
-+
-+ bailout:
-+ /* fallback to the global env */
-+ rtems_current_user_env = &rtems_global_user_env;
-+ return sc;
- }