/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sysdeps/env.h" #ifdef _WIN32 #include #include #endif // _WIN32 #include namespace adb { namespace sysdeps { std::optional GetEnvironmentVariable(std::string_view var) { if (var.empty()) { return std::nullopt; } #ifdef _WIN32 constexpr size_t kMaxEnvVarSize = 32767; wchar_t wbuf[kMaxEnvVarSize]; std::wstring wvar; if (!android::base::UTF8ToWide(var.data(), &wvar)) { return std::nullopt; } auto sz = ::GetEnvironmentVariableW(wvar.data(), wbuf, sizeof(wbuf)); if (sz == 0) { return std::nullopt; } std::string val; if (!android::base::WideToUTF8(wbuf, &val)) { return std::nullopt; } return std::make_optional(val); #else // !_WIN32 const char* val = getenv(var.data()); if (val == nullptr) { return std::nullopt; } return std::make_optional(std::string(val)); #endif } #ifdef _WIN32 constexpr char kHostNameEnvVar[] = "COMPUTERNAME"; constexpr char kUserNameEnvVar[] = "USERNAME"; #else constexpr char kHostNameEnvVar[] = "HOSTNAME"; constexpr char kUserNameEnvVar[] = "LOGNAME"; #endif std::string GetHostNameUTF8() { const auto hostName = GetEnvironmentVariable(kHostNameEnvVar); if (hostName && !hostName->empty()) { return *hostName; } #ifdef _WIN32 wchar_t wbuf[MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = sizeof(wbuf); if (!GetComputerNameW(wbuf, &size) || size == 0) { return ""; } std::string name; if (!android::base::WideToUTF8(wbuf, &name)) { return ""; } return name; #else // !_WIN32 char buf[256]; return (gethostname(buf, sizeof(buf)) == -1) ? "" : buf; #endif // _WIN32 } std::string GetLoginNameUTF8() { const auto userName = GetEnvironmentVariable(kUserNameEnvVar); if (userName && !userName->empty()) { return *userName; } #ifdef _WIN32 wchar_t wbuf[UNLEN + 1]; DWORD size = sizeof(wbuf); if (!GetUserNameW(wbuf, &size) || size == 0) { return ""; } std::string login; if (!android::base::WideToUTF8(wbuf, &login)) { return ""; } return login; #else // !_WIN32 const char* login = getlogin(); return login ? login : ""; #endif // _WIN32 } } // namespace sysdeps } // namespace adb