main.cpp revision 603f3b3c4f22fd2c287d082da62f185e6b1cb004
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()); 243603f3b3c4f22fd2c287d082da62f185e6b1cb004Yi Jin return 1; 2441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 2451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 2461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato // Wait for the result and print out the data they send. 2471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato //IPCThreadState::self()->joinThreadPool(); 2481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 2491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato while (true) { 2501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato int amt = splice(fds[0], NULL, STDOUT_FILENO, NULL, 4096, 0); 2511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato fprintf(stderr, "spliced %d bytes\n", amt); 2521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato if (amt < 0) { 2531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return errno; 2541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } else if (amt == 0) { 2551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return 0; 2561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 2571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 2581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } else { 2591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato status = service->reportIncident(args); 2601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato if (!status.isOk()) { 2611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); 2621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return 1; 2631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } else { 2641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return 0; 2651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 2661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 2671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 2681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato} 269