report: list envvars using uv_os_environ()
This commit simplifies the diagnostic report's code for listing environment variables by using uv_os_environ() instead of platform specific code. PR-URL: https://github.com/nodejs/node/pull/28963 Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
ce7f3ed13c
commit
9b221e533c
@ -20,10 +20,6 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
extern char** environ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
constexpr int NODE_REPORT_VERSION = 1;
|
constexpr int NODE_REPORT_VERSION = 1;
|
||||||
constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000;
|
constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000;
|
||||||
constexpr double SEC_PER_MICROS = 1e-6;
|
constexpr double SEC_PER_MICROS = 1e-6;
|
||||||
@ -552,6 +548,26 @@ static void PrintResourceUsage(JSONWriter* writer) {
|
|||||||
|
|
||||||
// Report operating system information.
|
// Report operating system information.
|
||||||
static void PrintSystemInformation(JSONWriter* writer) {
|
static void PrintSystemInformation(JSONWriter* writer) {
|
||||||
|
uv_env_item_t* envitems;
|
||||||
|
int envcount;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
writer->json_objectstart("environmentVariables");
|
||||||
|
|
||||||
|
{
|
||||||
|
Mutex::ScopedLock lock(node::per_process::env_var_mutex);
|
||||||
|
r = uv_os_environ(&envitems, &envcount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r == 0) {
|
||||||
|
for (int i = 0; i < envcount; i++)
|
||||||
|
writer->json_keyvalue(envitems[i].name, envitems[i].value);
|
||||||
|
|
||||||
|
uv_os_free_environ(envitems, envcount);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer->json_objectend();
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static struct {
|
static struct {
|
||||||
const char* description;
|
const char* description;
|
||||||
@ -576,45 +592,6 @@ static void PrintSystemInformation(JSONWriter* writer) {
|
|||||||
{"virtual_memory_kbytes", RLIMIT_AS}
|
{"virtual_memory_kbytes", RLIMIT_AS}
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
#endif // _WIN32
|
|
||||||
writer->json_objectstart("environmentVariables");
|
|
||||||
Mutex::ScopedLock lock(node::per_process::env_var_mutex);
|
|
||||||
#ifdef _WIN32
|
|
||||||
LPWSTR lpszVariable;
|
|
||||||
LPWCH lpvEnv;
|
|
||||||
|
|
||||||
// Get pointer to the environment block
|
|
||||||
lpvEnv = GetEnvironmentStringsW();
|
|
||||||
if (lpvEnv != nullptr) {
|
|
||||||
// Variable strings are separated by null bytes,
|
|
||||||
// and the block is terminated by a null byte.
|
|
||||||
lpszVariable = reinterpret_cast<LPWSTR>(lpvEnv);
|
|
||||||
while (*lpszVariable) {
|
|
||||||
DWORD size = WideCharToMultiByte(
|
|
||||||
CP_UTF8, 0, lpszVariable, -1, nullptr, 0, nullptr, nullptr);
|
|
||||||
char* str = new char[size];
|
|
||||||
WideCharToMultiByte(
|
|
||||||
CP_UTF8, 0, lpszVariable, -1, str, size, nullptr, nullptr);
|
|
||||||
std::string env(str);
|
|
||||||
int sep = env.rfind('=');
|
|
||||||
std::string key = env.substr(0, sep);
|
|
||||||
std::string value = env.substr(sep + 1);
|
|
||||||
writer->json_keyvalue(key, value);
|
|
||||||
lpszVariable += lstrlenW(lpszVariable) + 1;
|
|
||||||
}
|
|
||||||
FreeEnvironmentStringsW(lpvEnv);
|
|
||||||
}
|
|
||||||
writer->json_objectend();
|
|
||||||
#else
|
|
||||||
std::string pair;
|
|
||||||
for (char** env = environ; *env != nullptr; ++env) {
|
|
||||||
std::string pair(*env);
|
|
||||||
int separator = pair.find('=');
|
|
||||||
std::string key = pair.substr(0, separator);
|
|
||||||
std::string str = pair.substr(separator + 1);
|
|
||||||
writer->json_keyvalue(key, str);
|
|
||||||
}
|
|
||||||
writer->json_objectend();
|
|
||||||
|
|
||||||
writer->json_objectstart("userLimits");
|
writer->json_objectstart("userLimits");
|
||||||
struct rlimit limit;
|
struct rlimit limit;
|
||||||
@ -638,7 +615,7 @@ static void PrintSystemInformation(JSONWriter* writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
writer->json_objectend();
|
writer->json_objectend();
|
||||||
#endif
|
#endif // _WIN32
|
||||||
|
|
||||||
PrintLoadedLibraries(writer);
|
PrintLoadedLibraries(writer);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user