DOSEMU2 On Fedora
OxideBBS v1 DOS doors require DOSEMU2, not legacy DOSEMU 1.x. On Fedora the runtime executable is still named dosemu, so always verify the version before debugging door behavior.
Expected Runtime
The correct runtime reports a DOSEMU2 version:
dosemu --versionExpected shape:
dosemu2-2.0pre9
Revision: ...This is not sufficient:
dosemu-1.4.0.8-...Legacy dosemu-1.x does not support the run-local pts <path> COM1 mapping used by OxideBBS. If dosemu --version reports dosemu-1.x, remove or replace that package before live door testing.
Install Packages
The Fedora 44 validation host used the DOSEMU2 packages from the stsp/dosemu2 Copr repository. Enable that repository and install the runtime packages:
sudo dnf copr enable stsp/dosemu2
sudo dnf install -y dosemu2 install-freedos comcom64 fdpp \
dj64dev-dj64 dj64dev-djdev64Verify the installed package set:
rpm -qa | grep -Ei 'dosemu2|install-freedos|comcom64|fdpp|dj64' | sortThe validated package set looked like:
comcom64-...
dj64dev-dj64-...
dj64dev-djdev64-...
dosemu2-2.0pre9-...
fdpp-...
install-freedos-...Configure The DJ64 Loader Path
On the Fedora validation host, dosemu could start but failed while booting COMMAND.COM until the DJ64 runtime library path was added to the system dynamic loader cache.
The failure looked like:
cannot dlopen .../COMMAND.COM: libdj64.so.0: cannot open shared object fileConfirm whether the loader already sees libdj64.so.0:
ldconfig -p | grep libdj64Expected shape:
libdj64.so.0 (libc6,x86-64) => /usr/i386-pc-dj64/lib64/libdj64.so.0If no libdj64.so.0 entry appears, add the DJ64 library directory and refresh the loader cache:
echo /usr/i386-pc-dj64/lib64 | sudo tee /etc/ld.so.conf.d/dj64.conf
sudo ldconfig
ldconfig -p | grep libdj64For temporary local testing only, LD_LIBRARY_PATH=/usr/i386-pc-dj64/lib64 may help with some direct commands, but OxideBBS service deployments should use the loader-cache configuration above so systemd and non-interactive shells behave the same way as manual tests.
Verify DOSEMU2 Boots
Run a minimal command:
dosemu -dumb -quiet -E verThis should boot DOSEMU2/FDPP and print version output instead of failing with libdj64.so.0.
If ~/.dosemu/drive_c is empty, that is not automatically a blocker for the Oxide Door Check fixture. The Fedora DOSEMU2 packages boot FDPP and comcom64 from system paths. The critical check is that dosemu -dumb -quiet -E ver starts without the DJ64 loader error.
Validate Oxide Door Check
Normal Rust builds and normal Rust tests do not require DOSEMU2:
./scripts/dev-check.shDry-run door validation also does not require DOSEMU2:
cargo run -p oxidebbs-server -- --config config/oxidebbs.example.toml \
doors test oxide-check --user sysop --dry-runOnce Fedora DOSEMU2 is installed and libdj64.so.0 is visible through ldconfig, run the optional live smoke tests:
OXIDE_DOOR_INTERACTIVE=1 ./scripts/test-oxide-door-dosemu2.shExpected result:
DOSEMU2 smoke test passedThen verify separate node runtime behavior:
OXIDE_DOOR_INTERACTIVE=1 OXIDE_DOOR_MULTI_NODE=1 \
./scripts/test-oxide-door-dosemu2.shExpected result:
multi-node DOSEMU2 smoke test passedThe smoke script launches the checked-in OXIDECHK.EXE fixture through DOSEMU2, maps COM1 to a run-local PTY, sends I, R, and Q, and verifies OXIDECHK.RPT creation. It exits 77 with a SKIP: message when DOSEMU2 is missing or when dosemu is legacy DOSEMU 1.x.
Troubleshooting
If the smoke script says legacy DOSEMU is installed:
SKIP: DOSEMU2 is required; dosemu is legacy dosemu-1...Check which package owns the binary:
rpm -qf "$(command -v dosemu)"
dosemu --versionInstall DOSEMU2 from the Copr repository and remove the legacy runtime if it is still taking precedence on PATH.
If the smoke test times out waiting for OXCOM1.PTY, inspect the latest DOSEMU2 boot log:
sed -n '1,220p' ~/.dosemu/boot.logThe generated per-run DOSEMU2 config should contain:
$_com1 = "pts <repo>/target/.../node-001/OXCOM1.PTY"If the PTY appears but the door exits immediately, verify the current code is staging the door executable into the node runtime and launching it by DOS filename. The expected DOSEMU2 command model is:
dosemu -dumb -quiet -K <node runtime> -f <node runtime>/OXDOSEMU2.CONF -E OXIDECHK.EXEDo not use an absolute host path as the DOS command for OXIDECHK.EXE; that can cause the program to run outside the node runtime and miss its drop files.