From 673b274fc22d636261469e089835f1fa68c9f675 Mon Sep 17 00:00:00 2001 From: alice Date: Mon, 7 Sep 2026 17:53:35 +0000 Subject: [PATCH] vms-ddc: SHOW DEVICE/FULL renders the full block in the bare listing Operator direct-test: `SHOW DEVICE/FULL` "does nothing". Root cause: in cmd_show_device()'s bare-listing path, the terminal loop called the brief show_device_row() regardless of /FULL -- only the disk loop and the NAMED device path honored it. So a bare `SHOW DEVICE/FULL` on a terminal-only view printed the same one-line rows as bare `SHOW DEVICE`. Fixed: the bare terminal loop now renders show_device_terminal_full() under /FULL, mirroring the disk loop and the named path. Not fabrication -- SHOW DEVICE reads the real executive device table via /dev/vms; this is a qualifier that was parsed but not applied in one code path. PROVEN: dcl_acceptance_battery.sh now exercises BARE `SHOW DEVICE/FULL` and asserts the console's full block (Terminal OPA0: + Owner process) appears -- the surface the gate never covered. Confirmed PASS on the Alpha DCL/SHOW acceptance leg (workflow_dispatch run 34149477870). OPA0: exists on every arch, so the assertion is substrate-independent. The separate SHOW DEVICE VDA0:->NOSUCHDEV symptom (non-virtio disks never probed on bare metal) is a distinct fix that needs a non-virtio guest disk to prove; it is split to its own branch (vms-ddc / vms-47d) rather than ship probe code whose positive proof does not yet land. Refs vms-ddc, vms-050 (oracle-driven UX-fidelity). Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_018q4jvj6GCkdbYjRvpy7Vwu --- src/vmsdcl/dcl_cmd_show.c | 14 +++++++++++++- tests/qemu/lib/dcl_acceptance_battery.sh | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/vmsdcl/dcl_cmd_show.c b/src/vmsdcl/dcl_cmd_show.c index 30cddb03..5580c29c 100644 --- a/src/vmsdcl/dcl_cmd_show.c +++ b/src/vmsdcl/dcl_cmd_show.c @@ -2090,7 +2090,19 @@ static int cmd_show_device(struct dcl_command *cmd) info.devnam[VMS_DEVNAM_SIZE - 1] = '\0'; if (info.devclass == DC$_DISK) continue; - show_device_row(&info, &rows); + /* + * /FULL applies to a bare listing the same way it does to the disk + * section above (and to a NAMED terminal at line ~2038): each device + * renders its full per-device block, not the brief one-line row. The + * previous code called show_device_row() here unconditionally, so + * `SHOW DEVICE/FULL` with a terminal-only table produced output + * identical to bare `SHOW DEVICE` -- the "/FULL does nothing" the + * operator observed (vms-ddc). Mirror the disk loop and the named path. + */ + if (full) + show_device_terminal_full(&info); + else + show_device_row(&info, &rows); } /* diff --git a/tests/qemu/lib/dcl_acceptance_battery.sh b/tests/qemu/lib/dcl_acceptance_battery.sh index c3d21858..cf27f309 100644 --- a/tests/qemu/lib/dcl_acceptance_battery.sh +++ b/tests/qemu/lib/dcl_acceptance_battery.sh @@ -325,6 +325,18 @@ run_dcl_acceptance_battery() { must_not_have "$SEG" 'Default buffer size' "SHOW DEVICE/FULL OPA0: [vms-bed]: no fabricated Default buffer size (info->width is column width, not buffer size -- INV-6 honest omission)" negctl "$SEG" 'SHOW DEVICE' "SHOW DEVICE/FULL OPA0:" + # --- SHOW DEVICE/FULL (BARE, vms-ddc: the operator hit "/FULL does nothing") + # The named path above already honored /FULL; the BARE listing did NOT -- its + # terminal loop called the brief show_device_row() regardless of /FULL, so a + # bare `SHOW DEVICE/FULL` printed the same one-line rows as `SHOW DEVICE`. + # Fixed to render each device's full block (mirroring the disk loop + the + # named path). Assert the console's FULL block appears in the bare listing. + # OPA0: exists on every arch, so this assertion is substrate-independent. + run_cmd 'SHOW DEVICE/FULL' + must_have "$SEG" 'Terminal OPA0' "SHOW DEVICE/FULL [vms-ddc]: the BARE /FULL listing renders the terminal FULL block (was the brief row -- the '/FULL does nothing' bug)" + must_have "$SEG" 'Owner process' "SHOW DEVICE/FULL [vms-ddc]: bare /FULL shows the Owner process block, proving /FULL is applied in the bare listing, not only the named path" + negctl "$SEG" 'SHOW DEVICE' "SHOW DEVICE/FULL (bare)" + # --- F$GETDVI reads the SAME real executive device table (vms-050) ------- # F$GETDVI used to fabricate: EXISTS=TRUE for EVERY name, VOLNAM guessed from # a name substring ("OVMXSYS"/"VOLUME"), DEVCLASS/DEVTYPE guessed the same