diff options
Diffstat (limited to 'adb/sysdeps/env.cpp')
-rw-r--r-- | adb/sysdeps/env.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/adb/sysdeps/env.cpp b/adb/sysdeps/env.cpp new file mode 100644 index 000000000..40587280c --- /dev/null +++ b/adb/sysdeps/env.cpp @@ -0,0 +1,122 @@ +/* + * 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 <lmcons.h> +#include <windows.h> +#endif // _WIN32 + +#include <android-base/utf8.h> + +namespace adb { +namespace sysdeps { + +std::optional<std::string> 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 |