cmd.cpp revision 23eb1e20cf59e1238b65cc108f31dfbfd85b2337
123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn/*
223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * Copyright (C) 2015 The Android Open Source Project
323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn *
423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * you may not use this file except in compliance with the License.
623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * You may obtain a copy of the License at
723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn *
823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn *
1023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * See the License for the specific language governing permissions and
1423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn * limitations under the License.
1523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn */
1623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
1723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#define LOG_TAG "cmd"
1823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
1923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <utils/Log.h>
2023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/Parcel.h>
2123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/ProcessState.h>
2223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/IResultReceiver.h>
2323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/IServiceManager.h>
2423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/TextOutput.h>
2523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <utils/Vector.h>
2623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
2723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <getopt.h>
2823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <stdlib.h>
2923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <stdio.h>
3023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <string.h>
3123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <unistd.h>
3223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <sys/time.h>
3323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
3423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornusing namespace android;
3523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
3623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornstatic int sort_func(const String16* lhs, const String16* rhs)
3723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn{
3823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    return lhs->compare(*rhs);
3923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn}
4023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
4123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornclass MyResultReceiver : public BnResultReceiver
4223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn{
4323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornpublic:
4423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    virtual void send(int32_t /*resultCode*/) {
4523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
4623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn};
4723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
4823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornint main(int argc, char* const argv[])
4923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn{
5023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    signal(SIGPIPE, SIG_IGN);
5123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    sp<ProcessState> proc = ProcessState::self();
5223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    proc->startThreadPool();
5323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
5423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    sp<IServiceManager> sm = defaultServiceManager();
5523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    fflush(stdout);
5623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    if (sm == NULL) {
5723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        ALOGE("Unable to get default service manager!");
5823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        aerr << "cmd: Unable to get default service manager!" << endl;
5923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        return 20;
6023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
6123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
6223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    if (argc == 1) {
6323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        aout << "cmd: no service specified; use -l to list all services" << endl;
6423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        return 20;
6523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
6623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
6723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) {
6823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        Vector<String16> services = sm->listServices();
6923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        services.sort(sort_func);
7023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        aout << "Currently running services:" << endl;
7123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
7223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        for (size_t i=0; i<services.size(); i++) {
7323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            sp<IBinder> service = sm->checkService(services[i]);
7423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            if (service != NULL) {
7523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn                aout << "  " << services[i] << endl;
7623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            }
7723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        }
7823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        return 0;
7923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
8023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
8123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    Vector<String16> args;
8223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    for (int i=2; i<argc; i++) {
8323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        args.add(String16(argv[i]));
8423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
8523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    String16 cmd = String16(argv[1]);
8623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    sp<IBinder> service = sm->checkService(cmd);
8723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    if (service == NULL) {
8823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        aerr << "Can't find service: " << argv[1] << endl;
8923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        return 20;
9023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
9123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
9223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    // TODO: block until a result is returned to MyResultReceiver.
9323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    service->shellCommand(STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO, args, new MyResultReceiver());
9423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    return 0;
9523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn}
96