From f2228b12e4e4c8a39b9ae242e98c2dc7173f346c Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Mon, 24 Jun 2013 15:32:46 +0200 Subject: Added 'doppelganger' daemon. It provides the Android permission and scheduling policy services. These services are normally provided by Zygote. Change-Id: I11eeba92b6b12e26b45baa5871a6fd7c2058b6c6 Reviewed-by: Eirik Aavitsland --- src/doppelganger/doppelganger.pro | 18 ++++++++ src/doppelganger/main.cpp | 14 +++++++ src/doppelganger/permissioncontroller.cpp | 20 +++++++++ src/doppelganger/permissioncontroller.h | 17 ++++++++ src/doppelganger/schedulingpolicyservice.cpp | 61 ++++++++++++++++++++++++++++ src/doppelganger/schedulingpolicyservice.h | 21 ++++++++++ 6 files changed, 151 insertions(+) create mode 100644 src/doppelganger/doppelganger.pro create mode 100644 src/doppelganger/main.cpp create mode 100644 src/doppelganger/permissioncontroller.cpp create mode 100644 src/doppelganger/permissioncontroller.h create mode 100644 src/doppelganger/schedulingpolicyservice.cpp create mode 100644 src/doppelganger/schedulingpolicyservice.h (limited to 'src/doppelganger') diff --git a/src/doppelganger/doppelganger.pro b/src/doppelganger/doppelganger.pro new file mode 100644 index 0000000..fc337df --- /dev/null +++ b/src/doppelganger/doppelganger.pro @@ -0,0 +1,18 @@ +QT -= core gui + +TARGET = doppelganger + +LIBS += -lutils -lbinder -lcutils \ + -L$${ANDROID_PRODUCT_OUT}/obj/STATIC_LIBRARIES/libscheduling_policy_intermediates -lscheduling_policy + +TEMPLATE = app + +SOURCES += main.cpp \ + permissioncontroller.cpp \ + schedulingpolicyservice.cpp + +HEADERS += \ + permissioncontroller.h \ + schedulingpolicyservice.h + +load(qt_tool) diff --git a/src/doppelganger/main.cpp b/src/doppelganger/main.cpp new file mode 100644 index 0000000..9255576 --- /dev/null +++ b/src/doppelganger/main.cpp @@ -0,0 +1,14 @@ +#include + +#include "permissioncontroller.h" +#include "schedulingpolicyservice.h" + +using namespace android; + +int main(int, char *[]) +{ + sp proc(ProcessState::self()); + SchedulingPolicyService::instantiate(); + PermissionController::instantiate(); + IPCThreadState::self()->joinThreadPool(); +} diff --git a/src/doppelganger/permissioncontroller.cpp b/src/doppelganger/permissioncontroller.cpp new file mode 100644 index 0000000..06d1729 --- /dev/null +++ b/src/doppelganger/permissioncontroller.cpp @@ -0,0 +1,20 @@ +#include "permissioncontroller.h" + +#include + +using namespace android; + +PermissionController::PermissionController() +{ +} + +void PermissionController::instantiate() +{ + defaultServiceManager()->addService(String16("permission"), new PermissionController); +} + +bool PermissionController::checkPermission(const String16 &, int32_t, int32_t) +{ + // just bypass any permission + return true; +} diff --git a/src/doppelganger/permissioncontroller.h b/src/doppelganger/permissioncontroller.h new file mode 100644 index 0000000..74aeb10 --- /dev/null +++ b/src/doppelganger/permissioncontroller.h @@ -0,0 +1,17 @@ +#ifndef PERMISSIONCONTROLLER_H +#define PERMISSIONCONTROLLER_H + +#include + +class PermissionController : public android::BnPermissionController +{ +public: + static void instantiate(); + + bool checkPermission(const android::String16 &permission, int32_t pid, int32_t uid); + +private: + PermissionController(); +}; + +#endif // PERMISSIONCONTROLLER_H diff --git a/src/doppelganger/schedulingpolicyservice.cpp b/src/doppelganger/schedulingpolicyservice.cpp new file mode 100644 index 0000000..641ddc4 --- /dev/null +++ b/src/doppelganger/schedulingpolicyservice.cpp @@ -0,0 +1,61 @@ +#include "schedulingpolicyservice.h" + +#include +#include +#include +#include + +using namespace android; + +enum { + REQUEST_PRIORITY_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION +}; + +#define PRIORITY_MIN 1 +#define PRIORITY_MAX 2 + +SchedulingPolicyService::SchedulingPolicyService() +{ +} + +void SchedulingPolicyService::instantiate() +{ + defaultServiceManager()->addService(String16("scheduling_policy"), new SchedulingPolicyService); +} + +status_t SchedulingPolicyService::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + switch (code) { + case REQUEST_PRIORITY_TRANSACTION: { + CHECK_INTERFACE(ISchedulingPolicyService, data, reply); + int32_t pid = data.readInt32(); + int32_t tid = data.readInt32(); + int32_t prio = data.readInt32(); + int res = requestPriority(pid, tid, prio); + reply->writeNoException(); + reply->writeInt32(res); + return NO_ERROR; + } break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} + +int SchedulingPolicyService::requestPriority(int32_t pid, int32_t tid, int32_t prio) +{ + if (prio < PRIORITY_MIN || prio > PRIORITY_MAX) + return PERMISSION_DENIED; + + int res = set_sched_policy(tid, IPCThreadState::self()->getCallingPid() == pid ? SP_AUDIO_SYS + : SP_AUDIO_APP); + if (res != NO_ERROR) + return PERMISSION_DENIED; + + struct sched_param param; + param.sched_priority = prio; + res = sched_setscheduler(tid, SCHED_FIFO, ¶m); + if (res) + return PERMISSION_DENIED; + + return OK; +} diff --git a/src/doppelganger/schedulingpolicyservice.h b/src/doppelganger/schedulingpolicyservice.h new file mode 100644 index 0000000..377265d --- /dev/null +++ b/src/doppelganger/schedulingpolicyservice.h @@ -0,0 +1,21 @@ +#ifndef SCHEDULINGPOLICYSERVICE_H +#define SCHEDULINGPOLICYSERVICE_H + +#include +#include + +class SchedulingPolicyService : public android::BnSchedulingPolicyService +{ +public: + static void instantiate(); + + android::status_t onTransact(uint32_t code, const android::Parcel &data, + android::Parcel *reply, uint32_t flags); + + int requestPriority(int32_t pid, int32_t tid, int32_t prio); + +private: + SchedulingPolicyService(); +}; + +#endif // SCHEDULINGPOLICYSERVICE_H -- cgit v1.2.3