Added comments to sys_(get|put)env() - please remove them from the kernel.

Renamed team_wait_on_team() to wait_for_team() (more BeOS-alike).
Adapted to other changes (new thread functions).
Cleanups.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2576 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2003-01-27 03:09:33 +00:00
parent dba0db7fbe
commit 6d8aafc66e
1 changed files with 42 additions and 38 deletions

View File

@ -221,28 +221,31 @@ error:
} }
int status_t
team_wait_on_team(team_id id, int *retcode) wait_for_team(team_id id, status_t *_returnCode)
{ {
struct team *p; struct team *team;
thread_id tid; thread_id thread;
int state; cpu_status state;
// find main thread and wait for that
state = disable_interrupts(); state = disable_interrupts();
GRAB_TEAM_LOCK(); GRAB_TEAM_LOCK();
p = team_get_team_struct_locked(id);
if (p && p->main_thread) team = team_get_team_struct_locked(id);
tid = p->main_thread->id; if (team && team->main_thread)
thread = team->main_thread->id;
else else
tid = ERR_INVALID_HANDLE; thread = ERR_INVALID_HANDLE;
RELEASE_TEAM_LOCK(); RELEASE_TEAM_LOCK();
restore_interrupts(state); restore_interrupts(state);
if (tid < 0) if (thread < 0)
return tid; return thread;
return thread_wait_on_thread(tid, retcode); return wait_for_thread(thread, _returnCode);
} }
@ -389,7 +392,7 @@ get_arguments_data_size(char **args, int argc)
} }
static int static int32
team_create_team2(void *args) team_create_team2(void *args)
{ {
int err; int err;
@ -551,13 +554,13 @@ team_create_team(const char *path, const char *name, char **args, int argc, char
team->aspace = vm_get_aspace_by_id(team->_aspace_id); team->aspace = vm_get_aspace_by_id(team->_aspace_id);
// create a kernel thread, but under the context of the new team // create a kernel thread, but under the context of the new team
tid = thread_create_kernel_thread_etc(name, team_create_team2, teamArgs, team); tid = spawn_kernel_thread_etc(team_create_team2, name, B_NORMAL_PRIORITY, teamArgs, team->id);
if (tid < 0) { if (tid < 0) {
err = tid; err = tid;
goto err5; goto err5;
} }
thread_resume_thread(tid); resume_thread(tid);
return pid; return pid;
@ -716,23 +719,25 @@ sys_setenv(const char *name, const char *value, int overwrite)
int rc = 0; int rc = 0;
int i; int i;
char *p; char *p;
// ToDo: please put me out of the kernel into libroot.so!
dprintf("sys_setenv: entry (name=%s, value=%s)\n", name, value); dprintf("sys_setenv: entry (name=%s, value=%s)\n", name, value);
if (strlen(name) + strlen(value) + 1 >= SYS_THREAD_STRING_LENGTH_MAX) if (strlen(name) + strlen(value) + 1 >= SYS_THREAD_STRING_LENGTH_MAX)
return -1; return -1;
state = disable_interrupts(); state = disable_interrupts();
GRAB_TEAM_LOCK(); GRAB_TEAM_LOCK();
strcpy(var, name); strcpy(var, name);
strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1); strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1);
name_size = strlen(var); name_size = strlen(var);
strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1); strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1);
env_space = (addr)thread_get_current_thread()->team->user_env_base; env_space = (addr)thread_get_current_thread()->team->user_env_base;
envp = (char **)env_space; envp = (char **)env_space;
for (envc=0; envp[envc]; envc++) { for (envc = 0; envp[envc]; envc++) {
if (!strncmp(envp[envc], var, name_size)) { if (!strncmp(envp[envc], var, name_size)) {
var_exists = true; var_exists = true;
var_pos = envc; var_pos = envc;
@ -740,37 +745,34 @@ sys_setenv(const char *name, const char *value, int overwrite)
} }
if (!var_exists) if (!var_exists)
var_pos = envc; var_pos = envc;
dprintf("sys_setenv: variable does%s exist\n", var_exists ? "" : " not"); dprintf("sys_setenv: variable does%s exist\n", var_exists ? "" : " not");
if ((!var_exists) || (var_exists && overwrite)) { if ((!var_exists) || (var_exists && overwrite)) {
// XXX- make a better allocator // XXX- make a better allocator
if (var_exists) { if (var_exists) {
if (strlen(var) <= strlen(envp[var_pos])) { if (strlen(var) <= strlen(envp[var_pos])) {
strcpy(envp[var_pos], var); strcpy(envp[var_pos], var);
} } else {
else { for (p = (char *)env_space + ENV_SIZE - 1, i = 0; envp[i]; i++)
for (p=(char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++)
if (envp[i] < p) if (envp[i] < p)
p = envp[i]; p = envp[i];
p -= (strlen(var) + 1); p -= (strlen(var) + 1);
if (p < (char *)env_space + (envc * sizeof(char *))) { if (p < (char *)env_space + (envc * sizeof(char *))) {
rc = -1; rc = -1;
} } else {
else {
envp[var_pos] = p; envp[var_pos] = p;
strcpy(envp[var_pos], var); strcpy(envp[var_pos], var);
} }
} }
} }
else { else {
for (p=(char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++) for (p = (char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++)
if (envp[i] < p) if (envp[i] < p)
p = envp[i]; p = envp[i];
p -= (strlen(var) + 1); p -= (strlen(var) + 1);
if (p < (char *)env_space + ((envc + 1) * sizeof(char *))) { if (p < (char *)env_space + ((envc + 1) * sizeof(char *))) {
rc = -1; rc = -1;
} } else {
else {
envp[envc] = p; envp[envc] = p;
strcpy(envp[envc], var); strcpy(envp[envc], var);
envp[envc + 1] = NULL; envp[envc + 1] = NULL;
@ -795,12 +797,14 @@ sys_getenv(const char *name, char **value)
int i; int i;
int len = strlen(name); int len = strlen(name);
int rc = -1; int rc = -1;
// ToDo: please put me out of the kernel into libroot.so!
state = disable_interrupts(); state = disable_interrupts();
GRAB_TEAM_LOCK(); GRAB_TEAM_LOCK();
envp = (char **)thread_get_current_thread()->team->user_env_base; envp = (char **)thread_get_current_thread()->team->user_env_base;
for (i=0; envp[i]; i++) { for (i = 0; envp[i]; i++) {
if (!strncmp(envp[i], name, len)) { if (!strncmp(envp[i], name, len)) {
p = envp[i] + len; p = envp[i] + len;
if (*p == '=') { if (*p == '=') {
@ -821,18 +825,18 @@ sys_getenv(const char *name, char **value)
// #pragma mark - // #pragma mark -
int status_t
user_team_wait_on_team(team_id id, int *userReturnCode) user_wait_for_team(team_id id, status_t *_userReturnCode)
{ {
int returnCode; status_t returnCode;
int status; status_t status;
if (!CHECK_USER_ADDRESS(userReturnCode)) if (!CHECK_USER_ADDRESS(_userReturnCode))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
status = team_wait_on_team(id, &returnCode); status = wait_for_team(id, &returnCode);
if (status >= B_OK) { if (status >= B_OK) {
if (user_memcpy(userReturnCode, &returnCode, sizeof(returnCode)) < B_OK) if (user_memcpy(_userReturnCode, &returnCode, sizeof(returnCode)) < B_OK)
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
} }