|
12 | 12 | wdr, wdw = os.pipe() |
13 | 13 | rdr, rdw = os.pipe() |
14 | 14 |
|
| 15 | +def readfull(fd: int, l: int): |
| 16 | + b = bytes() |
| 17 | + while len(b) < l: |
| 18 | + r = os.read(fd, l - len(b)) |
| 19 | + if len(r) <= 0: |
| 20 | + raise RuntimeError("unexpected read len: " + len(r)) |
| 21 | + b += r |
| 22 | + if len(b) != l: |
| 23 | + raise RuntimeError("written " + len(b) + "bytes expected " + l) |
| 24 | + return b |
| 25 | + |
| 26 | +def writefull(fd: int, buf: bytes): |
| 27 | + written: int = 0 |
| 28 | + while written >= len(buf): |
| 29 | + w = os.write(fd, buf[written:]) |
| 30 | + if w <= 0: |
| 31 | + raise RuntimeError("unexpected write result: " + w) |
| 32 | + if written != len(buf): |
| 33 | + raise RuntimeError("written " + written + "bytes expected " + len) |
| 34 | + return written |
| 35 | + |
15 | 36 | def redirectio(): |
16 | 37 | while(True): |
17 | 38 | stdin = sys.stdin.fileno() |
18 | | - messageType = int.from_bytes(os.read(stdin, 4), "big", signed=False) |
19 | | - os.write(rdw, messageType.to_bytes(4, sys.byteorder, signed=False)) |
20 | | - messageLength = int.from_bytes(os.read(stdin, 4), "big", signed=False) |
21 | | - message = os.read(stdin, messageLength) |
22 | | - encoded = codecs.decode(message, "utf-8").encode("utf_16")[2:] |
23 | | - os.write(rdw, len(encoded).to_bytes(4, sys.byteorder, signed=False)) |
24 | | - os.write(rdw, encoded) |
| 39 | + messageType = int.from_bytes(readfull(stdin, 4), "big", signed=False) |
| 40 | + writefull(rdw, messageType.to_bytes(4, sys.byteorder, signed=False)) |
| 41 | + messageLength = int.from_bytes(readfull(stdin, 4), "big", signed=False) |
| 42 | + rawmessage = readfull(stdin, messageLength) |
| 43 | + message = codecs.decode(rawmessage, "utf-8") |
| 44 | + if os.getenv("ACTIONS_RUNNER_WORKER_DEBUG", "0") != "0": |
| 45 | + print("Message Received") |
| 46 | + print("Type:", messageType) |
| 47 | + print("================") |
| 48 | + print(message) |
| 49 | + print("================") |
| 50 | + encoded = message.encode("utf_16")[2:] |
| 51 | + writefull(rdw, len(encoded).to_bytes(4, sys.byteorder, signed=False)) |
| 52 | + writefull(rdw, encoded) |
25 | 53 |
|
26 | 54 | threading.Thread(target=redirectio, daemon=True).start() |
27 | 55 |
|
|
0 commit comments