blob: 05612b380bdf39dc1344681a93a5fd0ddf0c92f9 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
Elliott Hughes28c2f7d2024-07-29 18:39:08 +000029#pragma once
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080030
Elliott Hughes203e13d2016-07-22 14:56:18 -070031#include <sys/cdefs.h>
Elliott Hughesa0d374d2017-02-10 18:13:46 -080032#include <stdint.h>
Elliott Hughes203e13d2016-07-22 14:56:18 -070033
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080034#ifndef _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
35#error you should #include <sys/system_properties.h> instead
Elliott Hughesf8562c52017-01-26 16:48:57 -080036#endif
37
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080038#include <sys/system_properties.h>
39
Colin Cross5cf32de2013-01-23 23:07:06 -080040__BEGIN_DECLS
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080041
Elliott Hughes28c2f7d2024-07-29 18:39:08 +000042/**
43 * Reads the global serial number of the system properties _area_.
44 *
45 * Called to predict if a series of cached __system_property_find()
46 * objects will have seen __system_property_serial() values change.
47 * Also aids the converse, as changes in the global serial can
48 * also be used to predict if a failed __system_property_find()
49 * could in turn now find a new object; thus preventing the
50 * cycles of effort to poll __system_property_find().
51 *
52 * Typically called at beginning of a cache cycle to signal if _any_ possible
53 * changes have occurred since last. If there is, one may check each individual
54 * __system_property_serial() to confirm dirty, or __system_property_find()
55 * to check if the property now exists. If a call to __system_property_add()
56 * or __system_property_update() has completed between two calls to
57 * __system_property_area_serial() then the second call will return a larger
58 * value than the first call. Beware of race conditions as changes to the
59 * properties are not atomic, the main value of this call is to determine
60 * whether the expensive __system_property_find() is worth retrying to see if
61 * a property now exists.
62 *
63 * Returns the serial number on success, -1 on error.
64 */
65uint32_t __system_property_area_serial(void);
66
67/**
68 * Reads the serial number of a specific system property previously returned by
69 * __system_property_find(). This is a cheap way to check whether a system
70 * property has changed or not.
71 *
72 * Returns the serial number on success, -1 on error.
73 */
74uint32_t __system_property_serial(const prop_info* _Nonnull __pi);
75
76//
77// libc implementation detail.
78//
79
80/**
81 * Initializes the system properties area in read-only mode.
82 *
83 * This is called automatically during libc initialization,
84 * so user code should never need to call this.
85 *
86 * Returns 0 on success, -1 otherwise.
87 */
88int __system_properties_init(void);
89
90//
91// init implementation details.
92//
93
Elliott Hughesf8562c52017-01-26 16:48:57 -080094#define PROP_SERVICE_NAME "property_service"
Paul Lawrence71ade012023-07-18 08:49:44 -070095#define PROP_SERVICE_FOR_SYSTEM_NAME "property_service_for_system"
Nate Myrenae7f33d2023-08-28 16:46:39 -070096#define PROP_DIRNAME "/dev/__properties__"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080097
Elliott Hughes28c2f7d2024-07-29 18:39:08 +000098// Messages sent to init.
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080099#define PROP_MSG_SETPROP 1
Dimitry Ivanov16b2a4d2017-01-24 20:43:29 +0000100#define PROP_MSG_SETPROP2 0x00020001
101
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000102// Status codes returned by init (but not passed from libc to the caller).
Dimitry Ivanov16b2a4d2017-01-24 20:43:29 +0000103#define PROP_SUCCESS 0
104#define PROP_ERROR_READ_CMD 0x0004
105#define PROP_ERROR_READ_DATA 0x0008
106#define PROP_ERROR_READ_ONLY_PROPERTY 0x000B
107#define PROP_ERROR_INVALID_NAME 0x0010
108#define PROP_ERROR_INVALID_VALUE 0x0014
109#define PROP_ERROR_PERMISSION_DENIED 0x0018
110#define PROP_ERROR_INVALID_CMD 0x001B
111#define PROP_ERROR_HANDLE_CONTROL_MESSAGE 0x0020
112#define PROP_ERROR_SET_FAILED 0x0024
Andres Morales9d9ebc52015-01-13 18:00:56 -0800113
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000114/**
115 * Initializes the area to be used to store properties.
116 *
117 * Can only be done by the process that has write access to the property area,
118 * typically init.
119 *
120 * See __system_properties_init() for the equivalent for all other processes.
121 */
Elliott Hughesff26a162017-08-17 22:34:21 +0000122int __system_property_area_init(void);
Colin Cross5cf32de2013-01-23 23:07:06 -0800123
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000124/**
125 * Adds a new system property.
126 * Can only be done by the process that has write access to the property area --
127 * typically init -- which must handle sequencing to ensure that only one property is
128 * updated at a time.
129 *
130 * Returns 0 on success, -1 if the property area is full.
131 */
zijunzhaoa505b2d2023-05-17 00:20:12 +0000132int __system_property_add(const char* _Nonnull __name, unsigned int __name_length, const char* _Nonnull __value, unsigned int __value_length);
Colin Cross5cf32de2013-01-23 23:07:06 -0800133
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000134/**
135 * Updates the value of a system property returned by __system_property_find().
136 * Can only be done by the process that has write access to the property area --
137 * typically init -- which must handle sequencing to ensure that only one property is
138 * updated at a time.
139 *
140 * Returns 0 on success, -1 if the parameters are incorrect.
141 */
zijunzhaoa505b2d2023-05-17 00:20:12 +0000142int __system_property_update(prop_info* _Nonnull __pi, const char* _Nonnull __value, unsigned int __value_length);
Colin Cross5cf32de2013-01-23 23:07:06 -0800143
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000144/**
145 * Reloads the system properties from disk.
146 * Not intended for use by any apps except the Zygote.
147 * Should only be called from the main thread.
148 *
149 * Pointers received from functions such as __system_property_find()
150 * may be invalidated by calls to this function.
Narayan Kamathc9ae21a2014-02-19 17:59:05 +0000151 *
152 * Returns 0 on success, -1 otherwise.
Nate Myrenae7f33d2023-08-28 16:46:39 -0700153 *
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000154 * Available since API level 35.
Nate Myrenae7f33d2023-08-28 16:46:39 -0700155 */
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000156int __system_properties_zygote_reload(void) __INTRODUCED_IN(35);
Nate Myrenae7f33d2023-08-28 16:46:39 -0700157
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000158//
159// Deprecated functions.
160//
161
162/** Deprecated: use __system_property_wait instead. */
Elliott Hughesff26a162017-08-17 22:34:21 +0000163uint32_t __system_property_wait_any(uint32_t __old_serial);
Elliott Hughes40c885a2017-02-16 17:13:04 -0800164
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000165/**
166 * Deprecated: previously for testing, but now that SystemProperties is its own
167 * testable class, there is never a reason to call this function and its
168 * implementation simply returns -1.
169 */
170int __system_property_set_filename(const char* __unused __filename);
Colin Cross5cf32de2013-01-23 23:07:06 -0800171
Elliott Hughes28c2f7d2024-07-29 18:39:08 +0000172__END_DECLS