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