ServiceManagement.cpp revision 67a024919015598efa7e24f0ab3d0d9154f12523
15d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland/*
25d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Copyright (C) 2016 The Android Open Source Project
35d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland *
45d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Licensed under the Apache License, Version 2.0 (the "License");
55d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * you may not use this file except in compliance with the License.
65d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * You may obtain a copy of the License at
75d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland *
85d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland *      http://www.apache.org/licenses/LICENSE-2.0
95d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland *
105d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Unless required by applicable law or agreed to in writing, software
115d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * distributed under the License is distributed on an "AS IS" BASIS,
125d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * See the License for the specific language governing permissions and
145d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * limitations under the License.
155d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland */
165d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
175d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#define LOG_TAG "ServiceManagement"
185d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
199a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <condition_variable>
209a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <dlfcn.h>
219a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <dirent.h>
229a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <unistd.h>
239a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong
249a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <mutex>
259a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <regex>
269a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong
2712f04d913dae2fb287089f6db24f144731c79d9cMartijn Coenen#include <hidl/HidlBinderSupport.h>
285d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/ServiceManagement.h>
295d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/Static.h>
305d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/Status.h>
315d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
32337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland#include <android-base/logging.h>
33337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland#include <hidl-util/FQName.h>
340091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland#include <hidl-util/StringHelper.h>
355d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hwbinder/IPCThreadState.h>
365d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hwbinder/Parcel.h>
375d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
385d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <android/hidl/manager/1.0/IServiceManager.h>
394e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong#include <android/hidl/manager/1.0/BpHwServiceManager.h>
404e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong#include <android/hidl/manager/1.0/BnHwServiceManager.h>
415d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
429a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#define RE_COMPONENT    "[a-zA-Z_][a-zA-Z_0-9]*"
439a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#define RE_PATH         RE_COMPONENT "(?:[.]" RE_COMPONENT ")*"
449a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hongstatic const std::regex gLibraryFileNamePattern("(" RE_PATH "@[0-9]+[.][0-9]+)-impl(.*?).so");
459a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong
465d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandusing android::hidl::manager::V1_0::IServiceManager;
47337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandusing android::hidl::manager::V1_0::IServiceNotification;
484e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hongusing android::hidl::manager::V1_0::BpHwServiceManager;
494e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hongusing android::hidl::manager::V1_0::BnHwServiceManager;
505d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
515d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandnamespace android {
525d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandnamespace hardware {
535d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
545d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandsp<IServiceManager> defaultServiceManager() {
555d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
565d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
575d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
585d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        // HwBinder not available on this device or not accessible to
595d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        // this process.
605d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        return nullptr;
615d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    }
625d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    {
635d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        AutoMutex _l(gDefaultServiceManagerLock);
645d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        while (gDefaultServiceManager == NULL) {
654e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong            gDefaultServiceManager = fromBinder<IServiceManager, BpHwServiceManager, BnHwServiceManager>(
665d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland                ProcessState::self()->getContextObject(NULL));
675d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland            if (gDefaultServiceManager == NULL)
685d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland                sleep(1);
695d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland        }
705d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    }
715d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
725d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland    return gDefaultServiceManager;
735d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland}
745d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland
750091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Morelandstd::vector<std::string> search(const std::string &path,
760091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland                              const std::string &prefix,
770091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland                              const std::string &suffix) {
780091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(path.c_str()), closedir);
790091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    if (!dir) return {};
800091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
810091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    std::vector<std::string> results{};
820091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
830091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    dirent* dp;
840091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    while ((dp = readdir(dir.get())) != nullptr) {
850091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland        std::string name = dp->d_name;
860091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
870091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland        if (StringHelper::StartsWith(name, prefix) &&
880091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland                StringHelper::EndsWith(name, suffix)) {
890091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland            results.push_back(name);
900091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland        }
910091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    }
920091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
930091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland    return results;
940091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland}
950091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
969a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hongbool matchPackageName(const std::string &lib, std::string *matchedName) {
979a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong    std::smatch match;
989a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong    if (std::regex_match(lib, match, gLibraryFileNamePattern)) {
999a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong        *matchedName = match.str(1) + "::I*";
1009a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong        return true;
1019a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong    }
1029a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong    return false;
1039a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong}
1049a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong
1057f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hongstatic void registerReference(const hidl_string &interfaceName, const hidl_string &instanceName) {
1067f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    sp<IServiceManager> binderizedManager = defaultServiceManager();
1077f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    if (binderizedManager == nullptr) {
1087f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        LOG(WARNING) << "Could not registerReference for "
1097f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong                     << interfaceName << "/" << instanceName
1107f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong                     << ": null binderized manager.";
1117f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        return;
1127f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    }
1137f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    auto ret = binderizedManager->registerPassthroughClient(interfaceName, instanceName, getpid());
1147f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    if (!ret.isOk()) {
1157f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        LOG(WARNING) << "Could not registerReference for "
1167f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong                     << interfaceName << "/" << instanceName
1177f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong                     << ": " << ret.description();
1187f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    }
119e681aa5d655fcf5e2970b7fdc91f3b307ba50331Steven Moreland    LOG(VERBOSE) << "Successfully registerReference for "
120e681aa5d655fcf5e2970b7fdc91f3b307ba50331Steven Moreland                 << interfaceName << "/" << instanceName;
1217f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong}
1227f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong
123337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandstruct PassthroughServiceManager : IServiceManager {
124337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    Return<sp<IBase>> get(const hidl_string& fqName,
125337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland                     const hidl_string& name) override {
126348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland        const FQName iface(fqName);
127337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
128337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        if (!iface.isValid() ||
129337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland            !iface.isFullyQualified() ||
130337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland            iface.isIdentifier()) {
131337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland            LOG(ERROR) << "Invalid interface name passthrough lookup: " << fqName;
132337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland            return nullptr;
133337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        }
134337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
135348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland        const std::string prefix = iface.getPackageAndVersion().string() + "-impl";
136348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland        const std::string sym = "HIDL_FETCH_" + iface.name();
137348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland
138337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        const int dlMode = RTLD_LAZY;
139337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        void *handle = nullptr;
140337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
1410091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland        // TODO: lookup in VINTF instead
1420091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland        // TODO(b/34135607): Remove HAL_LIBRARY_PATH_SYSTEM
1430091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
144a29905cc9dcb5a1c4368b25940aafd5081d95d54Steven Moreland        dlerror(); // clear
145a29905cc9dcb5a1c4368b25940aafd5081d95d54Steven Moreland
146337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        for (const std::string &path : {
147337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland            HAL_LIBRARY_PATH_ODM, HAL_LIBRARY_PATH_VENDOR, HAL_LIBRARY_PATH_SYSTEM
148337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        }) {
1490091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland            std::vector<std::string> libs = search(path, prefix, ".so");
1500091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland
1510091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland            for (const std::string &lib : libs) {
152348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                const std::string fullPath = path + lib;
153348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland
154348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                handle = dlopen(fullPath.c_str(), dlMode);
155348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                if (handle == nullptr) {
156348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    const char* error = dlerror();
157348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    LOG(ERROR) << "Failed to dlopen " << lib << ": "
158348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                               << (error == nullptr ? "unknown error" : error);
159348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    continue;
1600091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland                }
161337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
162348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                IBase* (*generator)(const char* name);
163348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                *(void **)(&generator) = dlsym(handle, sym.c_str());
164348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                if(!generator) {
165348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    const char* error = dlerror();
166348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    LOG(ERROR) << "Passthrough lookup opened " << lib
167348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                               << " but could not find symbol " << sym << ": "
168348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                               << (error == nullptr ? "unknown error" : error);
169348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    dlclose(handle);
170348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    continue;
171348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                }
172337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
173348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                IBase *interface = (*generator)(name);
174337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
175348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                if (interface == nullptr) {
176348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    dlclose(handle);
177348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                    continue; // this module doesn't provide this instance name
178348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                }
1797f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong
180348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                registerReference(fqName, name);
1817f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong
182348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland                return interface;
183348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland            }
184f6f1b40df805f845035ba992e8d44f24ade87b9fSteven Moreland        }
185f6f1b40df805f845035ba992e8d44f24ade87b9fSteven Moreland
186348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland        return nullptr;
187337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    }
188337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
18967a024919015598efa7e24f0ab3d0d9154f12523Martijn Coenen    Return<bool> add(const hidl_string& /* name */,
190337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland                     const sp<IBase>& /* service */) override {
191337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        LOG(FATAL) << "Cannot register services with passthrough service manager.";
192337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        return false;
193337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    }
194337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
195705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong    Return<void> list(list_cb /* _hidl_cb */) override {
196705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        LOG(FATAL) << "Cannot list services with passthrough service manager.";
197337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        return Void();
198337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    }
199337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    Return<void> listByInterface(const hidl_string& /* fqInstanceName */,
200337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland                                 listByInterface_cb /* _hidl_cb */) override {
201337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        // TODO: add this functionality
202337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        LOG(FATAL) << "Cannot list services with passthrough service manager.";
203337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        return Void();
204337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    }
205337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
206337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    Return<bool> registerForNotifications(const hidl_string& /* fqName */,
207337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland                                          const hidl_string& /* name */,
208337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland                                          const sp<IServiceNotification>& /* callback */) override {
209337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        // This makes no sense.
210337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        LOG(FATAL) << "Cannot register for notifications with passthrough service manager.";
211337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland        return false;
212337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    }
213337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
214705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong    Return<void> debugDump(debugDump_cb _hidl_cb) override {
215705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        using Arch = ::android::hidl::base::V1_0::DebugInfo::Architecture;
216705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        static std::vector<std::pair<Arch, std::vector<const char *>>> sAllPaths{
217705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong            {Arch::IS_64BIT, {HAL_LIBRARY_PATH_ODM_64BIT,
218705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                                      HAL_LIBRARY_PATH_VENDOR_64BIT,
219705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                                      HAL_LIBRARY_PATH_SYSTEM_64BIT}},
220705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong            {Arch::IS_32BIT, {HAL_LIBRARY_PATH_ODM_32BIT,
221705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                                      HAL_LIBRARY_PATH_VENDOR_32BIT,
222705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                                      HAL_LIBRARY_PATH_SYSTEM_32BIT}}
223705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        };
224705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        std::vector<InstanceDebugInfo> vec;
225705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        for (const auto &pair : sAllPaths) {
226705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong            Arch arch = pair.first;
227705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong            for (const auto &path : pair.second) {
228705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                std::vector<std::string> libs = search(path, "", ".so");
229705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                for (const std::string &lib : libs) {
230705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                    std::string matchedName;
231705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                    if (matchPackageName(lib, &matchedName)) {
232705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                        vec.push_back({
233705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                            .interfaceName = matchedName,
234705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                            .instanceName = "*",
235705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                            .clientPids = {},
236705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                            .arch = arch
237705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                        });
238705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                    }
239705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong                }
240705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong            }
241705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        }
242705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong        _hidl_cb(vec);
2437f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        return Void();
2447f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    }
2457f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong
2467f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong    Return<void> registerPassthroughClient(const hidl_string &, const hidl_string &, int32_t) override {
2477f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        // This makes no sense.
2487f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong        LOG(FATAL) << "Cannot call registerPassthroughClient on passthrough service manager. "
2497f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong                   << "Call it on defaultServiceManager() instead.";
2509a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong        return Void();
2519a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong    }
2529a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong
253337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland};
254337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
255337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandsp<IServiceManager> getPassthroughServiceManager() {
256337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    static sp<PassthroughServiceManager> manager(new PassthroughServiceManager());
257337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland    return manager;
258337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland}
259337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland
260cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandnamespace details {
261cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
262cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandstruct Waiter : IServiceNotification {
263cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    Return<void> onRegistration(const hidl_string& /* fqName */,
264cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland                                const hidl_string& /* name */,
265cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland                                bool /* preexisting */) override {
266cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        std::unique_lock<std::mutex> lock(mMutex);
267cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        if (mRegistered) {
268cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland            return Void();
269cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        }
270cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        mRegistered = true;
271cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        lock.unlock();
272cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
273cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        mCondition.notify_one();
274cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        return Void();
275cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    }
276cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
277cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    void wait() {
278cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        std::unique_lock<std::mutex> lock(mMutex);
279cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        mCondition.wait(lock, [this]{
280cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland            return mRegistered;
281cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        });
282cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    }
283cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
284cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandprivate:
285cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    std::mutex mMutex;
286cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    std::condition_variable mCondition;
287cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    bool mRegistered = false;
288cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland};
289cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
290cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandvoid waitForHwService(
291cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        const std::string &interface, const std::string &instanceName) {
292cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    const sp<IServiceManager> manager = defaultServiceManager();
293cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
294cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    if (manager == nullptr) {
295cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        LOG(ERROR) << "Could not get default service manager.";
296cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        return;
297cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    }
298cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
299cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    sp<Waiter> waiter = new Waiter();
300cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    Return<bool> ret = manager->registerForNotifications(interface, instanceName, waiter);
301cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
302cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    if (!ret.isOk()) {
303cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        LOG(ERROR) << "Transport error, " << ret.description()
304cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland            << ", during notification registration for "
305cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland            << interface << "/" << instanceName << ".";
306cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        return;
307cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    }
308cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
309cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    if (!ret) {
310cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        LOG(ERROR) << "Could not register for notifications for "
311cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland            << interface << "/" << instanceName << ".";
312cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland        return;
313cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    }
314cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
315cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland    waiter->wait();
316cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland}
317cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
318cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland}; // namespace details
319cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland
3205d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland}; // namespace hardware
3215d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland}; // namespace android
322