diff --git a/builtin_set.cpp b/builtin_set.cpp index 9068372f0..aae87550d 100644 --- a/builtin_set.cpp +++ b/builtin_set.cpp @@ -157,6 +157,13 @@ static int my_env_set(const wchar_t *key, const wcstring_list_t &val, int scope) break; } + case ENV_SCOPE: + { + append_format(stderr_buffer, _(L"%ls: Tried to set the special variable '%ls' with the wrong scope\n"), L"set", key); + retcode=1; + break; + } + case ENV_INVALID: { append_format(stderr_buffer, _(L"%ls: Unknown error"), L"set"); diff --git a/env.cpp b/env.cpp index 821bd8f1b..77ee75aa5 100644 --- a/env.cpp +++ b/env.cpp @@ -634,6 +634,15 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode) } } + if ((var_mode & (ENV_LOCAL | ENV_UNIVERSAL)) && (is_read_only(key) || is_electric(key))) + { + return ENV_SCOPE; + } + if ((var_mode & ENV_EXPORT) && is_electric(key)) + { + return ENV_SCOPE; + } + if ((var_mode & ENV_USER) && is_read_only(key)) { return ENV_PERM; diff --git a/env.h b/env.h index e886a5b2c..a0931c87f 100644 --- a/env.h +++ b/env.h @@ -49,6 +49,7 @@ enum { ENV_PERM = 1, + ENV_SCOPE, ENV_INVALID } ; @@ -82,6 +83,7 @@ void env_init(const struct config_paths_t *paths = NULL); The current error codes are: * ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that the user tried to change a read-only variable. + * ENV_SCOPE, the variable cannot be set in the given scope. This applies to readonly/electric variables set from the local or universal scopes, or set as exported. * ENV_INVALID, the variable name or mode was invalid */