summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libc/privateenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libc/privateenv.c')
-rw-r--r--c/src/lib/libc/privateenv.c56
1 files changed, 49 insertions, 7 deletions
diff --git a/c/src/lib/libc/privateenv.c b/c/src/lib/libc/privateenv.c
index 4dc0144acc..7b1e5d1e8e 100644
--- a/c/src/lib/libc/privateenv.c
+++ b/c/src/lib/libc/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,&current_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;
}