aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/librc/librc-misc.c6
-rw-r--r--src/rc/rc-misc.c42
2 files changed, 24 insertions, 24 deletions
diff --git a/src/librc/librc-misc.c b/src/librc/librc-misc.c
index 5cde2028..b6157009 100644
--- a/src/librc/librc-misc.c
+++ b/src/librc/librc-misc.c
@@ -138,10 +138,14 @@ RC_STRINGLIST *rc_config_load(const char *file)
TAILQ_FOREACH(line, list, entries) {
/* Get entry */
p = line->value;
+ if (! p)
+ continue;
+ if (strncmp(p, "export ", 7) == 0)
+ p += 7;
if (! (token = strsep(&p, "=")))
continue;
- entry = xstrdup (token);
+ entry = xstrdup(token);
/* Preserve shell coloring */
if (*p == '$')
token = line->value;
diff --git a/src/rc/rc-misc.c b/src/rc/rc-misc.c
index bf03a35c..d94cd2e7 100644
--- a/src/rc/rc-misc.c
+++ b/src/rc/rc-misc.c
@@ -124,37 +124,27 @@ void env_filter(void)
RC_STRINGLIST *profile = NULL;
RC_STRINGLIST *env_list;
RC_STRING *env;
- char *env_name;
char *e;
- char *token;
size_t i = 0;
/* Add the user defined list of vars */
- env_allow = rc_stringlist_new();
- 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);
-
+ env_allow = rc_stringlist_split(rc_conf_value ("rc_env_allow"), " ");
if (exists(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();
- while (environ[i])
- rc_stringlist_add(env_list, environ[i++]);
+ while (environ[i]) {
+ env = rc_stringlist_add(env_list, environ[i++]);
+ e = strchr(env->value, '=');
+ if (e)
+ *e = '\0';
+ }
TAILQ_FOREACH(env, env_list, entries) {
/* Check the whitelist */
- i = 0;
- while (env_whitelist[i]) {
- if (strcmp(env_whitelist[i++], env->value))
+ for (i = 0; env_whitelist[i]; i++) {
+ if (strcmp(env_whitelist[i], env->value) == 0)
break;
}
if (env_whitelist[i])
@@ -164,13 +154,19 @@ void env_filter(void)
if (rc_stringlist_find(env_allow, env->value))
continue;
- /* Now check our profile */
-
/* OK, not allowed! */
+ unsetenv(env->value);
+ }
+
+ /* Now add anything missing from the profile */
+ TAILQ_FOREACH(env, profile, entries) {
e = strchr(env->value, '=');
*e = '\0';
- unsetenv(env->value);
+ if (!getenv(env->value))
+ setenv(env->value, e + 1, 1);
}
+
+
rc_stringlist_free(env_list);
rc_stringlist_free(env_allow);
rc_stringlist_free(profile);