• src/doors/syncconquer/door/door_io.c src/doors/syncdoom/syncdoom.c src

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Monday, August 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) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net