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