import logging
import os
import glob
+import fcntl
+import struct
import tools.config
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"
]
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
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())
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")