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// ================================================================================
971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic IncidentSection const*
981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratofind_section(const char* name)
991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t low = 0;
1011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t high = INCIDENT_SECTION_COUNT - 1;
1021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while (low <= high) {
1041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        size_t mid = (low + high) >> 1;
1051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        IncidentSection const* section = INCIDENT_SECTIONS + mid;
1061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        int cmp = strcmp(section->name, name);
1081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (cmp < 0) {
1091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            low = mid + 1;
1101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else if (cmp > 0) {
1111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            high = mid - 1;
1121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
1131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return section;
1141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return NULL;
1171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
1201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic void
1211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousage(FILE* out)
1221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "usage: incident OPTIONS [SECTION...]\n");
1241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "Takes an incident report.\n");
1261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "OPTIONS\n");
1281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -b           (default) print the report to stdout (in proto format)\n");
1291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  -d           send the report into dropbox\n");
1301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "  SECTION     the field numbers of the incident report fields to include\n");
1321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fprintf(out, "\n");
1331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoint
1361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratomain(int argc, char** argv)
1371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Status status;
1391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    IncidentReportArgs args;
1401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    enum { DEST_DROPBOX, DEST_STDOUT } destination = DEST_STDOUT;
1411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Parse the args
1431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int opt;
1441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while ((opt = getopt(argc, argv, "bhd")) != -1) {
1451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        switch (opt) {
1461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'b':
1471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                destination = DEST_STDOUT;
1481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                break;
1491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'h':
1501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stdout);
1511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
1521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            case 'd':
1531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                destination = DEST_DROPBOX;
1541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                break;
1551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            default:
1561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                usage(stderr);
1571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 1;
1581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (optind == argc) {
1621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        args.setAll(true);
1631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
1641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        for (int i=optind; i<argc; i++) {
1651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            const char* arg = argv[i];
1661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            char* end;
1671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (arg[0] != '\0') {
1681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                int section = strtol(arg, &end, 0);
1691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                if (*end == '\0') {
1701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(section);
1711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                } else {
1721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    IncidentSection const* ic = find_section(arg);
1731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    if (ic == NULL) {
1741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        fprintf(stderr, "Invalid section: %s\n", arg);
1751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        return 1;
1761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    }
1771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    args.addSection(ic->id);
1781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                }
1791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
1801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Start the thread pool.
1861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<ProcessState> ps(ProcessState::self());
1871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->startThreadPool();
1881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ps->giveThreadPoolName();
1891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Look up the service
1911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<IIncidentManager> service = interface_cast<IIncidentManager>(
1921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            defaultServiceManager()->getService(android::String16("incident")));
1931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (service == NULL) {
1941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        fprintf(stderr, "Couldn't look up the incident service\n");
1951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return 1;
1961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Construct the stream
1991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int fds[2];
2001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    pipe(fds);
2011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd readEnd(fds[0]);
2031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_fd writeEnd(fds[1]);
2041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (destination == DEST_STDOUT) {
2061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Call into the service
2071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        sp<StatusListener> listener(new StatusListener());
2081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncidentToStream(args, listener, writeEnd);
2091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
2121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // Wait for the result and print out the data they send.
2151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        //IPCThreadState::self()->joinThreadPool();
2161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        while (true) {
2181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            int amt = splice(fds[0], NULL, STDOUT_FILENO, NULL, 4096, 0);
2191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "spliced %d bytes\n", amt);
2201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (amt < 0) {
2211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return errno;
2221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            } else if (amt == 0) {
2231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return 0;
2241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
2251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
2271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        status = service->reportIncident(args);
2281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (!status.isOk()) {
2291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
2301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 1;
2311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
2321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return 0;
2331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
2341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
237