diff options
Diffstat (limited to 'devtools/client/shared/remote-debugging/adb/xpcshell/adb.py')
-rw-r--r-- | devtools/client/shared/remote-debugging/adb/xpcshell/adb.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/devtools/client/shared/remote-debugging/adb/xpcshell/adb.py b/devtools/client/shared/remote-debugging/adb/xpcshell/adb.py new file mode 100644 index 0000000000..4b720a1f86 --- /dev/null +++ b/devtools/client/shared/remote-debugging/adb/xpcshell/adb.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +""" +A fake ADB binary +""" + +import os +import socketserver +import sys + +HOST = "127.0.0.1" +PORT = 5037 + + +class ADBRequestHandler(socketserver.BaseRequestHandler): + def sendData(self, data): + header = "OKAY%04x" % len(data) + all_data = header + data + total_length = len(all_data) + sent_length = 0 + # Make sure send all data to the client. + # Though the data length here is pretty small but sometimes when the + # client is on heavy load (e.g. MOZ_CHAOSMODE) we can't send the whole + # data at once. + while sent_length < total_length: + sent = self.request.send(all_data[sent_length:].encode("utf-8", "replace")) + sent_length = sent_length + sent + + def handle(self): + while True: + data = self.request.recv(4096).decode("utf-8", "replace") + if "host:kill" in data: + self.sendData("") + # Implicitly close all open sockets by exiting the program. + # This should be done ASAP, because upon receiving the OKAY, + # the client expects adb to have released the server's port. + os._exit(0) + break + elif "host:version" in data: + self.sendData("001F") + self.request.close() + break + elif "host:track-devices" in data: + self.sendData("1234567890\tdevice") + break + + +class ADBServer(socketserver.TCPServer): + def __init__(self, server_address): + # Create a socketserver with bind_and_activate 'False' to set + # allow_reuse_address before binding. + socketserver.TCPServer.__init__( + self, server_address, ADBRequestHandler, bind_and_activate=False + ) + + +if len(sys.argv) == 2 and sys.argv[1] == "start-server": + # daemonize + if os.fork() > 0: + sys.exit(0) + os.setsid() + if os.fork() > 0: + sys.exit(0) + + server = ADBServer((HOST, PORT)) + server.allow_reuse_address = True + server.server_bind() + server.server_activate() + server.serve_forever() |