xref: /aosp_15_r20/hardware/interfaces/radio/aidl/compat/service/hidl-utils.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "hidl-utils.h"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <android/hidl/manager/1.2/IServiceManager.h>
21*4d7e907cSAndroid Build Coastguard Worker 
22*4d7e907cSAndroid Build Coastguard Worker namespace android::hardware::hidl_utils {
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker class HalDeathRecipient : public hidl_death_recipient {
serviceDied(uint64_t,const wp<hidl::base::V1_0::IBase> &)25*4d7e907cSAndroid Build Coastguard Worker     void serviceDied(uint64_t /* cookie */, const wp<hidl::base::V1_0::IBase>& /* who */) override {
26*4d7e907cSAndroid Build Coastguard Worker         LOG(FATAL) << "One of the linked HALs died. Restarting...";
27*4d7e907cSAndroid Build Coastguard Worker     }
28*4d7e907cSAndroid Build Coastguard Worker };
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker static const auto gHalDeathRecipient = sp<HalDeathRecipient>::make();
31*4d7e907cSAndroid Build Coastguard Worker 
linkDeathToDeath(sp<::android::hidl::base::V1_0::IBase> hal)32*4d7e907cSAndroid Build Coastguard Worker void linkDeathToDeath(sp<::android::hidl::base::V1_0::IBase> hal) {
33*4d7e907cSAndroid Build Coastguard Worker     const auto linkStatus = hal->linkToDeath(gHalDeathRecipient, 0);
34*4d7e907cSAndroid Build Coastguard Worker     CHECK(linkStatus.withDefault(false)) << "Failed to link to HAL death";
35*4d7e907cSAndroid Build Coastguard Worker }
36*4d7e907cSAndroid Build Coastguard Worker 
listManifestByInterface(const char * descriptor)37*4d7e907cSAndroid Build Coastguard Worker hidl_vec<hidl_string> listManifestByInterface(const char* descriptor) {
38*4d7e907cSAndroid Build Coastguard Worker     auto manager = hidl::manager::V1_2::IServiceManager::getService();
39*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<hidl_string> services;
40*4d7e907cSAndroid Build Coastguard Worker     manager->listManifestByInterface(descriptor, hidl_utils::fill(&services));
41*4d7e907cSAndroid Build Coastguard Worker     CHECK_GT(services.size(), 0u) << "No " << descriptor
42*4d7e907cSAndroid Build Coastguard Worker                                   << " services in manifest (missing privileges?)" << std::endl;
43*4d7e907cSAndroid Build Coastguard Worker     return services;
44*4d7e907cSAndroid Build Coastguard Worker }
45*4d7e907cSAndroid Build Coastguard Worker 
46*4d7e907cSAndroid Build Coastguard Worker }  // namespace android::hardware::hidl_utils
47