Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be0045aa authored by Mike Lockwood's avatar Mike Lockwood
Browse files

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: default avatarMike Lockwood <lockwood@android.com>
parent 020f35f2
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -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-"))) {
+39 −0
Original line number Diff line number Diff line
@@ -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)){