• src/doors/syncretro/syncretro_title.c syncretro_title.h test_title.c x

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sat Aug 1 00:24:30 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/5bff248f84f5f74e4f3718eb
    Added Files:
    src/doors/syncretro/syncretro_title.c syncretro_title.h test_title.c xtrn/syncarcade/console.ini xtrn/syncivision/console.ini xtrn/syncnes/console.ini
    Modified Files:
    exec/load/syncretro_lib.js syncretro_lobby.js src/doors/syncretro/CMakeLists.txt main.c retro_core.c retro_core.h syncretro.h syncretro_config.c syncretro_door.c xtrn/syncarcade/lobby.js xtrn/syncivision/lobby.js xtrn/syncnes/lobby.js
    Log Message:
    syncretro: keep the door's command line inside the 260-byte limit

    xtrn.cpp assembles an external program's command line into `fullcmdline[MAX_PATH + 1]` and SAFECOPY-truncates it there. MAX_PATH is
    4096 on *nix but 260 on Windows, so it is a PATH limit standing in for a command-line limit: a door whose arguments together run longer than any
    single path among them loses the tail of its line, and the argument lost
    is the last one -- the cartridge. The BBS logs the string it MEANT to
    run, so the log shows a cartridge's full path while the door reports it
    has no ROM. de1662c069 (exit-8-asylum, 2026-07-21) made that failure say
    so instead of happening in silence; this makes it stop happening.

    The lobby's line reached 277 characters for "Advanced D&D - Treasure of
    Tarmin (1982) (Mattel).zip" and 340 for the longest NES cartridge,
    against a budget of 260. Widening the buffer would only produce doors
    that cannot run on a stock v3.21 install, so instead everything that does
    not have to be on the line comes off it:

    - console.ini, new and shipped per console, holds name, short, core and
    profile. BOTH halves of the door read it -- the lobby, which no
    longer declares them, and the door binary, which until now was told
    all four on the command line. Deliberately not syncretro.ini: that
    file is the sysop's and must survive an upgrade untouched.

    - DOOR32.SYS, written by the lobby into the node directory, carries the
    connection, the alias and the time limit. The door finds it through
    $SBBSNODE with no argument, so it costs the line nothing. The alias
    mattered most: user-controlled text of up to 25 characters on the
    line meant whose account launched a cartridge helped decide whether
    that cartridge started at all.

    - -title is sent only for a curated games.ini name or a disambiguating
    publisher, neither of which a filename carries. Otherwise the door
    derives it: "Astrosmash (1981) (Mattel).int" -> "Astrosmash". The
    lobby's syncretro_parse_title() stays authoritative and richer; the C
    side handles the trailing year/publisher and dump markers only, and
    does not copy its ~100-word cataloging-tag tables.

    The core is now found by the door, from console.ini's name or as the one "*_libretro" in the door directory or its per-target sub-directory. The controller profile comes from console.ini too, with the core's
    library_name left as the last-resort inference for a door run by hand -- name-matching a core does not scale to a frontend meant to host any core.

    An explicit -core/-profile/-console/-s/-name still overrides all of it,
    and a drop file the door merely guessed at fills only the gaps: it never overrides an argument the door was actually given, nor complains about
    being absent, the way a drop file named on the command line does.

    Worst case falls from 340 characters to 176, and the length no longer
    varies with the player's alias. syncretro_lobby_check_cmdlen() measures
    the assembled line against the limit and logs when it exceeds it, on
    v3.21 as well as v3.22, so a future addition cannot regress this in
    silence.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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