scoped_env_var.hpp
1 
6 #pragma once
7 
8 #include <cstdlib>
9 #include <string>
10 
11 namespace rapidsmpf::rrun {
12 
29 class ScopedEnvVar {
30  public:
37  ScopedEnvVar(char const* name, char const* value) : name_(name) {
38  char const* old = std::getenv(name);
39  if (old != nullptr) {
40  had_value_ = true;
41  old_value_ = old;
42  }
43  if (value != nullptr) {
44  setenv(name, value, 1);
45  } else {
46  unsetenv(name);
47  }
48  }
49 
50  ~ScopedEnvVar() {
51  if (had_value_) {
52  setenv(name_.c_str(), old_value_.c_str(), 1);
53  } else {
54  unsetenv(name_.c_str());
55  }
56  }
57 
58  ScopedEnvVar(ScopedEnvVar const&) = delete;
59  ScopedEnvVar& operator=(ScopedEnvVar const&) = delete;
60 
61  private:
62  std::string name_;
63  std::string old_value_;
64  bool had_value_{false};
65 };
66 
67 } // namespace rapidsmpf::rrun
RAII guard that saves, optionally modifies, and restores an environment variable.
ScopedEnvVar(char const *name, char const *value)
Construct the guard, saving and optionally replacing the variable.