xref: /aosp_15_r20/system/core/libcutils/properties.cpp (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
1*00c7fec1SAndroid Build Coastguard Worker /*
2*00c7fec1SAndroid Build Coastguard Worker  * Copyright (C) 2006 The Android Open Source Project
3*00c7fec1SAndroid Build Coastguard Worker  *
4*00c7fec1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*00c7fec1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*00c7fec1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*00c7fec1SAndroid Build Coastguard Worker  *
8*00c7fec1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*00c7fec1SAndroid Build Coastguard Worker  *
10*00c7fec1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*00c7fec1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*00c7fec1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*00c7fec1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*00c7fec1SAndroid Build Coastguard Worker  * limitations under the License.
15*00c7fec1SAndroid Build Coastguard Worker  */
16*00c7fec1SAndroid Build Coastguard Worker 
17*00c7fec1SAndroid Build Coastguard Worker #include <cutils/properties.h>
18*00c7fec1SAndroid Build Coastguard Worker 
19*00c7fec1SAndroid Build Coastguard Worker #include <errno.h>
20*00c7fec1SAndroid Build Coastguard Worker #include <inttypes.h>
21*00c7fec1SAndroid Build Coastguard Worker #include <stdlib.h>
22*00c7fec1SAndroid Build Coastguard Worker #include <string.h>
23*00c7fec1SAndroid Build Coastguard Worker #include <unistd.h>
24*00c7fec1SAndroid Build Coastguard Worker 
25*00c7fec1SAndroid Build Coastguard Worker #include <android-base/properties.h>
26*00c7fec1SAndroid Build Coastguard Worker 
property_get_bool(const char * key,int8_t default_value)27*00c7fec1SAndroid Build Coastguard Worker int8_t property_get_bool(const char* key, int8_t default_value) {
28*00c7fec1SAndroid Build Coastguard Worker     if (!key) return default_value;
29*00c7fec1SAndroid Build Coastguard Worker 
30*00c7fec1SAndroid Build Coastguard Worker     int8_t result = default_value;
31*00c7fec1SAndroid Build Coastguard Worker     char buf[PROPERTY_VALUE_MAX] = {};
32*00c7fec1SAndroid Build Coastguard Worker 
33*00c7fec1SAndroid Build Coastguard Worker     int len = property_get(key, buf, "");
34*00c7fec1SAndroid Build Coastguard Worker     if (len == 1) {
35*00c7fec1SAndroid Build Coastguard Worker         char ch = buf[0];
36*00c7fec1SAndroid Build Coastguard Worker         if (ch == '0' || ch == 'n') {
37*00c7fec1SAndroid Build Coastguard Worker             result = false;
38*00c7fec1SAndroid Build Coastguard Worker         } else if (ch == '1' || ch == 'y') {
39*00c7fec1SAndroid Build Coastguard Worker             result = true;
40*00c7fec1SAndroid Build Coastguard Worker         }
41*00c7fec1SAndroid Build Coastguard Worker     } else if (len > 1) {
42*00c7fec1SAndroid Build Coastguard Worker         if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
43*00c7fec1SAndroid Build Coastguard Worker             result = false;
44*00c7fec1SAndroid Build Coastguard Worker         } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
45*00c7fec1SAndroid Build Coastguard Worker             result = true;
46*00c7fec1SAndroid Build Coastguard Worker         }
47*00c7fec1SAndroid Build Coastguard Worker     }
48*00c7fec1SAndroid Build Coastguard Worker 
49*00c7fec1SAndroid Build Coastguard Worker     return result;
50*00c7fec1SAndroid Build Coastguard Worker }
51*00c7fec1SAndroid Build Coastguard Worker 
52*00c7fec1SAndroid Build Coastguard Worker template <typename T>
property_get_int(const char * key,T default_value)53*00c7fec1SAndroid Build Coastguard Worker static T property_get_int(const char* key, T default_value) {
54*00c7fec1SAndroid Build Coastguard Worker     if (!key) return default_value;
55*00c7fec1SAndroid Build Coastguard Worker 
56*00c7fec1SAndroid Build Coastguard Worker     char value[PROPERTY_VALUE_MAX] = {};
57*00c7fec1SAndroid Build Coastguard Worker     if (property_get(key, value, "") < 1) return default_value;
58*00c7fec1SAndroid Build Coastguard Worker 
59*00c7fec1SAndroid Build Coastguard Worker     // libcutils unwisely allows octal, which libbase doesn't.
60*00c7fec1SAndroid Build Coastguard Worker     T result = default_value;
61*00c7fec1SAndroid Build Coastguard Worker     int saved_errno = errno;
62*00c7fec1SAndroid Build Coastguard Worker     errno = 0;
63*00c7fec1SAndroid Build Coastguard Worker     char* end = nullptr;
64*00c7fec1SAndroid Build Coastguard Worker     intmax_t v = strtoimax(value, &end, 0);
65*00c7fec1SAndroid Build Coastguard Worker     if (errno != ERANGE && end != value && v >= std::numeric_limits<T>::min() &&
66*00c7fec1SAndroid Build Coastguard Worker         v <= std::numeric_limits<T>::max()) {
67*00c7fec1SAndroid Build Coastguard Worker         result = v;
68*00c7fec1SAndroid Build Coastguard Worker     }
69*00c7fec1SAndroid Build Coastguard Worker     errno = saved_errno;
70*00c7fec1SAndroid Build Coastguard Worker     return result;
71*00c7fec1SAndroid Build Coastguard Worker }
72*00c7fec1SAndroid Build Coastguard Worker 
property_get_int64(const char * key,int64_t default_value)73*00c7fec1SAndroid Build Coastguard Worker int64_t property_get_int64(const char* key, int64_t default_value) {
74*00c7fec1SAndroid Build Coastguard Worker     return property_get_int<int64_t>(key, default_value);
75*00c7fec1SAndroid Build Coastguard Worker }
76*00c7fec1SAndroid Build Coastguard Worker 
property_get_int32(const char * key,int32_t default_value)77*00c7fec1SAndroid Build Coastguard Worker int32_t property_get_int32(const char* key, int32_t default_value) {
78*00c7fec1SAndroid Build Coastguard Worker     return property_get_int<int32_t>(key, default_value);
79*00c7fec1SAndroid Build Coastguard Worker }
80*00c7fec1SAndroid Build Coastguard Worker 
property_set(const char * key,const char * value)81*00c7fec1SAndroid Build Coastguard Worker int property_set(const char* key, const char* value) {
82*00c7fec1SAndroid Build Coastguard Worker     return __system_property_set(key, value);
83*00c7fec1SAndroid Build Coastguard Worker }
84*00c7fec1SAndroid Build Coastguard Worker 
property_get(const char * key,char * value,const char * default_value)85*00c7fec1SAndroid Build Coastguard Worker int property_get(const char* key, char* value, const char* default_value) {
86*00c7fec1SAndroid Build Coastguard Worker     int len = __system_property_get(key, value);
87*00c7fec1SAndroid Build Coastguard Worker     if (len < 1 && default_value) {
88*00c7fec1SAndroid Build Coastguard Worker         snprintf(value, PROPERTY_VALUE_MAX, "%s", default_value);
89*00c7fec1SAndroid Build Coastguard Worker         return strlen(value);
90*00c7fec1SAndroid Build Coastguard Worker     }
91*00c7fec1SAndroid Build Coastguard Worker     return len;
92*00c7fec1SAndroid Build Coastguard Worker }
93*00c7fec1SAndroid Build Coastguard Worker 
94*00c7fec1SAndroid Build Coastguard Worker #if __has_include(<sys/system_properties.h>)
95*00c7fec1SAndroid Build Coastguard Worker 
96*00c7fec1SAndroid Build Coastguard Worker #include <sys/system_properties.h>
97*00c7fec1SAndroid Build Coastguard Worker 
98*00c7fec1SAndroid Build Coastguard Worker struct callback_data {
99*00c7fec1SAndroid Build Coastguard Worker     void (*callback)(const char* name, const char* value, void* cookie);
100*00c7fec1SAndroid Build Coastguard Worker     void* cookie;
101*00c7fec1SAndroid Build Coastguard Worker };
102*00c7fec1SAndroid Build Coastguard Worker 
trampoline(void * raw_data,const char * name,const char * value,unsigned)103*00c7fec1SAndroid Build Coastguard Worker static void trampoline(void* raw_data, const char* name, const char* value, unsigned /*serial*/) {
104*00c7fec1SAndroid Build Coastguard Worker     callback_data* data = reinterpret_cast<callback_data*>(raw_data);
105*00c7fec1SAndroid Build Coastguard Worker     data->callback(name, value, data->cookie);
106*00c7fec1SAndroid Build Coastguard Worker }
107*00c7fec1SAndroid Build Coastguard Worker 
property_list_callback(const prop_info * pi,void * data)108*00c7fec1SAndroid Build Coastguard Worker static void property_list_callback(const prop_info* pi, void* data) {
109*00c7fec1SAndroid Build Coastguard Worker     __system_property_read_callback(pi, trampoline, data);
110*00c7fec1SAndroid Build Coastguard Worker }
111*00c7fec1SAndroid Build Coastguard Worker 
property_list(void (* fn)(const char * name,const char * value,void * cookie),void * cookie)112*00c7fec1SAndroid Build Coastguard Worker int property_list(void (*fn)(const char* name, const char* value, void* cookie), void* cookie) {
113*00c7fec1SAndroid Build Coastguard Worker     callback_data data = {fn, cookie};
114*00c7fec1SAndroid Build Coastguard Worker     return __system_property_foreach(property_list_callback, &data);
115*00c7fec1SAndroid Build Coastguard Worker }
116*00c7fec1SAndroid Build Coastguard Worker 
117*00c7fec1SAndroid Build Coastguard Worker #endif
118