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

Commit 8d533730 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

dumpstate: Add option to output to socket, disable code that switched to nonroot



This will be used to allow running dumpstate as root from the init process
to enable gathering debugging information that requires root to access.

Change-Id: I5bb7e83071fad2b377e549058f318a5118194061
Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 14d8e6e5
Loading
Loading
Loading
Loading
+54 −26
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <sys/time.h>
#include <sys/resource.h>

#include <cutils/sockets.h>
#include "private/android_filesystem_config.h"

#include "dumpstate.h"
@@ -164,11 +165,11 @@ static int check_command_name(const char* name, const char* test) {

int main(int argc, char *argv[]) {
    int dumpcrash = check_command_name(argv[0], "dumpcrash");
    int bugreport = check_command_name(argv[0], "bugreport");
    int add_date = 0;
    char* outfile = 0;
    int vibrate = 0;
    int compress = 0;
    int socket = 0;
    int c, fd, vibrate_fd, fds[2];
    char path[PATH_MAX];
    pid_t   pid;
@@ -180,9 +181,8 @@ int main(int argc, char *argv[]) {

    get_time(&now);

    if (bugreport) {
    do {
            c = getopt(argc, argv, "do:vz");
        c = getopt(argc, argv, "do:svz");
        if (c == EOF)
            break;
        switch (c) {
@@ -198,13 +198,15 @@ int main(int argc, char *argv[]) {
            case 'z':
                compress = 1;
                break;
            case 's':
                socket = 1;
                break;
            case '?':
            fprintf(stderr, "%s: invalid option -%c\n",
                argv[0], optopt);
                exit(1);
        }
    } while (1);
    }

    /* open vibrator before switching user */
    if (vibrate) {
@@ -214,14 +216,40 @@ int main(int argc, char *argv[]) {
    } else
        vibrate_fd = -1;

#if 0
    /* switch to non-root user and group */
    setgroups(sizeof(groups)/sizeof(groups[0]), groups);
    setuid(AID_SHELL);
#endif

    /* make it safe to use both printf and STDOUT_FILENO */ 
    setvbuf(stdout, 0, _IONBF, 0);

    if (outfile) {
    if (socket) {
        struct sockaddr addr;
        socklen_t alen;

        int s = android_get_control_socket("dumpstate");
        if (s < 0) {
            fprintf(stderr, "could not open dumpstate socket\n");
            exit(1);
        }
        if (listen(s, 4) < 0) {
            fprintf(stderr, "could not listen on dumpstate socket\n");
            exit(1);
        }

        alen = sizeof(addr);
        fd = accept(s, &addr, &alen);
        if (fd < 0) {
            fprintf(stderr, "could not accept dumpstate socket\n");
            exit(1);
        }

        /* redirect stdout to the socket */
        dup2(fd, STDOUT_FILENO);
        close(fd);
    } else if (outfile) {
        if (strlen(outfile) > sizeof(path) - 100)
            exit(1);