blob: 4436dbeed7bad27b57bc42b064a1924639738f3d [file] [log] [blame]
Steven Moreland2e87adc2018-08-20 19:47:00 -07001/*
2 * Copyright (C) 2018 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#include <android/binder_manager.h>
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -070018#include <binder/IServiceManager.h>
19#include <binder/LazyServiceRegistrar.h>
Steven Moreland5d62e442018-09-13 15:01:02 -070020
Steven Moreland4d5ad492018-09-13 12:49:16 -070021#include "ibinder_internal.h"
Steven Moreland5d62e442018-09-13 15:01:02 -070022#include "status_internal.h"
Steven Moreland2e87adc2018-08-20 19:47:00 -070023
Steven Moreland2e87adc2018-08-20 19:47:00 -070024using ::android::defaultServiceManager;
25using ::android::IBinder;
26using ::android::IServiceManager;
27using ::android::sp;
Steven Moreland5d62e442018-09-13 15:01:02 -070028using ::android::status_t;
Steven Moreland09b9d162022-11-18 21:15:35 +000029using ::android::statusToString;
Steven Moreland2e87adc2018-08-20 19:47:00 -070030using ::android::String16;
Steven Morelandd687f332021-02-19 02:06:48 +000031using ::android::String8;
Steven Moreland2e87adc2018-08-20 19:47:00 -070032
Steven Morelandd50b4532020-08-31 21:45:00 +000033binder_exception_t AServiceManager_addService(AIBinder* binder, const char* instance) {
Steven Moreland2e87adc2018-08-20 19:47:00 -070034 if (binder == nullptr || instance == nullptr) {
Steven Morelandd50b4532020-08-31 21:45:00 +000035 return EX_ILLEGAL_ARGUMENT;
Steven Moreland2e87adc2018-08-20 19:47:00 -070036 }
37
38 sp<IServiceManager> sm = defaultServiceManager();
Steven Morelandd50b4532020-08-31 21:45:00 +000039 status_t exception = sm->addService(String16(instance), binder->getBinder());
40 return PruneException(exception);
Steven Moreland2e87adc2018-08-20 19:47:00 -070041}
Charlie Wangeae87df2023-02-03 12:33:16 -080042
Charles Chende6036d2023-03-14 21:30:38 +000043binder_exception_t AServiceManager_addServiceWithFlags(AIBinder* binder, const char* instance,
44 const AServiceManager_AddServiceFlag flags) {
Charlie Wangeae87df2023-02-03 12:33:16 -080045 if (binder == nullptr || instance == nullptr) {
46 return EX_ILLEGAL_ARGUMENT;
47 }
48
49 sp<IServiceManager> sm = defaultServiceManager();
Charles Chen1310f152023-02-13 18:02:10 +000050
Charles Chende6036d2023-03-14 21:30:38 +000051 bool allowIsolated = flags & AServiceManager_AddServiceFlag::ADD_SERVICE_ALLOW_ISOLATED;
Henry Wanga9209222024-05-31 16:22:58 +080052 int dumpFlags = 0;
53 if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_CRITICAL) {
54 dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL;
55 }
56 if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_HIGH) {
57 dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_HIGH;
58 }
59 if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_NORMAL) {
60 dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_NORMAL;
61 }
62 if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_DEFAULT) {
63 dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT;
64 }
65 if (dumpFlags == 0) {
66 dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT;
67 }
68 status_t exception =
69 sm->addService(String16(instance), binder->getBinder(), allowIsolated, dumpFlags);
70
Charlie Wangeae87df2023-02-03 12:33:16 -080071 return PruneException(exception);
72}
73
Steven Morelanddea68bb2019-02-15 10:53:08 -080074AIBinder* AServiceManager_checkService(const char* instance) {
75 if (instance == nullptr) {
76 return nullptr;
77 }
78
79 sp<IServiceManager> sm = defaultServiceManager();
80 sp<IBinder> binder = sm->checkService(String16(instance));
81
82 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder);
83 AIBinder_incStrong(ret.get());
84 return ret.get();
85}
Steven Moreland2e87adc2018-08-20 19:47:00 -070086AIBinder* AServiceManager_getService(const char* instance) {
87 if (instance == nullptr) {
88 return nullptr;
89 }
90
91 sp<IServiceManager> sm = defaultServiceManager();
92 sp<IBinder> binder = sm->getService(String16(instance));
93
Steven Moreland94968952018-09-05 14:42:59 -070094 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder);
Steven Moreland71cddc32018-08-30 23:39:22 -070095 AIBinder_incStrong(ret.get());
96 return ret.get();
Steven Moreland2e87adc2018-08-20 19:47:00 -070097}
Devin Moore6a9394f2020-07-31 17:24:51 -070098binder_status_t AServiceManager_registerLazyService(AIBinder* binder, const char* instance) {
99 if (binder == nullptr || instance == nullptr) {
100 return STATUS_UNEXPECTED_NULL;
101 }
102
103 auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance();
104 status_t status = serviceRegistrar.registerService(binder->getBinder(), instance);
105
106 return PruneStatusT(status);
107}
108AIBinder* AServiceManager_waitForService(const char* instance) {
109 if (instance == nullptr) {
110 return nullptr;
111 }
112
113 sp<IServiceManager> sm = defaultServiceManager();
114 sp<IBinder> binder = sm->waitForService(String16(instance));
115
116 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder);
117 AIBinder_incStrong(ret.get());
118 return ret.get();
119}
Steven Moreland09b9d162022-11-18 21:15:35 +0000120typedef void (*AServiceManager_onRegister)(const char* instance, AIBinder* registered,
121 void* cookie);
122
123struct AServiceManager_NotificationRegistration
124 : public IServiceManager::LocalRegistrationCallback {
125 std::mutex m;
126 const char* instance = nullptr;
127 void* cookie = nullptr;
128 AServiceManager_onRegister onRegister = nullptr;
129
130 virtual void onServiceRegistration(const String16& smInstance, const sp<IBinder>& binder) {
131 std::lock_guard<std::mutex> l(m);
132 if (onRegister == nullptr) return;
133
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700134 LOG_ALWAYS_FATAL_IF(String8(smInstance) != instance, "onServiceRegistration: %s != %s",
135 String8(smInstance).c_str(), instance);
Steven Moreland09b9d162022-11-18 21:15:35 +0000136
137 sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder);
138 AIBinder_incStrong(ret.get());
139
140 onRegister(instance, ret.get(), cookie);
141 }
142
143 void clear() {
144 std::lock_guard<std::mutex> l(m);
145 instance = nullptr;
146 cookie = nullptr;
147 onRegister = nullptr;
148 }
149};
150
151__attribute__((warn_unused_result)) AServiceManager_NotificationRegistration*
152AServiceManager_registerForServiceNotifications(const char* instance,
153 AServiceManager_onRegister onRegister,
154 void* cookie) {
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700155 LOG_ALWAYS_FATAL_IF(instance == nullptr, "instance == nullptr");
156 LOG_ALWAYS_FATAL_IF(onRegister == nullptr, "onRegister == nullptr for %s", instance);
Steven Moreland09b9d162022-11-18 21:15:35 +0000157 // cookie can be nullptr
158
159 auto cb = sp<AServiceManager_NotificationRegistration>::make();
160 cb->instance = instance;
161 cb->onRegister = onRegister;
162 cb->cookie = cookie;
163
164 sp<IServiceManager> sm = defaultServiceManager();
165 if (status_t res = sm->registerForNotifications(String16(instance), cb); res != STATUS_OK) {
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700166 ALOGE("Failed to register for service notifications for %s: %s", instance,
167 statusToString(res).c_str());
Steven Moreland09b9d162022-11-18 21:15:35 +0000168 return nullptr;
169 }
170
171 cb->incStrong(nullptr);
172 return cb.get();
173}
174
175void AServiceManager_NotificationRegistration_delete(
176 AServiceManager_NotificationRegistration* notification) {
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700177 LOG_ALWAYS_FATAL_IF(notification == nullptr, "notification == nullptr");
Steven Moreland09b9d162022-11-18 21:15:35 +0000178 notification->clear();
179 notification->decStrong(nullptr);
180}
181
Devin Moore6a9394f2020-07-31 17:24:51 -0700182bool AServiceManager_isDeclared(const char* instance) {
183 if (instance == nullptr) {
184 return false;
185 }
186
187 sp<IServiceManager> sm = defaultServiceManager();
188 return sm->isDeclared(String16(instance));
189}
Steven Morelandd687f332021-02-19 02:06:48 +0000190void AServiceManager_forEachDeclaredInstance(const char* interface, void* context,
191 void (*callback)(const char*, void*)) {
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700192 LOG_ALWAYS_FATAL_IF(interface == nullptr, "interface == nullptr");
Steven Morelandd687f332021-02-19 02:06:48 +0000193 // context may be nullptr
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700194 LOG_ALWAYS_FATAL_IF(callback == nullptr, "callback == nullptr");
Steven Morelandd687f332021-02-19 02:06:48 +0000195
196 sp<IServiceManager> sm = defaultServiceManager();
197 for (const String16& instance : sm->getDeclaredInstances(String16(interface))) {
198 callback(String8(instance).c_str(), context);
199 }
200}
Steven Morelandedd4e072021-04-21 00:27:29 +0000201bool AServiceManager_isUpdatableViaApex(const char* instance) {
202 if (instance == nullptr) {
203 return false;
204 }
205
206 sp<IServiceManager> sm = defaultServiceManager();
207 return sm->updatableViaApex(String16(instance)) != std::nullopt;
208}
Jooyung Han1abce692022-10-14 16:31:32 +0900209void AServiceManager_getUpdatableApexName(const char* instance, void* context,
210 void (*callback)(const char*, void*)) {
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700211 LOG_ALWAYS_FATAL_IF(instance == nullptr, "instance == nullptr");
Jooyung Han1abce692022-10-14 16:31:32 +0900212 // context may be nullptr
Tomasz Wasilczyke3de8802023-11-01 11:05:27 -0700213 LOG_ALWAYS_FATAL_IF(callback == nullptr, "callback == nullptr");
Jooyung Han1abce692022-10-14 16:31:32 +0900214
215 sp<IServiceManager> sm = defaultServiceManager();
216 std::optional<String16> updatableViaApex = sm->updatableViaApex(String16(instance));
217 if (updatableViaApex.has_value()) {
218 callback(String8(updatableViaApex.value()).c_str(), context);
219 }
220}
Jooyung Han75fc06f2024-02-03 03:56:59 +0900221void* AServiceManager_openDeclaredPassthroughHal(const char* interface, const char* instance,
222 int flag) {
223 LOG_ALWAYS_FATAL_IF(interface == nullptr, "interface == nullptr");
224 LOG_ALWAYS_FATAL_IF(instance == nullptr, "instance == nullptr");
225
226 return openDeclaredPassthroughHal(String16(interface), String16(instance), flag);
227}
Amos Bianchi9cf92762021-01-26 11:38:58 -0800228void AServiceManager_forceLazyServicesPersist(bool persist) {
229 auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance();
230 serviceRegistrar.forcePersist(persist);
231}
232void AServiceManager_setActiveServicesCallback(bool (*callback)(bool, void*), void* context) {
233 auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance();
234 std::function<bool(bool)> fn = [=](bool hasClients) -> bool {
235 return callback(hasClients, context);
236 };
237 serviceRegistrar.setActiveServicesCallback(fn);
238}
239bool AServiceManager_tryUnregister() {
240 auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance();
241 return serviceRegistrar.tryUnregister();
242}
243void AServiceManager_reRegister() {
244 auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance();
245 serviceRegistrar.reRegister();
Steven Morelandd687f332021-02-19 02:06:48 +0000246}