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