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 &registered) {
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