main.cpp revision 0a3406fc4f8e9a8c8a9155fc7886a0496f692496
11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/*
21754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Copyright (C) 2016 The Android Open Source Project
31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License.
61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at
71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software
111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and
141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License.
151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#define LOG_TAG "incident"
181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include "incident_sections.h"
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <android/os/BnIncidentReportStatusListener.h>
221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <android/os/IIncidentManager.h>
231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <android/os/IncidentReportArgs.h>
241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <binder/IPCThreadState.h>
251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <binder/IServiceManager.h>
261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <utils/Looper.h>
271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <fcntl.h>
291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <getopt.h>
301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <stdio.h>
311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <stdlib.h>
321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <unistd.h>
331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android;
351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::base;
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::binder;
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::os;
381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoclass StatusListener : public BnIncidentReportStatusListener {
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratopublic:
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    StatusListener();
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual ~StatusListener();
441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportStarted();
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportSectionStatus(int32_t section, int32_t status);
471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportServiceStatus(const String16& service, int32_t status);
481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportFinished();
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportFailed();
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::StatusListener()
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::~StatusListener()
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportStarted()
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportSectionStatus(int32_t section, int32_t status)
681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "section %d status %d\n", section, status);
701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportServiceStatus(const String16& service, int32_t status)
751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "service '%s' status %d\n", String8(service).string(), status);
771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportFinished()
821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "done\n");
841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    exit(0);
851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportFailed()
901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "failed\n");
921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    exit(1);
931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinstatic void section_list(FILE* out) {
980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    IncidentSection sections[INCIDENT_SECTION_COUNT];
990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int i = 0;
1000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int j = 0;
1010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    // sort the sections based on id
1020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    while (i < INCIDENT_SECTION_COUNT) {
1030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        IncidentSection curr = INCIDENT_SECTIONS[i];
1040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        for (int k = 0; k < j; k++) {
1050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (curr.id > sections[k].id) {
1060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                continue;
1070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            IncidentSection tmp = curr;
1090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            curr = sections[k];
1100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sections[k] = tmp;
1110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        sections[j] = curr;
1130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        i++;
1140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        j++;
1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fprintf(out, "available sections:\n");
1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    for (int i = 0; i < INCIDENT_SECTION_COUNT; ++i) {
1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        fprintf(out, "id: %4d, name: %s\n", sections[i].id, sections[i].name);
1200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// ================================================================================
1241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic IncidentSection const*
1251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratofind_section(const char* name)
1261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t low = 0;
1281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t high = INCIDENT_SECTION_COUNT - 1;
1291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while (low <= high) {
1311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        size_t mid = (low + high) >> 1;
1321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        IncidentSection const* section = INCIDENT_SECTIONS + mid;
1331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        int cmp = strcmp(section->name, name);
1351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (cmp < 0) {
1361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            low = mid + 1;
1371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else if (cmp > 0) {
1381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            high = mid - 1;
1391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
1401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return section;
1411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return NULL;
1441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
1471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic void
1481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousage(FILE* out)
1491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "usage: incident OPTIONS [SECTION...]\n");
1511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "Takes an incident report.\n");
1531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "OPTIONS\n");
1551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -b           (default) print the report to stdout (in proto format)\n");
1561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -d           send the report into dropbox\n");
1570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fprintf(out, "  -l           list available sections\n");
1581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  SECTION     the field numbers of the incident report fields to include\n");
1601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoint
1641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratomain(int argc, char** argv)
1651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Status status;
1671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    IncidentReportArgs args;
1681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    enum { DEST_DROPBOX, DEST_STDOUT } destination = DEST_STDOUT;
1691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Parse the args
1711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int opt;
1720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    while ((opt = getopt(argc, argv, "bhdl")) != -1) {
1731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        switch (opt) {
1741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'h':
1751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stdout);
1761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
1770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            case 'l':
1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                section_list(stdout);
1790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                return 0;
1800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            case 'b':
1810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                destination = DEST_STDOUT;
1820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                break;
1831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'd':
1841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                destination = DEST_DROPBOX;
1851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                break;
1861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            default:
1871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stderr);
1881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 1;
1891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (optind == argc) {
1931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        args.setAll(true);
1941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
1951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        for (int i=optind; i<argc; i++) {
1961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            const char* arg = argv[i];
1971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            char* end;
1981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (arg[0] != '\0') {
1991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                int section = strtol(arg, &end, 0);
2001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                if (*end == '\0') {
2011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(section);
2021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                } else {
2031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    IncidentSection const* ic = find_section(arg);
2041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    if (ic == NULL) {
2051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        fprintf(stderr, "Invalid section: %s\n", arg);
2061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        return 1;
2071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    }
2081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(ic->id);
2091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                }
2101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
2111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Start the thread pool.
2171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<ProcessState> ps(ProcessState::self());
2181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->startThreadPool();
2191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->giveThreadPoolName();
2201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Look up the service
2221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<IIncidentManager> service = interface_cast<IIncidentManager>(
2231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            defaultServiceManager()->getService(android::String16("incident")));
2241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (service == NULL) {
2251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        fprintf(stderr, "Couldn't look up the incident service\n");
2261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return 1;
2271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Construct the stream
2301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int fds[2];
2311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    pipe(fds);
2321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd readEnd(fds[0]);
2341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd writeEnd(fds[1]);
2351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (destination == DEST_STDOUT) {
2371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Call into the service
2381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        sp<StatusListener> listener(new StatusListener());
2391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncidentToStream(args, listener, writeEnd);
2401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
2431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Wait for the result and print out the data they send.
2461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        //IPCThreadState::self()->joinThreadPool();
2471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        while (true) {
2491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            int amt = splice(fds[0], NULL, STDOUT_FILENO, NULL, 4096, 0);
2501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "spliced %d bytes\n", amt);
2511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (amt < 0) {
2521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return errno;
2531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            } else if (amt == 0) {
2541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
2551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
2561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
2581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncident(args);
2591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
2611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 1;
2621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
2631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 0;
2641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
268