fix bugs in passing env variables

main
hkr04 2025-03-24 04:17:01 +08:00
parent 5e9ff48b07
commit 726d0892c8
1 changed files with 20 additions and 22 deletions

View File

@ -205,6 +205,19 @@ bool stdio_client::start_server_process() {
LOG_INFO("Starting server process: ", command_); LOG_INFO("Starting server process: ", command_);
auto convert_to_string = [](const json& value) -> std::string {
if (value.is_string()) {
return value.get<std::string>();
} else if (value.is_number_integer()) {
return std::to_string(value.get<int>());
} else if (value.is_number_float()) {
return std::to_string(value.get<double>());
} else if (value.is_boolean()) {
return value.get<bool>() ? "true" : "false";
}
throw std::runtime_error("Unsupported type");
};
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
// Windows实现 // Windows实现
SECURITY_ATTRIBUTES sa; SECURITY_ATTRIBUTES sa;
@ -262,26 +275,11 @@ bool stdio_client::start_server_process() {
// 准备环境变量 // 准备环境变量
std::string env_block; std::string env_block;
if (!env_vars_.empty()) { if (!env_vars_.empty()) {
char* system_env = GetEnvironmentStringsA(); for (const auto& [key, value] : env_vars_.items()) {
if (system_env) { std::string env_var = key + "=" + convert_to_string(value);
// 复制系统环境变量 env_block += env_var + '\0';
const char* env_ptr = system_env;
while (*env_ptr) {
std::string env_var(env_ptr);
env_block += env_var + '\0';
env_ptr += env_var.size() + 1;
}
FreeEnvironmentStringsA(system_env);
// 添加自定义环境变量
for (auto it = env_vars_.begin(); it != env_vars_.end(); ++it) {
std::string env_var = it.key() + "=" + it.value().get<std::string>();
env_block += env_var + '\0';
}
// 添加结束符
env_block += '\0';
} }
env_block += '\0';
} }
// 创建子进程 // 创建子进程
@ -359,10 +357,10 @@ bool stdio_client::start_server_process() {
// 设置环境变量 // 设置环境变量
if (!env_vars_.empty()) { if (!env_vars_.empty()) {
for (auto it = env_vars_.begin(); it != env_vars_.end(); ++it) { for (const auto& [key, value] : env_vars_.items()) {
std::string env_var = it.key() + "=" + it.value().get<std::string>(); std::string env_var = key + "=" + convert_to_string(value);
if (putenv(const_cast<char*>(env_var.c_str())) != 0) { if (putenv(const_cast<char*>(env_var.c_str())) != 0) {
LOG_ERROR("Failed to set environment variable: ", it.key()); LOG_ERROR("Failed to set environment variable: ", key);
} }
} }
} }