diff options
author | Mike Lockwood <lockwood@android.com> | 2009-09-02 18:06:17 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2009-09-03 00:36:14 -0400 |
commit | be0045aafdbc2ec2ee448be86952082361f5d672 (patch) | |
tree | 4996936332f9fcc77db59cb2b7ac183285641c5a /adb | |
parent | 020f35f274594f55eec956fdcfec90ad3d7a5c65 (diff) | |
download | system_core-be0045aafdbc2ec2ee448be86952082361f5d672.zip system_core-be0045aafdbc2ec2ee448be86952082361f5d672.tar.gz system_core-be0045aafdbc2ec2ee448be86952082361f5d672.tar.bz2 |
adb: "adb bugreport" now runs dumpstate via init rather than execing it in the shell.
This allows dumpstate to run as root even if adbd is not.
Change-Id: I04bda1ee0c8de91677149a2a9eda713c85067aa4
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'adb')
-rw-r--r-- | adb/commandline.c | 10 | ||||
-rw-r--r-- | adb/services.c | 39 |
2 files changed, 40 insertions, 9 deletions
diff --git a/adb/commandline.c b/adb/commandline.c index 411bb82..6603452 100644 --- a/adb/commandline.c +++ b/adb/commandline.c @@ -929,7 +929,7 @@ top: if(!strcmp(argv[0], "remount") || !strcmp(argv[0], "reboot") || !strcmp(argv[0], "tcpip") || !strcmp(argv[0], "usb") - || !strcmp(argv[0], "root")) { + || !strcmp(argv[0], "root") || !strcmp(argv[0], "bugreport")) { char command[100]; if (argc > 1) snprintf(command, sizeof(command), "%s:%s", argv[0], argv[1]); @@ -945,14 +945,6 @@ top: return 1; } - if(!strcmp(argv[0], "bugreport")) { - if (argc != 1) { - return 1; - } - do_cmd(ttype, serial, "shell", "dumpstate", "-", 0); - return 0; - } - /* adb_command() wrapper commands */ if(!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { diff --git a/adb/services.c b/adb/services.c index 2864ac9..447c11b 100644 --- a/adb/services.c +++ b/adb/services.c @@ -188,6 +188,43 @@ void reboot_service(int fd, void *arg) adb_close(fd); } +void bugreport_service(int fd, void *cookie) +{ + char buffer[MAX_PAYLOAD]; + int i, s; + + /* start the dumpstate service */ + property_set("ctl.start", "dumpstate"); + + /* socket will not be available until service starts */ + for (i = 0; i < 10; i++) { + s = socket_local_client("dumpstate", + ANDROID_SOCKET_NAMESPACE_RESERVED, + SOCK_STREAM); + if (s >= 0) + break; + /* try again in 1 second */ + sleep(1); + } + + if (s < 0) { + const char* failed = "Failed to connect to dumpstate service\n"; + writex(fd, failed, strlen(failed)); + adb_close(fd); + return; + } + + while (1) { + int length = adb_read(s, buffer, sizeof(buffer)); + if (length <= 0) + break; + if (adb_write(fd, buffer, length) <= 0) + break; + } + adb_close(s); + adb_close(fd); +} + #endif #if 0 @@ -469,6 +506,8 @@ int service_to_fd(const char *name) ret = create_service_thread(restart_tcp_service, (void *)port); } else if(!strncmp(name, "usb:", 4)) { ret = create_service_thread(restart_usb_service, NULL); + } else if(!strncmp(name, "bugreport:", 10)) { + ret = create_service_thread(bugreport_service, NULL); #endif #if 0 } else if(!strncmp(name, "echo:", 5)){ |