Lshal.cpp revision 85dd3ad89f26e8a28336ac3b2365fb896df7a0f6
185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong/* 285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * Copyright (C) 2016 The Android Open Source Project 385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * 485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * Licensed under the Apache License, Version 2.0 (the "License"); 585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * you may not use this file except in compliance with the License. 685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * You may obtain a copy of the License at 785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * 885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * http://www.apache.org/licenses/LICENSE-2.0 985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * 1085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * Unless required by applicable law or agreed to in writing, software 1185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * distributed under the License is distributed on an "AS IS" BASIS, 1285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * See the License for the specific language governing permissions and 1485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong * limitations under the License. 1585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong */ 1685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 1785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 1885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <getopt.h> 1985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 2085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <map> 2185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <iomanip> 2285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <iostream> 2385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <sstream> 2485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 2585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <android/hidl/manager/1.0/IServiceManager.h> 2685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong#include <hidl/ServiceManagement.h> 2785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 2885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hongtemplate <typename A, typename B, typename C, typename D> 2985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hongvoid printColumn(std::stringstream &stream, 3085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong const A &a, const B &b, const C &c, const D &d) { 3185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong using namespace ::std; 3285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong stream << left 3385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << setw(70) << a << "\t" 3485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << setw(20) << b << "\t" 3585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << setw(10) << c << "\t" 3685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << setw(5) << d << "\t" 3785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << endl; 3885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong} 3985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 4085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hongint dump() { 4185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong using namespace ::std; 4285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong using namespace ::android::hardware; 4385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong using namespace ::android::hidl::manager::V1_0; 4485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 4585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong std::map<std::string, ::android::sp<IServiceManager>> mapping = { 4685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong {"hwbinder", defaultServiceManager()}, 4785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong {"passthrough", getPassthroughServiceManager()} 4885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong }; 4985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 5085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong std::stringstream stream; 5185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 5285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong stream << "All services:" << endl; 5385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong stream << left; 5485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong printColumn(stream, "Interface", "Instance", "Transport", "Ref"); 5585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 5685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong for (const auto &pair : mapping) { 5785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong const std::string &mode = pair.first; 5885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong const ::android::sp<IServiceManager> &manager = pair.second; 5985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 6085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong if (manager == nullptr) { 6185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong cerr << "Failed to get IServiceManager for " << mode << "!" << endl; 6285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong continue; 6385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 6485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 6585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong auto ret = manager->debugDump([&](const auto ®istered) { 6685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong for (const auto &info : registered) { 6785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong printColumn(stream, 6885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong info.interfaceName, 6985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong info.instanceName.empty() ? "N/A" : info.instanceName, 7085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong mode, 7185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong info.refCount == 0 ? "N/A" : std::to_string(info.refCount - 1)); 7285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 7385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong }); 7485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong if (!ret.isOk()) { 7585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong cerr << "Failed to list services for " << mode << ": " 7685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << ret.description() << endl; 7785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 7885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 7985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong cout << stream.rdbuf(); 8085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong return 0; 8185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong} 8285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 8385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hongint usage() { 8485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong using namespace ::std; 8585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong cerr 8685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << "usage: lshal" << endl 8785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << " To dump all hals." << endl 8885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << "or:" << endl 8985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << " lshal [-h|--help]" << endl 9085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong << " -h, --help: show this help information." << endl; 9185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong return -1; 9285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong} 9385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 9485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hongint main(int argc, char **argv) { 9585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong static struct option longOptions[] = { 9685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong {"help", no_argument, 0, 'h' }, 9785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong { 0, 0, 0, 0 } 9885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong }; 9985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 10085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong int optionIndex; 10185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong int c; 10285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong optind = 1; 10385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong for (;;) { 10485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong // using getopt_long in case we want to add other options in the future 10585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong c = getopt_long(argc, argv, "h", longOptions, &optionIndex); 10685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong if (c == -1) { 10785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong break; 10885dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 10985dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong switch (c) { 11085dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong case 'h': // falls through 11185dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong default: // see unrecognized options 11285dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong return usage(); 11385dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 11485dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong } 11585dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong return dump(); 11685dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong 11785dd3ad89f26e8a28336ac3b2365fb896df7a0f6Yifan Hong} 118