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

Commit eb296306 authored by Nandana Dutt's avatar Nandana Dutt Committed by android-build-merger
Browse files

Merge "Add a flag that makes dumpstate wait for options" am: f1d9a288

am: f3172183

Change-Id: Ib38e276c00f793d2e3f881d4f3ce079ba58aa581
parents 72667b8e f3172183
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -1654,6 +1654,7 @@ static void ShowUsage() {
            "progress (requires -o and -B)\n"
            "  -R: take bugreport in remote mode (requires -o, -z, -d and -B, "
            "shouldn't be used with -P)\n"
            "  -w: start binder service and make it wait for a call to startBugreport\n"
            "  -v: prints the dumpstate header and exit\n");
}

@@ -2112,7 +2113,7 @@ void Dumpstate::DumpOptions::Initialize(BugreportMode bugreport_mode,
Dumpstate::RunStatus Dumpstate::DumpOptions::Initialize(int argc, char* argv[]) {
    RunStatus status = RunStatus::OK;
    int c;
    while ((c = getopt(argc, argv, "dho:svqzpPBRSV:")) != -1) {
    while ((c = getopt(argc, argv, "dho:svqzpPBRSV:w")) != -1) {
        switch (c) {
            // clang-format off
            case 'd': do_add_date = true;            break;
@@ -2129,6 +2130,9 @@ Dumpstate::RunStatus Dumpstate::DumpOptions::Initialize(int argc, char* argv[])
            case 'R': is_remote_mode = true;         break;
            case 'B': do_broadcast = true;           break;
            case 'V':                                break;  // compatibility no-op
            case 'w':
                // This was already processed
                break;
            case 'h':
                status = RunStatus::HELP;
                break;
+6 −0
Original line number Diff line number Diff line
@@ -17,3 +17,9 @@ service dumpstatez /system/bin/dumpstate -S -d -z \
    class main
    disabled
    oneshot

# bugreportd starts dumpstate binder service and makes it wait for a listener to connect.
service bugreportd /system/bin/dumpstate -w
    class main
    disabled
    oneshot
+48 −1
Original line number Diff line number Diff line
@@ -14,8 +14,55 @@
 * limitations under the License.
 */

#define LOG_TAG "dumpstate"

#include <binder/IPCThreadState.h>

#include "DumpstateInternal.h"
#include "DumpstateService.h"
#include "dumpstate.h"

namespace {

// Returns true if we should start the service and wait for a listener
// to bind with bugreport options.
bool ShouldStartServiceAndWait(int argc, char* argv[]) {
    bool do_wait = false;
    int c;
    // Keep flags in sync with Dumpstate::DumpOptions::Initialize.
    while ((c = getopt(argc, argv, "wdho:svqzpPBRSV:")) != -1 && !do_wait) {
        switch (c) {
            case 'w':
                do_wait = true;
                break;
            default:
                // Ignore all other options
                break;
        }
    }

    // Reset next index used by getopt so getopt can be called called again in Dumpstate::Run to
    // parse bugreport options.
    optind = 1;
    return do_wait;
}

}  // namespace

int main(int argc, char* argv[]) {
    if (ShouldStartServiceAndWait(argc, argv)) {
        int ret;
        if ((ret = android::os::DumpstateService::Start()) != android::OK) {
            MYLOGE("Unable to start 'dumpstate' service: %d", ret);
            exit(1);
        }
        MYLOGI("'dumpstate' service started and will wait for a call to startBugreport()");

        // Waits forever for an incoming connection.
        // TODO(b/111441001): should this time out?
        android::IPCThreadState::self()->joinThreadPool();
        return 0;
    } else {
        return run_main(argc, argv);
    }
}