Hash :
d820ec7b
Author :
Date :
2021-02-05T10:39:25
Use __system_property* to read Android props ... instead of popen to avoid needing shell_exec permission. Bug: b/179041465 Test: roll_aosp.sh && m && launch Cuttlefish w/ SwANGLE Test: aosp/1574848 presubmit Change-Id: Ie64d2730fd2ea00a1b5089459297ef7ffe98bc59 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2676271 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Ian Elliott <ianelliott@google.com> Commit-Queue: Jason Macnak <natsu@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// system_utils.cpp: Implementation of common functions
#include "common/system_utils.h"
#include <stdlib.h>
#if defined(ANGLE_PLATFORM_ANDROID)
# include <sys/system_properties.h>
#endif
namespace angle
{
std::string GetExecutableName()
{
#if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 21
// Support for "getprogname" function in bionic was introduced in L (API level 21)
const char *executableName = getprogname();
return (executableName) ? std::string(executableName) : "ANGLE";
#else
std::string executableName = GetExecutablePath();
size_t lastPathSepLoc = executableName.find_last_of(GetPathSeparator());
return (lastPathSepLoc > 0 ? executableName.substr(lastPathSepLoc + 1, executableName.length())
: "ANGLE");
#endif // ANGLE_PLATFORM_ANDROID
}
// On Android return value cached in the process environment, if none, call
// GetEnvironmentVarOrUnCachedAndroidProperty if not in environment.
std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName)
{
#if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 21
// Can't use GetEnvironmentVar here because that won't allow us to distinguish between the
// environment being set to an empty string vs. not set at all.
const char *variableValue = getenv(variableName);
if (variableValue != nullptr)
{
std::string value(variableValue);
return value;
}
#endif
return GetEnvironmentVarOrUnCachedAndroidProperty(variableName, propertyName);
}
// Call out to 'getprop' on a shell to get an Android property. If the value was set, set an
// environment variable with that value. Return the value of the environment variable.
std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName,
const char *propertyName)
{
#if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 26
std::string propertyValue;
const prop_info *propertyInfo = __system_property_find(propertyName);
if (propertyInfo != nullptr)
{
__system_property_read_callback(
propertyInfo,
[](void *cookie, const char *, const char *value, unsigned) {
auto propertyValue = reinterpret_cast<std::string *>(cookie);
*propertyValue = value;
},
&propertyValue);
}
// Set the environment variable with the value.
SetEnvironmentVar(variableName, propertyValue.c_str());
return propertyValue;
#endif // ANGLE_PLATFORM_ANDROID
// Return the environment variable's value.
return GetEnvironmentVar(variableName);
}
bool PrependPathToEnvironmentVar(const char *variableName, const char *path)
{
std::string oldValue = GetEnvironmentVar(variableName);
const char *newValue = nullptr;
std::string buf;
if (oldValue.empty())
{
newValue = path;
}
else
{
buf = path;
buf += GetPathSeparatorForEnvironmentVar();
buf += oldValue;
newValue = buf.c_str();
}
return SetEnvironmentVar(variableName, newValue);
}
} // namespace angle