Add missing profile bits to env, #72.

This commit is contained in:
Roy Marples 2008-09-18 19:46:10 +00:00
parent 354fb96ee9
commit e368a4b4f8
2 changed files with 25 additions and 25 deletions

View File

@ -138,10 +138,14 @@ RC_STRINGLIST *rc_config_load(const char *file)
TAILQ_FOREACH(line, list, entries) { TAILQ_FOREACH(line, list, entries) {
/* Get entry */ /* Get entry */
p = line->value; p = line->value;
if (! p)
continue;
if (strncmp(p, "export ", 7) == 0)
p += 7;
if (! (token = strsep(&p, "="))) if (! (token = strsep(&p, "=")))
continue; continue;
entry = xstrdup (token); entry = xstrdup(token);
/* Preserve shell coloring */ /* Preserve shell coloring */
if (*p == '$') if (*p == '$')
token = line->value; token = line->value;

View File

@ -124,37 +124,27 @@ void env_filter(void)
RC_STRINGLIST *profile = NULL; RC_STRINGLIST *profile = NULL;
RC_STRINGLIST *env_list; RC_STRINGLIST *env_list;
RC_STRING *env; RC_STRING *env;
char *env_name;
char *e; char *e;
char *token;
size_t i = 0; size_t i = 0;
/* Add the user defined list of vars */ /* Add the user defined list of vars */
env_allow = rc_stringlist_new(); env_allow = rc_stringlist_split(rc_conf_value ("rc_env_allow"), " ");
e = env_name = xstrdup(rc_conf_value ("rc_env_allow"));
while ((token = strsep(&e, " "))) {
if (token[0] == '*') {
free(env_name);
rc_stringlist_free(env_allow);
return;
}
rc_stringlist_add(env_allow, token);
}
free(env_name);
if (exists(PROFILE_ENV)) if (exists(PROFILE_ENV))
profile = rc_config_load(PROFILE_ENV); profile = rc_config_load(PROFILE_ENV);
/* Copy the env and work from this so we can remove safely */ /* Copy the env and work from this so we can manipulate it safely */
env_list = rc_stringlist_new(); env_list = rc_stringlist_new();
while (environ[i]) while (environ[i]) {
rc_stringlist_add(env_list, environ[i++]); env = rc_stringlist_add(env_list, environ[i++]);
e = strchr(env->value, '=');
if (e)
*e = '\0';
}
TAILQ_FOREACH(env, env_list, entries) { TAILQ_FOREACH(env, env_list, entries) {
/* Check the whitelist */ /* Check the whitelist */
i = 0; for (i = 0; env_whitelist[i]; i++) {
while (env_whitelist[i]) { if (strcmp(env_whitelist[i], env->value) == 0)
if (strcmp(env_whitelist[i++], env->value))
break; break;
} }
if (env_whitelist[i]) if (env_whitelist[i])
@ -164,13 +154,19 @@ void env_filter(void)
if (rc_stringlist_find(env_allow, env->value)) if (rc_stringlist_find(env_allow, env->value))
continue; continue;
/* Now check our profile */
/* OK, not allowed! */ /* OK, not allowed! */
e = strchr(env->value, '=');
*e = '\0';
unsetenv(env->value); unsetenv(env->value);
} }
/* Now add anything missing from the profile */
TAILQ_FOREACH(env, profile, entries) {
e = strchr(env->value, '=');
*e = '\0';
if (!getenv(env->value))
setenv(env->value, e + 1, 1);
}
rc_stringlist_free(env_list); rc_stringlist_free(env_list);
rc_stringlist_free(env_allow); rc_stringlist_free(env_allow);
rc_stringlist_free(profile); rc_stringlist_free(profile);