summaryrefslogtreecommitdiffstats
path: root/src/doppelganger
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@digia.com>2013-06-24 15:32:46 +0200
committerEirik Aavitsland <eirik.aavitsland@digia.com>2013-08-28 10:33:39 +0300
commitf2228b12e4e4c8a39b9ae242e98c2dc7173f346c (patch)
tree796373e122aacc3d9e94c5b9af0fb9a572ad4ce9 /src/doppelganger
parent1862fdee4f25fa0a4c57bcec8ea8568a8d9c4762 (diff)
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 <eirik.aavitsland@digia.com>
Diffstat (limited to 'src/doppelganger')
-rw-r--r--src/doppelganger/doppelganger.pro18
-rw-r--r--src/doppelganger/main.cpp14
-rw-r--r--src/doppelganger/permissioncontroller.cpp20
-rw-r--r--src/doppelganger/permissioncontroller.h17
-rw-r--r--src/doppelganger/schedulingpolicyservice.cpp61
-rw-r--r--src/doppelganger/schedulingpolicyservice.h21
6 files changed, 151 insertions, 0 deletions
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 <binder/IPCThreadState.h>
+
+#include "permissioncontroller.h"
+#include "schedulingpolicyservice.h"
+
+using namespace android;
+
+int main(int, char *[])
+{
+ sp<ProcessState> 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 <binder/IServiceManager.h>
+
+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 <binder/IPermissionController.h>
+
+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 <binder/IServiceManager.h>
+#include <binder/IPCThreadState.h>
+#include <cutils/sched_policy.h>
+#include <sched.h>
+
+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, &param);
+ 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 <frameworks/av/services/audioflinger/ISchedulingPolicyService.h>
+#include <binder/Parcel.h>
+
+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