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