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 "incidentd"
181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include "IncidentService.h"
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include "Reporter.h"
221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <binder/IPCThreadState.h>
241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <binder/IServiceManager.h>
251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <cutils/log.h>
261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <private/android_filesystem_config.h>
271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <utils/Looper.h>
281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <unistd.h>
301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratousing namespace android;
321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoenum {
341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    WHAT_RUN_REPORT = 1,
351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    WHAT_SEND_BACKLOG_TO_DROPBOX = 2
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato//#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL * 60 * 5)
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL)
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoString16 const DUMP_PERMISSION("android.permission.DUMP");
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoString16 const USAGE_STATS_PERMISSION("android.permission.PACKAGE_USAGE_STATS");
441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatic Status
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratocheckIncidentPermissions()
471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (!checkCallingPermission(DUMP_PERMISSION)) {
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        ALOGW("Calling pid %d and uid %d does not have permission: android.permission.DUMP",
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid());
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return Status::fromExceptionCode(Status::EX_SECURITY,
521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                "Calling process does not have permission: android.permission.DUMP");
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (!checkCallingPermission(USAGE_STATS_PERMISSION)) {
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        ALOGW("Calling pid %d and uid %d does not have permission: android.permission.USAGE_STATS",
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid());
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return Status::fromExceptionCode(Status::EX_SECURITY,
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                "Calling process does not have permission: android.permission.USAGE_STATS");
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportRequestQueue::ReportRequestQueue()
661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportRequestQueue::~ReportRequestQueue()
701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportRequestQueue::addRequest(const sp<ReportRequest>& request)
751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_lock<mutex> lock(mLock);
771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mQueue.push_back(request);
781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratosp<ReportRequest>
811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportRequestQueue::getNextRequest()
821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_lock<mutex> lock(mLock);
841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (mQueue.empty()) {
851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return NULL;
861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        sp<ReportRequest> front(mQueue.front());
881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        mQueue.pop_front();
891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return front;
901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue)
961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    :mBacklogDelay(DEFAULT_BACKLOG_DELAY_NS),
971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mHandlerLooper(handlerLooper),
981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mQueue(queue)
991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::~ReportHandler()
1031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::handleMessage(const Message& message)
1081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    switch (message.what) {
1101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        case WHAT_RUN_REPORT:
1111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            run_report();
1121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            break;
1131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        case WHAT_SEND_BACKLOG_TO_DROPBOX:
1141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            send_backlog_to_dropbox();
1151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            break;
1161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::scheduleRunReport(const sp<ReportRequest>& request)
1211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mQueue->addRequest(request);
1231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandlerLooper->removeMessages(this, WHAT_RUN_REPORT);
1241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandlerLooper->sendMessage(this, Message(WHAT_RUN_REPORT));
1251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::scheduleSendBacklogToDropbox()
1291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    unique_lock<mutex> lock(mLock);
1311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mBacklogDelay = DEFAULT_BACKLOG_DELAY_NS;
1321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    schedule_send_backlog_to_dropbox_locked();
1331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::schedule_send_backlog_to_dropbox_locked()
1371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandlerLooper->removeMessages(this, WHAT_SEND_BACKLOG_TO_DROPBOX);
1391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandlerLooper->sendMessageDelayed(mBacklogDelay, this,
1401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            Message(WHAT_SEND_BACKLOG_TO_DROPBOX));
1411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::run_report()
1451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<Reporter> reporter = new Reporter();
1471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Merge all of the requests into one that has all of the
1491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // requested fields.
1501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while (true) {
1511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        sp<ReportRequest> request = mQueue->getNextRequest();
1521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (request == NULL) {
1531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            break;
1541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        reporter->batch.add(request);
1561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        reporter->args.merge(request->args);
1571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Take the report, which might take a while. More requests might queue
1601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // up while we're doing this, and we'll handle them in their next batch.
1611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // TODO: We should further rate-limit the reports to no more than N per time-period.
1621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Reporter::run_report_status_t reportStatus = reporter->runReport();
1631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (reportStatus == Reporter::REPORT_NEEDS_DROPBOX) {
1641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        unique_lock<mutex> lock(mLock);
1651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        schedule_send_backlog_to_dropbox_locked();
1661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratovoid
1701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoReportHandler::send_backlog_to_dropbox()
1711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (Reporter::upload_backlog() == Reporter::REPORT_NEEDS_DROPBOX) {
1731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        // There was a failure. Exponential backoff.
1741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        unique_lock<mutex> lock(mLock);
1751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        mBacklogDelay *= 2;
1761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        ALOGI("Error sending to dropbox. Trying again in %lld minutes",
1771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                (mBacklogDelay / (1000000000LL * 60)));
1781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        schedule_send_backlog_to_dropbox_locked();
1791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    } else {
1801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        mBacklogDelay = DEFAULT_BACKLOG_DELAY_NS;
1811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
1851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoIncidentService::IncidentService(const sp<Looper>& handlerLooper)
1861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    :mQueue(new ReportRequestQueue())
1871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandler = new ReportHandler(handlerLooper, mQueue);
1891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoIncidentService::~IncidentService()
1921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
1961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoIncidentService::reportIncident(const IncidentReportArgs& args)
1971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
1981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ALOGI("reportIncident");
1991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Status status = checkIncidentPermissions();
2011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (!status.isOk()) {
2021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return status;
2031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandler->scheduleRunReport(new ReportRequest(args, NULL, -1));
2061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
2081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
2091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
2111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoIncidentService::reportIncidentToStream(const IncidentReportArgs& args,
2121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            const sp<IIncidentReportStatusListener>& listener, const unique_fd& stream)
2131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
2141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ALOGI("reportIncidentToStream");
2151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    Status status = checkIncidentPermissions();
2171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (!status.isOk()) {
2181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return status;
2191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int fd = dup(stream.get());
2221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (fd < 0) {
2231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return Status::fromStatusT(-errno);
2241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandler->scheduleRunReport(new ReportRequest(args, listener, fd));
2271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
2291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
2301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoStatus
2321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoIncidentService::systemRunning()
2331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
2341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    if (IPCThreadState::self()->getCallingUid() != AID_SYSTEM) {
2351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        return Status::fromExceptionCode(Status::EX_SECURITY,
2361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                "Only system uid can call systemRunning");
2371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // When system_server is up and running, schedule the dropbox task to run.
2401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mHandler->scheduleSendBacklogToDropbox();
2411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return Status::ok();
2431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
2441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
245