blob: 641df915dd10c32d352652258d691aa7a36e66e3 [file] [log] [blame]
Roman Stratiienkobde95662022-12-10 20:27:58 +02001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
Roman Stratiienkod518a052021-02-25 19:15:14 +020018
19#ifdef ANDROID
20
21#include <cutils/properties.h>
22
23#else
24
25#include <cstdio>
26#include <cstdlib>
27#include <cstring>
28
29// NOLINTNEXTLINE(readability-identifier-naming)
30constexpr int PROPERTY_VALUE_MAX = 92;
31
Roman Stratiienko5532b922021-03-04 15:22:09 +020032// NOLINTNEXTLINE(readability-identifier-naming)
Roman Stratiienkod518a052021-02-25 19:15:14 +020033auto inline property_get(const char *name, char *value,
34 const char *default_value) -> int {
Roman Stratiienko24a7fc42021-12-23 16:25:20 +020035 // NOLINTNEXTLINE (concurrency-mt-unsafe)
Roman Stratiienkod518a052021-02-25 19:15:14 +020036 char *prop = std::getenv(name);
Roman Stratiienko0a90b272021-08-04 22:43:06 +030037 snprintf(value, PROPERTY_VALUE_MAX, "%s",
38 (prop == nullptr) ? default_value : prop);
Roman Stratiienkod26619b2021-08-04 19:55:37 +030039 return static_cast<int>(strlen(value));
Roman Stratiienkod518a052021-02-25 19:15:14 +020040}
41
Paz Zcharya9c41b682024-11-05 19:07:31 +000042/**
43 * Bluntly copied from system/core/libcutils/properties.cpp,
44 * which is part of the Android Project and licensed under Apache 2.
45 * Source:
46 * https://cs.android.com/android/platform/superproject/main/+/main:system/core/libcutils/properties.cpp;l=27
47 */
48auto inline property_get_bool(const char *key, int8_t default_value) -> int8_t {
49 if (!key)
50 return default_value;
51
52 int8_t result = default_value;
53 char buf[PROPERTY_VALUE_MAX] = {};
54
55 int len = property_get(key, buf, "");
56 if (len == 1) {
57 char ch = buf[0];
58 if (ch == '0' || ch == 'n') {
59 result = false;
60 } else if (ch == '1' || ch == 'y') {
61 result = true;
62 }
63 } else if (len > 1) {
64 if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
65 result = false;
66 } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") ||
67 !strcmp(buf, "on")) {
68 result = true;
69 }
70 }
71
72 return result;
73}
74
Roman Stratiienkod518a052021-02-25 19:15:14 +020075#endif