auto import from //depot/cupcake/@135843
diff --git a/cmds/dumpsys/dumpsys.cpp b/cmds/dumpsys/dumpsys.cpp
new file mode 100644
index 0000000..a62fe55
--- /dev/null
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -0,0 +1,81 @@
+/*
+ * Command that dumps interesting system state to the log.
+ *
+ */
+
+#define LOG_TAG "dumpsys"
+
+#include <utils/Log.h>
+#include <utils/Parcel.h>
+#include <utils/ProcessState.h>
+#include <utils/IServiceManager.h>
+#include <utils/TextOutput.h>
+#include <utils/Vector.h>
+
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+using namespace android;
+
+static int sort_func(const String16* lhs, const String16* rhs)
+{
+ return lhs->compare(*rhs);
+}
+
+int main(int argc, char* const argv[])
+{
+ sp<IServiceManager> sm = defaultServiceManager();
+ fflush(stdout);
+ if (sm == NULL) {
+ LOGE("Unable to get default service manager!");
+ aerr << "dumpsys: Unable to get default service manager!" << endl;
+ return 20;
+ }
+
+ Vector<String16> services;
+ Vector<String16> args;
+ if (argc == 1) {
+ services = sm->listServices();
+ services.sort(sort_func);
+ args.add(String16("-a"));
+ } else {
+ services.add(String16(argv[1]));
+ for (int i=2; i<argc; i++) {
+ args.add(String16(argv[i]));
+ }
+ }
+
+ const size_t N = services.size();
+
+ // first print a list of the current services
+ aout << "Currently running services:" << endl;
+
+ for (size_t i=0; i<N; i++) {
+ sp<IBinder> service = sm->checkService(services[i]);
+ if (service != NULL) {
+ aout << " " << services[i] << endl;
+ }
+ }
+
+ for (size_t i=0; i<N; i++) {
+ sp<IBinder> service = sm->checkService(services[i]);
+ if (service != NULL) {
+ aout << "------------------------------------------------------------"
+ "-------------------" << endl;
+ aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
+ int err = service->dump(STDOUT_FILENO, args);
+ if (err != 0) {
+ aerr << "Error dumping service info: (" << strerror(err)
+ << ") " << services[i] << endl;
+ }
+ } else {
+ aerr << "Can't find service: " << services[i] << endl;
+ }
+ }
+
+ return 0;
+}