slave: unsetenv() env vars that have been set to the empty string

That is, users can now *clear* environment variables by doing:

  [environment]
  VAR=””

Note that the quotes are required.

Closes #1225
This commit is contained in:
Daniel Eklöf 2022-12-01 19:43:38 +01:00
parent 646314469a
commit ccfb953bb0
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 24 additions and 13 deletions

View file

@ -51,8 +51,11 @@
* `name` capability to `XTGETTCAP`.
* String values in `foot.ini` may now be quoted. This can be used to
set a value to the empty string, for example.
* Environment variables can now be **unset**, by setting
`[environment].<variable>=""` (quotes are required) ([#1225][1225])
[1136]: https://codeberg.org/dnkl/foot/issues/1136
[1225]: https://codeberg.org/dnkl/foot/issues/1225
### Changed

View file

@ -2295,21 +2295,22 @@ parse_section_environment(struct context *ctx)
{
struct config *conf = ctx->conf;
const char *key = ctx->key;
const char *value = ctx->value;
/* Check for pre-existing env variable */
tll_foreach(conf->env_vars, it) {
if (strcmp(it->item.name, key) == 0) {
free(it->item.value);
it->item.value = xstrdup(value);
return true;
}
if (strcmp(it->item.name, key) == 0)
return value_to_str(ctx, &it->item.value);
}
struct env_var var = {
.name = xstrdup(key),
.value = xstrdup(value),
};
tll_push_back(conf->env_vars, var);
/*
* No pre-existing variable - allocate a new one
*/
char *value = NULL;
if (!value_to_str(ctx, &value))
return false;
tll_push_back(conf->env_vars, ((struct env_var){xstrdup(key), value}));
return true;
}

11
slave.c
View file

@ -359,8 +359,15 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv,
#endif
if (extra_env_vars != NULL) {
tll_foreach(*extra_env_vars, it)
setenv(it->item.name, it->item.value, 1);
tll_foreach(*extra_env_vars, it) {
const char *name = it->item.name;
const char *value = it->item.value;
if (strlen(value) == 0)
unsetenv(name);
else
setenv(name, value, 1);
}
}
char **_shell_argv = NULL;