diff --git a/src/basic/env-util.c b/src/basic/env-util.c index bf191044c0..a84863ff22 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -747,3 +747,15 @@ int getenv_bool_secure(const char *p) { return parse_boolean(e); } + +int set_unset_env(const char *name, const char *value, bool overwrite) { + int r; + + if (value) + r = setenv(name, value, overwrite); + else + r = unsetenv(name); + if (r < 0) + return -errno; + return 0; +} diff --git a/src/basic/env-util.h b/src/basic/env-util.h index a37603dbd8..6684b3350f 100644 --- a/src/basic/env-util.h +++ b/src/basic/env-util.h @@ -52,3 +52,6 @@ char *strv_env_get(char **x, const char *n) _pure_; int getenv_bool(const char *p); int getenv_bool_secure(const char *p); + +/* Like setenv, but calls unsetenv if value == NULL. */ +int set_unset_env(const char *name, const char *value, bool overwrite); diff --git a/src/shared/pager.c b/src/shared/pager.c index cd8a840e57..f689d9f28f 100644 --- a/src/shared/pager.c +++ b/src/shared/pager.c @@ -189,12 +189,9 @@ int pager_open(PagerFlags flags) { /* We generally always set variables used by less, even if we end up using a different pager. * They shouldn't hurt in any case, and ideally other pagers would look at them too. */ - if (use_secure_mode) - r = setenv("LESSSECURE", "1", 1); - else - r = unsetenv("LESSSECURE"); + r = set_unset_env("LESSSECURE", use_secure_mode ? "1" : NULL, true); if (r < 0) { - log_error_errno(errno, "Failed to adjust environment variable LESSSECURE: %m"); + log_error_errno(r, "Failed to adjust environment variable LESSSECURE: %m"); _exit(EXIT_FAILURE); } diff --git a/src/test/test-exec-util.c b/src/test/test-exec-util.c index 5da69f7321..e9e8e21040 100644 --- a/src/test/test-exec-util.c +++ b/src/test/test-exec-util.c @@ -372,10 +372,7 @@ static void test_environment_gathering(void) { assert_se(streq(strv_env_get(env, "PATH"), DEFAULT_PATH ":/no/such/file")); /* reset environ PATH */ - if (old) - (void) setenv("PATH", old, 1); - else - (void) unsetenv("PATH"); + assert_se(set_unset_env("PATH", old, true) == 0); } static void test_error_catching(void) { diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 455c602c30..abc792a452 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -12,6 +12,7 @@ #include "bus-locator.h" #include "bus-map-properties.h" #include "bus-print-properties.h" +#include "env-util.h" #include "format-table.h" #include "in-addr-util.h" #include "main-func.h" @@ -139,12 +140,9 @@ static int print_status_info(const StatusInfo *i) { /* Restore the $TZ */ - if (old_tz) - r = setenv("TZ", old_tz, true); - else - r = unsetenv("TZ"); + r = set_unset_env("TZ", old_tz, true); if (r < 0) - log_warning_errno(errno, "Failed to set TZ environment variable, ignoring: %m"); + log_warning_errno(r, "Failed to set TZ environment variable, ignoring: %m"); else tzset();