summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author David Duarte <licorne@google.com> 2023-02-22 23:34:13 +0000
committer David Duarte <licorne@google.com> 2024-04-25 18:55:04 +0000
commit0a17f9201d7428828972e30e6bcced5ccdd3bd0c (patch)
tree9b577347c040d8ee246ea1b6b54fc217f9d28d8e
parentf11fe8898e9beef13f2827bbd169ccc16ce48505 (diff)
Add a android-base shim for floss
The code generated by the sysprop tool depends on some APIs of android-base to read properties to make it work on floss we add the needed API and wire them to the GD OS APIs Bug: 337064224 Test: None Flag: EXEMPT, floss Change-Id: Ifa8491b475cd2461904eb42a40a96713c43bf459
-rw-r--r--floss/android-base/BUILD.gn25
-rw-r--r--floss/android-base/include/android-base/parseint.h145
-rw-r--r--floss/android-base/include/android-base/properties.h33
-rw-r--r--floss/android-base/include/log/log.h1
-rw-r--r--floss/android-base/properties.cc35
5 files changed, 239 insertions, 0 deletions
diff --git a/floss/android-base/BUILD.gn b/floss/android-base/BUILD.gn
new file mode 100644
index 0000000000..ad293bd6b3
--- /dev/null
+++ b/floss/android-base/BUILD.gn
@@ -0,0 +1,25 @@
+#
+# Copyright 2023 Google, Inc.
+#
+# 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.
+#
+
+config("android-base_config") {
+ include_dirs = [ "include" ]
+}
+
+static_library("android-base") {
+ sources = [ "properties.cc" ]
+ include_dirs = [ "//bt/system" ]
+ public_configs = [ ":android-base_config" ]
+}
diff --git a/floss/android-base/include/android-base/parseint.h b/floss/android-base/include/android-base/parseint.h
new file mode 100644
index 0000000000..c4144fde84
--- /dev/null
+++ b/floss/android-base/include/android-base/parseint.h
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <limits>
+#include <string>
+#include <type_traits>
+
+namespace android {
+namespace base {
+
+// Parses the unsigned decimal or hexadecimal integer in the string 's' and sets
+// 'out' to that value if it is specified. Optionally allows the caller to
+// define a 'max' beyond which otherwise valid values will be rejected. Returns
+// boolean success; 'out' is untouched if parsing fails.
+template <typename T>
+bool ParseUint(const char* s, T* out, T max = std::numeric_limits<T>::max(),
+ bool allow_suffixes = false) {
+ static_assert(std::is_unsigned<T>::value,
+ "ParseUint can only be used with unsigned types");
+ while (isspace(*s)) {
+ s++;
+ }
+
+ if (s[0] == '-') {
+ errno = EINVAL;
+ return false;
+ }
+
+ // This is never out of bounds. If string is zero-sized, s[0] == '\0'
+ // so the second condition is not checked. If string is "0",
+ // s[1] will compare against the '\0'.
+ int base = (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10;
+ errno = 0;
+ char* end;
+ unsigned long long int result = strtoull(s, &end, base);
+ if (errno != 0) return false;
+ if (end == s) {
+ errno = EINVAL;
+ return false;
+ }
+ if (*end != '\0') {
+ const char* suffixes = "bkmgtpe";
+ const char* suffix;
+ if ((!allow_suffixes ||
+ (suffix = strchr(suffixes, tolower(*end))) == nullptr) ||
+ __builtin_mul_overflow(result, 1ULL << (10 * (suffix - suffixes)),
+ &result)) {
+ errno = EINVAL;
+ return false;
+ }
+ }
+ if (max < result) {
+ errno = ERANGE;
+ return false;
+ }
+ if (out != nullptr) {
+ *out = static_cast<T>(result);
+ }
+ return true;
+}
+
+// TODO: string_view
+template <typename T>
+bool ParseUint(const std::string& s, T* out,
+ T max = std::numeric_limits<T>::max(),
+ bool allow_suffixes = false) {
+ return ParseUint(s.c_str(), out, max, allow_suffixes);
+}
+
+template <typename T>
+bool ParseByteCount(const char* s, T* out,
+ T max = std::numeric_limits<T>::max()) {
+ return ParseUint(s, out, max, true);
+}
+
+// TODO: string_view
+template <typename T>
+bool ParseByteCount(const std::string& s, T* out,
+ T max = std::numeric_limits<T>::max()) {
+ return ParseByteCount(s.c_str(), out, max);
+}
+
+// Parses the signed decimal or hexadecimal integer in the string 's' and sets
+// 'out' to that value if it is specified. Optionally allows the caller to
+// define a 'min' and 'max' beyond which otherwise valid values will be
+// rejected. Returns boolean success; 'out' is untouched if parsing fails.
+template <typename T>
+bool ParseInt(const char* s, T* out, T min = std::numeric_limits<T>::min(),
+ T max = std::numeric_limits<T>::max()) {
+ static_assert(std::is_signed<T>::value,
+ "ParseInt can only be used with signed types");
+ while (isspace(*s)) {
+ s++;
+ }
+
+ int base = (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10;
+ errno = 0;
+ char* end;
+ long long int result = strtoll(s, &end, base);
+ if (errno != 0) {
+ return false;
+ }
+ if (s == end || *end != '\0') {
+ errno = EINVAL;
+ return false;
+ }
+ if (result < min || max < result) {
+ errno = ERANGE;
+ return false;
+ }
+ if (out != nullptr) {
+ *out = static_cast<T>(result);
+ }
+ return true;
+}
+
+// TODO: string_view
+template <typename T>
+bool ParseInt(const std::string& s, T* out,
+ T min = std::numeric_limits<T>::min(),
+ T max = std::numeric_limits<T>::max()) {
+ return ParseInt(s.c_str(), out, min, max);
+}
+
+} // namespace base
+} // namespace android
diff --git a/floss/android-base/include/android-base/properties.h b/floss/android-base/include/android-base/properties.h
new file mode 100644
index 0000000000..23a94fc537
--- /dev/null
+++ b/floss/android-base/include/android-base/properties.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+#pragma once
+
+#include <string>
+
+namespace android {
+namespace base {
+
+// Returns the current value of the system property `key`,
+// or `default_value` if the property is empty or doesn't exist.
+std::string GetProperty(const std::string& key,
+ const std::string& default_value);
+
+// Sets the system property `key` to `value`.
+bool SetProperty(const std::string& key, const std::string& value);
+
+} // namespace base
+} // namespace android
diff --git a/floss/android-base/include/log/log.h b/floss/android-base/include/log/log.h
new file mode 100644
index 0000000000..3eb4a63b7d
--- /dev/null
+++ b/floss/android-base/include/log/log.h
@@ -0,0 +1 @@
+#define ALOGV(...)
diff --git a/floss/android-base/properties.cc b/floss/android-base/properties.cc
new file mode 100644
index 0000000000..dea892b6c4
--- /dev/null
+++ b/floss/android-base/properties.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2023 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 "android-base/properties.h"
+
+#include "gd/os/system_properties.h"
+
+namespace android {
+namespace base {
+
+std::string GetProperty(const std::string& key,
+ const std::string& default_value) {
+ return bluetooth::os::GetSystemProperty(key).value_or(default_value);
+}
+
+// Sets the system property `key` to `value`.
+bool SetProperty(const std::string& key, const std::string& value) {
+ return bluetooth::os::SetSystemProperty(key, value);
+}
+
+} // namespace base
+} // namespace android