https://gitlab.synchro.net/main/sbbs/-/commit/323c869468a82573cb76462c
Modified Files:
src/doors/syncconquer/door/door_io.c src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke_input.c src/doors/syncmoo1/syncmoo1_io.c src/doors/syncretro/syncretro_io.c src/doors/termgfx/termgfx_plat.c termgfx_plat.h termgfx_termio.c
Log Message:
doors: one raw-mode implementation, in termgfx, for every door
A door that reads a terminal rather than a socket has to establish the line discipline itself. A pty arrives cooked unless something raws it, and whether that has happened depends on the host: Synchronet raws an XTRN_STDIO door's
pty only when the program is registered untranslated (EX_BIN), other BBSes differ, and a door started from a shell gets whatever the shell had. Left cooked, a keystroke is held back until Enter, echoed over the frame, and
Ctrl-C kills the door instead of arriving as a key.
Only syncdoom did this, in a private copy. Move it behind termgfx_plat_tty_raw() / termgfx_plat_tty_restore() -- a no-op on a socket, a no-op on Windows, and self-restoring via atexit() so a door that exits without an orderly shutdown still hands the terminal back as it found it -- and call
it from termgfx's own I/O seam and from the four doors that resolve their descriptors themselves.
The VMIN=1 that 92c2fd33bd (gratis-3-expand, 2026-08-17) gave the syncdoom
copy is the part most worth having in one place: VMIN=0 makes a tty read() return 0 when nothing is pending, and every one of these doors reads a 0 as
the EOF that means the client dropped.
Co-Authored-By: Claude Opus 5 (1M context) <
noreply@anthropic.com>
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net