| /* | 
 |  * Command that dumps interesting system state to the log. | 
 |  * | 
 |  */ | 
 |  | 
 | #define LOG_TAG "dumpsys" | 
 |  | 
 | #include <utils/Log.h> | 
 | #include <binder/Parcel.h> | 
 | #include <binder/ProcessState.h> | 
 | #include <binder/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(); | 
 |  | 
 |     if (N > 1) { | 
 |         // 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) { | 
 |             if (N > 1) { | 
 |                 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; | 
 | } |