]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/helpers/drivers.py
Makefile: Allow overriding directories without having to know the DESTDIR
[waydroid.git] / tools / helpers / drivers.py
index 69ee56a0febd180e6ed711c6bd85a8c9145dee74..b04877d6577e1ab489f3609653f6aaeb77e2af4f 100644 (file)
@@ -3,6 +3,8 @@
 import logging
 import os
 import glob
+import fcntl
+import struct
 import tools.config
 import tools.helpers.run
 
@@ -10,16 +12,19 @@ import tools.helpers.run
 BINDER_DRIVERS = [
     "anbox-binder",
     "puddlejumper",
+    "bonder",
     "binder"
 ]
 VNDBINDER_DRIVERS = [
     "anbox-vndbinder",
     "vndpuddlejumper",
+    "vndbonder",
     "vndbinder"
 ]
 HWBINDER_DRIVERS = [
     "anbox-hwbinder",
     "hwpuddlejumper",
+    "hwbonder",
     "hwbinder"
 ]
 
@@ -33,6 +38,34 @@ def isBinderfsLoaded(args):
 
     return False
 
+def allocBinderNodes(args, binder_dev_nodes):
+    NRBITS = 8
+    TYPEBITS = 8
+    SIZEBITS = 14
+    NRSHIFT = 0
+    TYPESHIFT = NRSHIFT + NRBITS
+    SIZESHIFT = TYPESHIFT + TYPEBITS
+    DIRSHIFT = SIZESHIFT + SIZEBITS
+    WRITE = 0x1
+    READ = 0x2
+
+    def IOC(direction, _type, nr, size):
+        return (direction << DIRSHIFT) | (_type << TYPESHIFT) | (nr << NRSHIFT) | (size << SIZESHIFT)
+
+    def IOWR(_type, nr, size):
+        return IOC(READ|WRITE, _type, nr, size)
+
+    BINDER_CTL_ADD = IOWR(98, 1, 264)
+    binderctrlfd = open('/dev/binderfs/binder-control','rb')
+
+    for node in binder_dev_nodes:
+        node_struct = struct.pack(
+            '256sII', bytes(node, 'utf-8'), 0, 0)
+        try:
+            fcntl.ioctl(binderctrlfd.fileno(), BINDER_CTL_ADD, node_struct)
+        except FileExistsError:
+            pass
+
 def probeBinderDriver(args):
     binder_dev_nodes = []
     has_binder = False
@@ -57,30 +90,30 @@ def probeBinderDriver(args):
     if len(binder_dev_nodes) > 0:
         if not isBinderfsLoaded(args):
             devices = ','.join(binder_dev_nodes)
-            command = ["modprobe", "binder_linux", "devices=\"{}\"".format(devices)]
-            output = tools.helpers.run.root(args, command, check=False, output_return=True)
+            command = ["modprobe", "binder_linux",
+                       "devices=\"{}\"".format(devices)]
+            output = tools.helpers.run.user(args, command, check=False, output_return=True)
             if output:
-                logging.error("Failed to load binder driver for devices: {}".format(devices))
+                logging.error("Failed to load binder driver")
                 logging.error(output.strip())
 
         if isBinderfsLoaded(args):
             command = ["mkdir", "-p", "/dev/binderfs"]
-            tools.helpers.run.root(args, command, check=False)
+            tools.helpers.run.user(args, command, check=False)
             command = ["mount", "-t", "binder", "binder", "/dev/binderfs"]
-            tools.helpers.run.root(args, command, check=False)
+            tools.helpers.run.user(args, command, check=False)
+            allocBinderNodes(args, binder_dev_nodes)
             command = ["ln", "-s"]
             command.extend(glob.glob("/dev/binderfs/*"))
             command.append("/dev/")
-            tools.helpers.run.root(args, command, check=False)
-        else: 
-            return -1
+            tools.helpers.run.user(args, command, check=False)
 
     return 0
 
 def probeAshmemDriver(args):
     if not os.path.exists("/dev/ashmem"):
         command = ["modprobe", "ashmem_linux"]
-        output = tools.helpers.run.root(args, command, check=False, output_return=True)
+        output = tools.helpers.run.user(args, command, check=False, output_return=True)
         if output:
             logging.error("Failed to load ashmem driver")
             logging.error(output.strip())
@@ -143,3 +176,6 @@ def loadBinderNodes(args):
     args.BINDER_DRIVER = cfg["waydroid"]["binder"]
     args.VNDBINDER_DRIVER = cfg["waydroid"]["vndbinder"]
     args.HWBINDER_DRIVER = cfg["waydroid"]["hwbinder"]
+    # These might not be in cfg on package upgrade
+    args.BINDER_PROTOCOL = cfg["waydroid"].get("binder_protocol")
+    args.SERVICE_MANAGER_PROTOCOL = cfg["waydroid"].get("service_manager_protocol")