Add vndservicemanager.
vndservicemanager is the context manager for
binder services that are exclusively used from
the vendor binder domain, "/dev/vndbinder";
these services can only be registered and accessed
by vendor processes.
To facilitate code re-use, vndservicemanager
is just framework servicemanager accessing the
vendor binder devnode.
Bug: 36052864
Test: modified binder_test to use /dev/vndbinder
Change-Id: Iac19a1180321a5be78d7be5ceb4ba211c593dc47
diff --git a/cmds/servicemanager/Android.bp b/cmds/servicemanager/Android.bp
index dc8e675..5431233 100644
--- a/cmds/servicemanager/Android.bp
+++ b/cmds/servicemanager/Android.bp
@@ -34,3 +34,15 @@
shared_libs: ["libcutils", "libselinux"],
init_rc: ["servicemanager.rc"],
}
+
+cc_binary {
+ name: "vndservicemanager",
+ defaults: ["servicemanager_flags"],
+ proprietary: true,
+ srcs: [
+ "service_manager.c",
+ "binder.c",
+ ],
+ shared_libs: ["libcutils", "libselinux"],
+ init_rc: ["vndservicemanager.rc"],
+}
diff --git a/cmds/servicemanager/bctest.c b/cmds/servicemanager/bctest.c
index 6466654..354df67 100644
--- a/cmds/servicemanager/bctest.c
+++ b/cmds/servicemanager/bctest.c
@@ -62,7 +62,7 @@
uint32_t svcmgr = BINDER_SERVICE_MANAGER;
uint32_t handle;
- bs = binder_open(128*1024);
+ bs = binder_open("/dev/binder", 128*1024);
if (!bs) {
fprintf(stderr, "failed to open binder driver\n");
return -1;
diff --git a/cmds/servicemanager/binder.c b/cmds/servicemanager/binder.c
index 753aeb5..93a18fc 100644
--- a/cmds/servicemanager/binder.c
+++ b/cmds/servicemanager/binder.c
@@ -94,7 +94,7 @@
size_t mapsize;
};
-struct binder_state *binder_open(size_t mapsize)
+struct binder_state *binder_open(const char* driver, size_t mapsize)
{
struct binder_state *bs;
struct binder_version vers;
@@ -105,10 +105,10 @@
return NULL;
}
- bs->fd = open("/dev/binder", O_RDWR | O_CLOEXEC);
+ bs->fd = open(driver, O_RDWR | O_CLOEXEC);
if (bs->fd < 0) {
- fprintf(stderr,"binder: cannot open device (%s)\n",
- strerror(errno));
+ fprintf(stderr,"binder: cannot open %s (%s)\n",
+ driver, strerror(errno));
goto fail_open;
}
diff --git a/cmds/servicemanager/binder.h b/cmds/servicemanager/binder.h
index 881ab07..c95b33f 100644
--- a/cmds/servicemanager/binder.h
+++ b/cmds/servicemanager/binder.h
@@ -46,7 +46,7 @@
struct binder_io *msg,
struct binder_io *reply);
-struct binder_state *binder_open(size_t mapsize);
+struct binder_state *binder_open(const char* driver, size_t mapsize);
void binder_close(struct binder_state *bs);
/* initiate a blocking binder call
diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c
index 43c4c8b..5d44e87 100644
--- a/cmds/servicemanager/service_manager.c
+++ b/cmds/servicemanager/service_manager.c
@@ -360,14 +360,21 @@
return 0;
}
-int main()
+int main(int argc, char** argv)
{
struct binder_state *bs;
union selinux_callback cb;
+ char *driver;
- bs = binder_open(128*1024);
+ if (argc > 1) {
+ driver = argv[1];
+ } else {
+ driver = "/dev/binder";
+ }
+
+ bs = binder_open(driver, 128*1024);
if (!bs) {
- ALOGE("failed to open binder driver\n");
+ ALOGE("failed to open binder driver %s\n", driver);
return -1;
}
diff --git a/cmds/servicemanager/vndservicemanager.rc b/cmds/servicemanager/vndservicemanager.rc
new file mode 100644
index 0000000..d5ddaaf
--- /dev/null
+++ b/cmds/servicemanager/vndservicemanager.rc
@@ -0,0 +1,6 @@
+service vndservicemanager /vendor/bin/vndservicemanager /dev/vndbinder
+ class core
+ user system
+ group system readproc
+ writepid /dev/cpuset/system-background/tasks
+