123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #include "il2cpp-config.h"
- #if !IL2CPP_USE_GENERIC_ENVIRONMENT && IL2CPP_TARGET_POSIX && !IL2CPP_USE_PLATFORM_SPECIFIC_ENVIRON
- #include "il2cpp-class-internals.h"
- #include "os/Environment.h"
- #include "il2cpp-api.h"
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/utsname.h>
- #if defined(__APPLE__) && !defined(__arm__)
- // Apple defines this in crt_externs.h but doesn't provide that header for
- // arm-apple-darwin9. We'll manually define the symbol on Apple as it does
- // in fact exist on all implementations (so far)
- extern "C" char*** _NSGetEnviron(void);
- #define environ (*_NSGetEnviron())
- #else
- extern char **environ; // GNU C library
- #endif
- namespace il2cpp
- {
- namespace os
- {
- int32_t Environment::GetProcessorCount()
- {
- int count = 1;
- #ifdef _SC_NPROCESSORS_ONLN
- count = (int)sysconf(_SC_NPROCESSORS_ONLN);
- if (count > 0)
- return count;
- #endif
- #ifdef USE_SYSCTL
- {
- int mib[2];
- size_t len = sizeof(int);
- mib[0] = CTL_HW;
- mib[1] = HW_NCPU;
- if (sysctl(mib, 2, &count, &len, NULL, 0) == 0)
- return count;
- }
- #endif
- return count;
- }
- #if !RUNTIME_TINY
- std::string Environment::GetMachineName()
- {
- const int n = 512;
- char buf[n];
- if (gethostname(buf, sizeof(buf)) == 0)
- {
- buf[n - 1] = 0;
- int i;
- // try truncating the string at the first dot
- for (i = 0; i < n; i++)
- {
- if (buf[i] == '.')
- {
- buf[i] = 0;
- break;
- }
- }
- return buf;
- }
- return NULL;
- }
- std::string Environment::GetOsVersionString()
- {
- struct utsname name;
- if (uname(&name) >= 0)
- return name.release;
- return "0.0.0.0";
- }
- std::string Environment::GetOsUserName()
- {
- const std::string username(GetEnvironmentVariable("USER"));
- return username.empty() ? "Unknown" : username;
- }
- std::string Environment::GetEnvironmentVariable(const std::string& name)
- {
- const char* variable = getenv(name.c_str());
- return variable ? std::string(variable) : std::string();
- }
- void Environment::SetEnvironmentVariable(const std::string& name, const std::string& value)
- {
- if (value.empty())
- {
- unsetenv(name.c_str());
- }
- else
- {
- setenv(name.c_str(), value.c_str(), 1); // 1 means overwrite
- }
- }
- std::vector<std::string> Environment::GetEnvironmentVariableNames()
- {
- std::vector<std::string> result;
- for (char **envvar = environ; *envvar != NULL; ++envvar)
- {
- const char* equalAddress = strchr(*envvar, '=');
- if (equalAddress != NULL)
- result.push_back(std::string(*envvar, size_t(equalAddress - *envvar)));
- }
- return result;
- }
- std::string Environment::GetHomeDirectory()
- {
- static std::string homeDirectory;
- if (!homeDirectory.empty())
- return homeDirectory;
- homeDirectory = GetEnvironmentVariable("HOME");
- return homeDirectory.empty() ? "/" : homeDirectory;
- }
- std::vector<std::string> Environment::GetLogicalDrives()
- {
- std::vector<std::string> result;
- // This implementation is not correct according to the definition of this icall, but this is
- // the only "logical drive" that the Mono version in Unity returns for OSX.
- result.push_back("/");
- // TODO: Implement additional logic for Linux
- return result;
- }
- void Environment::Exit(int result)
- {
- exit(result);
- }
- #endif // !RUNTIME_TINY
- NORETURN void Environment::Abort()
- {
- abort();
- }
- #if !RUNTIME_TINY
- utils::Expected<std::string> Environment::GetWindowsFolderPath(int folder)
- {
- // This should only be called on Windows.
- return std::string();
- }
- utils::Expected<bool> Environment::Is64BitOs()
- {
- struct utsname name;
- if (uname(&name) >= 0)
- {
- return strcmp(name.machine, "x86_64") == 0 || strncmp(name.machine, "aarch64", 7) == 0 || strncmp(name.machine, "ppc64", 5) == 0;
- }
- return false;
- }
- #endif // !RUNTIME_TINY
- }
- }
- #endif
|