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

Commit 5ecd4bee authored by John Spurlock's avatar John Spurlock
Browse files

Dump system settings for all users

Change-Id: Ic832b19fe698da1984876b2949c3f26990ae5076
parent ef11a6c8
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -174,9 +174,7 @@ static void dumpstate() {
    dump_file("LAST PANIC CONSOLE", "/data/dontpanic/apanic_console");
    dump_file("LAST PANIC THREADS", "/data/dontpanic/apanic_threads");

    run_command("SYSTEM SETTINGS", 20, SU_PATH, "root", "sqlite3",
            "/data/data/com.android.providers.settings/databases/settings.db",
            "pragma user_version; select * from system; select * from secure; select * from global;", NULL);
    for_each_userid(do_dump_settings, NULL);

    /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */
    run_command("NETWORK INTERFACES", 10, SU_PATH, "root", "netcfg", NULL);
+7 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@

typedef void (for_each_pid_func)(int, const char *);
typedef void (for_each_tid_func)(int, int, const char *);
typedef void (for_each_userid_func)(int);

/* prints the contents of a file */
int dump_file(const char *title, const char* path);
@@ -51,6 +52,9 @@ void for_each_pid(for_each_pid_func func, const char *header);
/* for each thread in the system, run the specified function */
void for_each_tid(for_each_tid_func func, const char *header);

/* for each user id in the system, run the specified function */
void for_each_userid(for_each_userid_func func, const char *header);

/* Displays a blocked processes in-kernel wait channel */
void show_wchan(int pid, int tid, const char *name);

@@ -60,6 +64,9 @@ void do_showmap(int pid, const char *name);
/* Gets the dmesg output for the kernel */
void do_dmesg();

/* Dumps settings for a given user id */
void do_dump_settings(int userid);

/* Play a sound via Stagefright */
void play_sound(const char* path);

+39 −0
Original line number Diff line number Diff line
@@ -51,6 +51,29 @@ static const char* native_processes_to_dump[] = {
        NULL,
};

void for_each_userid(void (*func)(int), const char *header) {
    DIR *d;
    struct dirent *de;

    if (header) printf("\n------ %s ------\n", header);
    func(0);

    if (!(d = opendir("/data/system/users"))) {
        printf("Failed to open /data/system/users (%s)\n", strerror(errno));
        return;
    }

    while ((de = readdir(d))) {
        int userid;
        if (de->d_type != DT_DIR || !(userid = atoi(de->d_name))) {
            continue;
        }
        func(userid);
    }

    closedir(d);
}

static void __for_each_pid(void (*helper)(int, const char *, void *), const char *header, void *arg) {
    DIR *d;
    struct dirent *de;
@@ -175,6 +198,22 @@ out_close:
    return;
}

void do_dump_settings(int userid) {
    char title[255];
    char dbpath[255];
    char sql[255];
    sprintf(title, "SYSTEM SETTINGS (user %d)", userid);
    if (userid == 0) {
        strcpy(dbpath, "/data/data/com.android.providers.settings/databases/settings.db");
        strcpy(sql, "pragma user_version; select * from system; select * from secure; select * from global;");
    } else {
        sprintf(dbpath, "/data/system/users/%d/settings.db", userid);
        strcpy(sql, "pragma user_version; select * from system; select * from secure;");
    }
    run_command(title, 20, SU_PATH, "root", "sqlite3", dbpath, sql, NULL);
    return;
}

void do_dmesg() {
    printf("------ KERNEL LOG (dmesg) ------\n");
    /* Get size of kernel buffer */