Subj : src/doors/syncconquer/door/door_io.c src/doors/syncdoom/syncdoom.c src To : Git commit to main/sbbs/master From : Rob Swindell (on Debian Linux) Date : Mon Aug 17 2026 03:14:46 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) --- SBBSecho 3.37-Linux * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705) .