diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2001-04-20 21:11:25 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2001-04-20 21:11:25 +0000 |
commit | d8a91555127ade80dfe71e2d9c823c7350eea05f (patch) | |
tree | 3ece886f3f0893e8354619d1db10ccc9cabd2f97 /cpukit/libcsupport/src/privateenv.c | |
parent | 2001-04-20 Correo Fernando-ruiz <correo@fernando-ruiz.com> (diff) | |
download | rtems-d8a91555127ade80dfe71e2d9c823c7350eea05f.tar.bz2 |
2001-04-20 Correo Fernando-ruiz <correo@fernando-ruiz.com>
* include/rtems/libio_.h, libc/chroot.c, libc/privateenv.c:
Private environment and chroot() enhancements and fixes. Comments:
+ privateenv has been modified to let at chroot() to be more
POSIX like Sergei Organov recommended.
+ A task owner lets that rtems_set_private_env() will be
called twice or more times.
+ chroot() can be called without a previous
rtems_set_private_env(); (transpanrently)
+ The second call of rtems_set_private_env() makes a internal
chroot("/") into global imfs_root.
+ chroot() runs like chdir() without a previous chdir("/") with
the global root.
+ The current directory can be in a wrong place like Linux and
many other Unices.
Diffstat (limited to 'cpukit/libcsupport/src/privateenv.c')
-rw-r--r-- | cpukit/libcsupport/src/privateenv.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/cpukit/libcsupport/src/privateenv.c b/cpukit/libcsupport/src/privateenv.c index 4dc0144acc..7b1e5d1e8e 100644 --- a/cpukit/libcsupport/src/privateenv.c +++ b/cpukit/libcsupport/src/privateenv.c @@ -23,15 +23,57 @@ rtems_status_code rtems_libio_set_private_env(void) { rtems_status_code sc; + rtems_id task_id; - sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free); - if (sc != RTEMS_SUCCESSFUL) - return sc; + sc=rtems_task_ident(RTEMS_SELF,0,&task_id); + 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; + /* 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; +} + +/* + * Share a same private environment beetween two task: + * Task_id (remote) and RTEMS_SELF(current). + */ + +rtems_status_code rtems_libio_share_private_env(rtems_id task_id) { + rtems_status_code sc; + rtems_user_env_t * shared_user_env; + rtems_id current_task_id; + + sc=rtems_task_ident(RTEMS_SELF,0,¤t_task_id); + if (sc != RTEMS_SUCCESSFUL) return sc; + + 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; - *rtems_current_user_env = rtems_global_user_env; return RTEMS_SUCCESSFUL; } |