1e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry/*
2e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * Copyright (C) 2017 The Android Open Source Project
3e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * All rights reserved.
4e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *
5e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * Redistribution and use in source and binary forms, with or without
6e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * modification, are permitted provided that the following conditions
7e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * are met:
8e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *  * Redistributions of source code must retain the above copyright
9e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *    notice, this list of conditions and the following disclaimer.
10e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *  * Redistributions in binary form must reproduce the above copyright
11e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *    notice, this list of conditions and the following disclaimer in
12e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *    the documentation and/or other materials provided with the
13e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *    distribution.
14e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry *
15e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry * SUCH DAMAGE.
27e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry */
28e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
29e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
30e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry#include <sys/_system_properties.h>
31e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
32e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry#include <system_properties/prop_area.h>
33e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry#include <system_properties/system_properties.h>
34e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
35e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry#include "private/bionic_defs.h"
36e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
37e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherrystatic SystemProperties system_properties;
38ee8e3dd67c910907115c7cef87be3d898d71a05dTom Cherrystatic_assert(__is_trivially_constructible(SystemProperties),
39ee8e3dd67c910907115c7cef87be3d898d71a05dTom Cherry              "System Properties must be trivially constructable");
40e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
41e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry// This is public because it was exposed in the NDK. As of 2017-01, ~60 apps reference this symbol.
42e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry// It is set to nullptr and never modified.
43e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_VARIABLE_FOR_NATIVE_BRIDGE
44e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryprop_area* __system_property_area__ = nullptr;
45e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
46e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
47e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_properties_init() {
48e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Init(PROP_FILENAME) ? 0 : -1;
49e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
50e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
51e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry// This was previously for testing, but now that SystemProperties is its own testable class,
52e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry// there is never a reason to call this function.
53e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
54e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_set_filename(const char*) {
55e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return -1;
56e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
57e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
58e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
59e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_area_init() {
60e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  bool fsetxattr_failed = false;
61e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.AreaInit(PROP_FILENAME, &fsetxattr_failed) && !fsetxattr_failed ? 0 : -1;
62e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
63e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
64e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
65e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryuint32_t __system_property_area_serial() {
66e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.AreaSerial();
67e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
68e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
69e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
70e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryconst prop_info* __system_property_find(const char* name) {
71e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Find(name);
72e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
73e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
74e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
75e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_read(const prop_info* pi, char* name, char* value) {
76e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Read(pi, name, value);
77e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
78e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
79e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
80e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryvoid __system_property_read_callback(const prop_info* pi,
81e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry                                     void (*callback)(void* cookie, const char* name,
82e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry                                                      const char* value, uint32_t serial),
83e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry                                     void* cookie) {
84e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.ReadCallback(pi, callback, cookie);
85e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
86e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
87e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
88e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_get(const char* name, char* value) {
89e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Get(name, value);
90e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
91e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
92e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
93e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_update(prop_info* pi, const char* value, unsigned int len) {
94e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Update(pi, value, len);
95e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
96e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
97e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
98e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_add(const char* name, unsigned int namelen, const char* value,
99e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry                          unsigned int valuelen) {
100e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Add(name, namelen, value, valuelen);
101e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
102e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
103e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
104e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryuint32_t __system_property_serial(const prop_info* pi) {
105e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Serial(pi);
106e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
107e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
108e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
109e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryuint32_t __system_property_wait_any(uint32_t old_serial) {
110e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.WaitAny(old_serial);
111e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
112e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
113e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
114e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherrybool __system_property_wait(const prop_info* pi, uint32_t old_serial, uint32_t* new_serial_ptr,
115e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry                            const timespec* relative_timeout) {
116e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Wait(pi, old_serial, new_serial_ptr, relative_timeout);
117e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
118e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
119e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
120e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryconst prop_info* __system_property_find_nth(unsigned n) {
121e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.FindNth(n);
122e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
123e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry
124e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry__BIONIC_WEAK_FOR_NATIVE_BRIDGE
125e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherryint __system_property_foreach(void (*propfn)(const prop_info* pi, void* cookie), void* cookie) {
126e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry  return system_properties.Foreach(propfn, cookie);
127e275d6d72db1868056a204e8483a7346a28cb8d6Tom Cherry}
128