Devices: each headset its own SSH connection, and each server keeps its own headset (review round 27)

ssh's %C hashes only address, user and port, so two headsets reached at one
address shared a ControlMaster and one's commands could run on the other: the
ControlPath now names the headset. Another Frame Control server choosing a
different headset no longer moves this one's commands mid-install.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
saphidandClaude Opus 5.5 committed 2026-09-29 07:52:28 +10:00
1 parent c5a614d989
commit 409e328880
6 files changed
+52 -7

No files matched your search

+5 -2
View File
@@ -56,12 +56,15 @@ def cache_dir(*parts):
return base.joinpath(*parts)
def control_path():
def control_path(tag="x"):
"""ssh ControlPath for the shared connection, or None where it isn't supported.
`tag` names the headset: ssh's %C hashes only the address, user and port, so two
headsets reached at the same address (one of them moved) would otherwise share a
connection, and one's commands would run on the other.
/tmp, not $TMPDIR: macOS's per-user temp path overflows the unix socket path limit.
"""
return f"/tmp/frame-ui-{os.getuid()}-%C" if MUX else None
return f"/tmp/frame-ui-{os.getuid()}-{tag}-%C" if MUX else None
def which(name, *extra):