summaryrefslogtreecommitdiffstats
path: root/adb
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2009-09-02 18:06:17 -0400
committerMike Lockwood <lockwood@android.com>2009-09-03 00:36:14 -0400
commitbe0045aafdbc2ec2ee448be86952082361f5d672 (patch)
tree4996936332f9fcc77db59cb2b7ac183285641c5a /adb
parent020f35f274594f55eec956fdcfec90ad3d7a5c65 (diff)
downloadsystem_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.c10
-rw-r--r--adb/services.c39
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)){