Add env parameter to exec_sh()
Before passing the cmd to exec() we set the required environment variables. Also add the test for it.
This commit is contained in:
parent
1e0e50266b
commit
a7b978412c
@ -16,7 +16,7 @@ namespace process_util {
|
||||
void fork_detached(std::function<void()> const& lambda);
|
||||
|
||||
void exec(char* cmd, char** args);
|
||||
void exec_sh(const char* cmd);
|
||||
void exec_sh(const char* cmd, const vector<pair<string, string>>& env = {});
|
||||
|
||||
int wait(pid_t pid);
|
||||
|
||||
|
@ -124,9 +124,14 @@ namespace process_util {
|
||||
/**
|
||||
* Execute command using shell
|
||||
*/
|
||||
void exec_sh(const char* cmd) {
|
||||
void exec_sh(const char* cmd, const vector<pair<string, string>>& env) {
|
||||
if (cmd != nullptr) {
|
||||
static const string shell{env_util::get("POLYBAR_SHELL", "/bin/sh")};
|
||||
|
||||
for (const auto& kv_pair : env) {
|
||||
setenv(kv_pair.first.data(), kv_pair.second.data(), 1);
|
||||
}
|
||||
|
||||
execlp(shell.c_str(), shell.c_str(), "-c", cmd, nullptr);
|
||||
throw system_error("execlp() failed");
|
||||
}
|
||||
|
@ -32,3 +32,13 @@ TEST(SpawnAsync, exit_code) {
|
||||
|
||||
EXPECT_EQ(WEXITSTATUS(status), 42);
|
||||
}
|
||||
|
||||
TEST(SpawnAsync, env) {
|
||||
pid_t pid = spawn_async([] { exec_sh("exit $EXIT", {{"EXIT", "45"}}); });
|
||||
int status = 0;
|
||||
pid_t res = waitpid(pid, &status, 0);
|
||||
|
||||
EXPECT_EQ(res, pid);
|
||||
|
||||
EXPECT_EQ(WEXITSTATUS(status), 45);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user