47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""Enter an allocated pseudo-terminal and invoke the real MMO TUI launcher."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import fcntl
|
||
|
|
import json
|
||
|
|
import os
|
||
|
|
import sys
|
||
|
|
import termios
|
||
|
|
|
||
|
|
from mmo_runtime import launch_interactive
|
||
|
|
|
||
|
|
|
||
|
|
def main() -> int:
|
||
|
|
try:
|
||
|
|
# Popen(start_new_session=True) made this process a session leader. The
|
||
|
|
# slave PTY descriptors were inherited, so explicitly claim the terminal
|
||
|
|
# before MMO performs normal foreground process-group handoff.
|
||
|
|
fcntl.ioctl(sys.stdin.fileno(), termios.TIOCSCTTY, 0)
|
||
|
|
os.tcsetpgrp(sys.stdin.fileno(), os.getpgrp())
|
||
|
|
initial = termios.tcgetattr(sys.stdin.fileno())
|
||
|
|
exit_code = launch_interactive(profile=sys.argv[1], cwd=sys.argv[2])
|
||
|
|
restored = termios.tcgetattr(sys.stdin.fileno())
|
||
|
|
print(
|
||
|
|
json.dumps(
|
||
|
|
{
|
||
|
|
"event": "launcher_returned",
|
||
|
|
"exit_code": exit_code,
|
||
|
|
"echo_enabled": bool(restored[3] & termios.ECHO),
|
||
|
|
"attributes_restored": restored == initial,
|
||
|
|
"pgrp": os.getpgrp(),
|
||
|
|
"foreground_pgrp": os.tcgetpgrp(sys.stdin.fileno()),
|
||
|
|
},
|
||
|
|
sort_keys=True,
|
||
|
|
),
|
||
|
|
flush=True,
|
||
|
|
)
|
||
|
|
return exit_code
|
||
|
|
except BaseException as exc:
|
||
|
|
print(json.dumps({"event": "launcher_error", "error": repr(exc)}), flush=True)
|
||
|
|
return 97
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
raise SystemExit(main())
|