#include "node_metadata.h" #include "ares.h" #include "brotli/encode.h" #include "llhttp.h" #include "nghttp2/nghttp2ver.h" #include "node.h" #include "util.h" #include "uv.h" #include "v8.h" #include "zlib.h" #if HAVE_OPENSSL #include #endif // HAVE_OPENSSL #ifdef NODE_HAVE_I18N_SUPPORT #include #include #include #include #endif // NODE_HAVE_I18N_SUPPORT namespace node { namespace per_process { Metadata metadata; } #if HAVE_OPENSSL constexpr int search(const char* s, int n, int c) { return *s == c ? n : search(s + 1, n + 1, c); } std::string GetOpenSSLVersion() { // sample openssl version string format // for reference: "OpenSSL 1.1.0i 14 Aug 2018" char buf[128]; const char* etext = OPENSSL_VERSION_TEXT; const int start = search(etext, 0, ' ') + 1; etext += start; const int end = search(etext, start, ' '); const int len = end - start; snprintf(buf, sizeof(buf), "%.*s", len, &OPENSSL_VERSION_TEXT[start]); return std::string(buf); } #endif // HAVE_OPENSSL #ifdef NODE_HAVE_I18N_SUPPORT void Metadata::Versions::InitializeIntlVersions() { UErrorCode status = U_ZERO_ERROR; const char* tz_version = icu::TimeZone::getTZDataVersion(status); if (U_SUCCESS(status)) { tz = tz_version; } char buf[U_MAX_VERSION_STRING_LENGTH]; UVersionInfo versionArray; ulocdata_getCLDRVersion(versionArray, &status); if (U_SUCCESS(status)) { u_versionToString(versionArray, buf); cldr = buf; } } #endif // NODE_HAVE_I18N_SUPPORT Metadata::Versions::Versions() { node = NODE_VERSION_STRING; v8 = v8::V8::GetVersion(); uv = uv_version_string(); zlib = ZLIB_VERSION; ares = ARES_VERSION_STR; modules = NODE_STRINGIFY(NODE_MODULE_VERSION); nghttp2 = NGHTTP2_VERSION; napi = NODE_STRINGIFY(NAPI_VERSION); llhttp = NODE_STRINGIFY(LLHTTP_VERSION_MAJOR) "." NODE_STRINGIFY(LLHTTP_VERSION_MINOR) "." NODE_STRINGIFY(LLHTTP_VERSION_PATCH); brotli = std::to_string(BrotliEncoderVersion() >> 24) + "." + std::to_string((BrotliEncoderVersion() & 0xFFF000) >> 12) + "." + std::to_string(BrotliEncoderVersion() & 0xFFF); #if HAVE_OPENSSL openssl = GetOpenSSLVersion(); #endif #ifdef NODE_HAVE_I18N_SUPPORT icu = U_ICU_VERSION; unicode = U_UNICODE_VERSION; #endif // NODE_HAVE_I18N_SUPPORT } Metadata::Release::Release() : name(NODE_RELEASE) { #if NODE_VERSION_IS_LTS lts = NODE_VERSION_LTS_CODENAME; #endif // NODE_VERSION_IS_LTS #ifdef NODE_HAS_RELEASE_URLS #define NODE_RELEASE_URLPFX NODE_RELEASE_URLBASE "v" NODE_VERSION_STRING "/" #define NODE_RELEASE_URLFPFX NODE_RELEASE_URLPFX "node-v" NODE_VERSION_STRING source_url = NODE_RELEASE_URLFPFX ".tar.gz"; headers_url = NODE_RELEASE_URLFPFX "-headers.tar.gz"; #ifdef _WIN32 lib_url = strcmp(NODE_ARCH, "ia32") ? NODE_RELEASE_URLPFX "win-" NODE_ARCH "/node.lib" : NODE_RELEASE_URLPFX "win-x86/node.lib"; #endif // _WIN32 #endif // NODE_HAS_RELEASE_URLS } Metadata::Metadata() : arch(NODE_ARCH), platform(NODE_PLATFORM) {} } // namespace node