Add new "shell command" feature to Binder objects.
IBinder has a new common interface for sending shell commands
to it. This can be implemented by system services to provide
a shell interface to the service, without needing to have separate
shell java code.
Also add a new "cmd" command line tool, which invokes the shell
command method on a system service. This is much like dumpsys,
but for shell commands.
Change-Id: I95dc80c881a28cefb76957ad4d4fd9b3ed9630df
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp
index 345ba20..5cf720c 100644
--- a/libs/binder/BpBinder.cpp
+++ b/libs/binder/BpBinder.cpp
@@ -20,6 +20,7 @@
#include <binder/BpBinder.h>
#include <binder/IPCThreadState.h>
+#include <binder/IResultReceiver.h>
#include <utils/Log.h>
#include <stdio.h>
@@ -156,6 +157,23 @@
return err;
}
+status_t BpBinder::shellCommand(int in, int out, int err, Vector<String16>& args,
+ const sp<IResultReceiver>& resultReceiver)
+{
+ Parcel send;
+ Parcel reply;
+ send.writeFileDescriptor(in);
+ send.writeFileDescriptor(out);
+ send.writeFileDescriptor(err);
+ const size_t numArgs = args.size();
+ send.writeInt32(numArgs);
+ for (size_t i = 0; i < numArgs; i++) {
+ send.writeString16(args[i]);
+ }
+ send.writeStrongBinder(resultReceiver != NULL ? IInterface::asBinder(resultReceiver) : NULL);
+ return transact(SHELL_COMMAND_TRANSACTION, send, &reply);
+}
+
status_t BpBinder::transact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{