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
280f0471623e91c202fb7381a050cc331572fb439fYi Jin#include <cstring>
291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <fcntl.h>
301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <getopt.h>
311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <stdio.h>
321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <stdlib.h>
331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <unistd.h>
341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android;
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::base;
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::binder;
381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android::os;
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoclass StatusListener : public BnIncidentReportStatusListener {
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratopublic:
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    StatusListener();
441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual ~StatusListener();
451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportStarted();
471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportSectionStatus(int32_t section, int32_t status);
481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportServiceStatus(const String16& service, int32_t status);
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportFinished();
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual Status onReportFailed();
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::StatusListener()
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::~StatusListener()
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportStarted()
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportSectionStatus(int32_t section, int32_t status)
691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "section %d status %d\n", section, status);
711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportServiceStatus(const String16& service, int32_t status)
761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "service '%s' status %d\n", String8(service).string(), status);
781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportFinished()
831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "done\n");
851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    exit(0);
861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatusListener::onReportFailed()
911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(stderr, "failed\n");
931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    exit(1);
941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinstatic void section_list(FILE* out) {
990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    IncidentSection sections[INCIDENT_SECTION_COUNT];
1000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int i = 0;
1010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int j = 0;
1020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    // sort the sections based on id
1030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    while (i < INCIDENT_SECTION_COUNT) {
1040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        IncidentSection curr = INCIDENT_SECTIONS[i];
1050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        for (int k = 0; k < j; k++) {
1060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (curr.id > sections[k].id) {
1070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                continue;
1080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            IncidentSection tmp = curr;
1100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            curr = sections[k];
1110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            sections[k] = tmp;
1120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        sections[j] = curr;
1140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        i++;
1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        j++;
1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fprintf(out, "available sections:\n");
1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    for (int i = 0; i < INCIDENT_SECTION_COUNT; ++i) {
1200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        fprintf(out, "id: %4d, name: %s\n", sections[i].id, sections[i].name);
1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin// ================================================================================
1251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic IncidentSection const*
1261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratofind_section(const char* name)
1271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t low = 0;
1291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t high = INCIDENT_SECTION_COUNT - 1;
1301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while (low <= high) {
1321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        size_t mid = (low + high) >> 1;
1331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        IncidentSection const* section = INCIDENT_SECTIONS + mid;
1341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        int cmp = strcmp(section->name, name);
1361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (cmp < 0) {
1371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            low = mid + 1;
1381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else if (cmp > 0) {
1391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            high = mid - 1;
1401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
1411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return section;
1421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return NULL;
1451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
1480f0471623e91c202fb7381a050cc331572fb439fYi Jinstatic int
1490f0471623e91c202fb7381a050cc331572fb439fYi Jinget_dest(const char* arg)
1500f0471623e91c202fb7381a050cc331572fb439fYi Jin{
151b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    if (strcmp(arg, "L") == 0
152b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin        || strcmp(arg, "LOCAL") == 0) {
153b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin      return DEST_LOCAL;
154b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    }
155b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    if (strcmp(arg, "E") == 0
156b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin        || strcmp(arg, "EXPLICIT") == 0) {
157b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin      return DEST_EXPLICIT;
158b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    }
159b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    if (strcmp(arg, "A") == 0
160b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin        || strcmp(arg, "AUTO") == 0
161b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin        || strcmp(arg, "AUTOMATIC") == 0) {
162b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin      return DEST_AUTOMATIC;
163b8344dc72fde9386cdecbb1aa8a47f1e8e430111Yi Jin    }
1640f0471623e91c202fb7381a050cc331572fb439fYi Jin    return -1; // return the default value
1650f0471623e91c202fb7381a050cc331572fb439fYi Jin}
1660f0471623e91c202fb7381a050cc331572fb439fYi Jin
1670f0471623e91c202fb7381a050cc331572fb439fYi Jin// ================================================================================
1681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic void
1691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousage(FILE* out)
1701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "usage: incident OPTIONS [SECTION...]\n");
1721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "Takes an incident report.\n");
1741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "OPTIONS\n");
1761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -b           (default) print the report to stdout (in proto format)\n");
1771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -d           send the report into dropbox\n");
1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fprintf(out, "  -l           list available sections\n");
1790f0471623e91c202fb7381a050cc331572fb439fYi Jin    fprintf(out, "  -p           privacy spec, LOCAL, EXPLICIT or AUTOMATIC\n");
1801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  SECTION     the field numbers of the incident report fields to include\n");
1821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoint
1861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratomain(int argc, char** argv)
1871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Status status;
1891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    IncidentReportArgs args;
1901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    enum { DEST_DROPBOX, DEST_STDOUT } destination = DEST_STDOUT;
1910f0471623e91c202fb7381a050cc331572fb439fYi Jin    int dest = -1; // default
1921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Parse the args
1941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int opt;
1950f0471623e91c202fb7381a050cc331572fb439fYi Jin    while ((opt = getopt(argc, argv, "bhdlp:")) != -1) {
1961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        switch (opt) {
1971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'h':
1981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stdout);
1991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
2000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            case 'l':
2010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                section_list(stdout);
2020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                return 0;
2030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            case 'b':
2040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                destination = DEST_STDOUT;
2050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                break;
2061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'd':
2071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                destination = DEST_DROPBOX;
2081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                break;
2090f0471623e91c202fb7381a050cc331572fb439fYi Jin            case 'p':
2100f0471623e91c202fb7381a050cc331572fb439fYi Jin                dest = get_dest(optarg);
2110f0471623e91c202fb7381a050cc331572fb439fYi Jin                break;
2121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            default:
2131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stderr);
2141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 1;
2151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (optind == argc) {
2191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        args.setAll(true);
2201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
2211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        for (int i=optind; i<argc; i++) {
2221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            const char* arg = argv[i];
2231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            char* end;
2241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (arg[0] != '\0') {
2251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                int section = strtol(arg, &end, 0);
2261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                if (*end == '\0') {
2271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(section);
2281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                } else {
2291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    IncidentSection const* ic = find_section(arg);
2301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    if (ic == NULL) {
2311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        fprintf(stderr, "Invalid section: %s\n", arg);
2321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        return 1;
2331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    }
2341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(ic->id);
2351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                }
2361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
2371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2390f0471623e91c202fb7381a050cc331572fb439fYi Jin    args.setDest(dest);
2401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Start the thread pool.
2421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<ProcessState> ps(ProcessState::self());
2431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->startThreadPool();
2441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->giveThreadPoolName();
2451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Look up the service
2471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<IIncidentManager> service = interface_cast<IIncidentManager>(
2481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            defaultServiceManager()->getService(android::String16("incident")));
2491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (service == NULL) {
2501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        fprintf(stderr, "Couldn't look up the incident service\n");
2511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return 1;
2521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Construct the stream
2551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int fds[2];
2561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    pipe(fds);
2571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd readEnd(fds[0]);
2591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd writeEnd(fds[1]);
2601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (destination == DEST_STDOUT) {
2621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Call into the service
2631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        sp<StatusListener> listener(new StatusListener());
2641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncidentToStream(args, listener, writeEnd);
2651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
268603f3b3c4f22fd2c287d082da62f185e6b1cb004Yi Jin            return 1;
2691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Wait for the result and print out the data they send.
2721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        //IPCThreadState::self()->joinThreadPool();
2731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        while (true) {
2751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            int amt = splice(fds[0], NULL, STDOUT_FILENO, NULL, 4096, 0);
2761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "spliced %d bytes\n", amt);
2771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (amt < 0) {
2781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return errno;
2791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            } else if (amt == 0) {
2801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
2811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
2821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
2841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncident(args);
2851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
2871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 1;
2881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
2891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 0;
2901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
294