Skip to content

Delete VMSLNMD.EXE: VMS has no logical name daemon (vms-a4b) - #11

Merged
baron-3dl merged 2 commits into
mainfrom
work/vms-a4b-rebased
Jul 30, 2026
Merged

baron-3dl merged 2 commits into
mainfrom
work/vms-a4b-rebased

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

Deletes the pretense, not the problem. vms-a4b had two halves; this is the one that could be done now.

What this is

VMSLNMD.EXE listened on /tmp/ovmx/lnm.sock with zero clients product-wide. A grep for connect()/LNM_SOCKET_PATH found no caller anywhere in src/ or tools/. The only other reference was ovmx_init.c, which stat()ed the socket purely to decide whether to print %STDRV-I-LNMSTART — so PID 1 announced a daemon whose sole observable effect was that announcement.

On OpenVMS, logical name tables are in the executive. There is no logical name server process and nothing to start. Moving the daemon launch into SYSTARTUP_VMS.COM would have been theatre, so it was deliberately not done.

+35 / −522 across 15 files: lnm_daemon.c (415 lines), the CMake target and its install(TARGETS), LNM_SOCKET_PATH, start_lnm_daemon(), wait_for_lnm_socket(), the lnm_pid/lnm_started plumbing and its distant kill()/waitpid() cleanup, VMSLNMD.EXE from provision_symlinks(), the display_boot_banner() parameter, VMS_LNMD_PATH from ovmx_layout.h, and the cp in distro/Dockerfile.bootable. Plus the config and doc sites that still referenced it — including OVMX.CONF, which was shipping LNM_SOCKET=/tmp/ovmx/lnm.sock into the running rootfs.

It also deletes an invented message: %STDRV-I-LNMSTART, logical name daemon started had no OpenVMS oracle behind it.

What this is NOT

This does not make logical names executive-resident. DEFINE/SYSTEM in one process is still invisible to others — lnm_client.c still callocs private tables. That work is vms-d37, correctly blocked behind vms-ln0, which is awaiting an operator ruling on placement (ioctl-per-translation vs. an mmap'd arena) and defers four VMS values that Rule 10 bars an agent from self-certifying.

src/vmslnm/lnm_client.c is retained and still builds.

Verification

ctest 39/39 passed, 0 failed, 0 skipped. Rebased onto main after vms-71a (#10); the docs/architecture.md conflict resolved in favour of main's deletion of the Docker Mode section.

🤖 Generated with Claude Code

OpenVMS keeps the logical name tables in the executive. There is no logical
name server process, no socket, and nothing for a manager to start. OVMX had
invented one anyway: VMSLNMD.EXE listened on /tmp/ovmx/lnm.sock, loaded
SYS$MANAGER:SYLOGICALS.CONF into its own private manager, and served ZERO
clients product-wide — a grep for connect()/LNM_SOCKET_PATH across src/ and
tools/ found no caller. PID 1 forked it, stat()'d the socket for up to 2s, and
printed "%STDRV-I-LNMSTART, logical name daemon started" — an invented message
announcing a process whose only observable effect was that announcement.

Under project Rule 10 that is the illegal third answer: a plausible-looking
facility for something VMS never has. Two legal answers only — match VMS, or
hide it. There is nothing to match, so it is deleted rather than reduced.

Deleted:
  - src/vmslnm/lnm_daemon.c and the VMSLNMD.EXE CMake target/install
  - start_lnm_daemon(), wait_for_lnm_socket(), LNM_SOCKET_PATH and the
    %STDRV-I-LNMSTART banner line in PID 1; boot steps renumbered
  - VMS_LNMD_PATH from ovmx_layout.h, VMSLNMD.EXE from provision_symlinks()
    and from the initramfs copy list in distro/Dockerfile.bootable

Coverage held, not dropped: verify_imgact_cmake{,_x86_64}.sh checked three
dynamic images for PT_INTERP=IMGACT.EXE + DT_HASH and one of them was
VMSLNMD.EXE. HELP.EXE takes its place, so both CI jobs still assert three.

This does NOT make logical names system-wide — it only removes the pretense
that something already did. LNM$SYSTEM/GROUP/JOB are still per-process
calloc'd tables (lnm_client.c:140). Making them executive-resident is blocked
on the operator ruling in vms-ln0 (waiting in `rd gates`); vms-d37 is the
implementation item.

Refs: vms-a4b, vms-ln0, vms-d37
Re-dispatch after veracity review found the deletion incomplete outside
code:

- distro/rootfs/.../OVMX.CONF still shipped LNM_SOCKET into the running
  rootfs, configuring a daemon nothing reads (product-wide grep for
  readers of the file's own keys, not just LNM_SOCKET, found zero).
- docs/architecture.md (rank 2 in the source-of-truth hierarchy, above
  CLAUDE.md) still documented vmslnmd as a live boot step in both the
  legacy Docker sequence and the QEMU-mode sequence, plus the layer
  diagram, dependency graph, and component table.
- docs/building.md still listed vmslnmd among produced executables.
- distro/Dockerfile.bootable's slim-initramfs comment still named LNMD.
- src/vmslnm/lnm_client.c's header comment still promised a future
  socket-based daemon client; repointed at the open vms-ln0 ruling.
- VMS_LNM_CONF_PATH (ovmx_layout.h) is now a zero-reader constant;
  marked reserved for the executive-resident work rather than left
  silent, per the re-dispatch ruling.

Re-ran the grep audit honestly across src/ tests/ tools/ distro/
.github/ docs/: remaining hits are explanatory comments referencing the
deletion (ovmx_layout.h, vmslnm/CMakeLists.txt) and the already-marked
SUPERSEDED historical section of docs/design-image-activation.md.

Built distro/Dockerfile.bootable with podman and ran
tests/qemu/test_persistent_boot.sh under pure TCG (no /dev/kvm, no host
kernel headers needed): 12/12 checks passed across both the
fresh-install boot and the persistent-reboot boot, confirming the PID 1
/ initramfs rewrite from the prior commit still boots correctly.

All changes in this commit are comments/docs/config only — no C source
logic changed, so the existing test baseline is unaffected.

vms-a4b
@baron-3dl
baron-3dl merged commit a9b08c6 into main Jul 30, 2026
34 checks passed
@baron-3dl
baron-3dl deleted the work/vms-a4b-rebased branch July 30, 2026 14:22
baron-3dl added a commit that referenced this pull request Aug 7, 2026
…negctl fixture, attribution race) (#164)

Four tests were red on main. Three were deterministic reds hidden behind
"flaky"/unowned labels; one was a genuine concurrency race. Full suite is
113/113 green under `ctest -j` after these fixes.

x86_64_reloc_survey_fresh (#24): docs/design-link-x86_64-relocs.md went stale
after sys_uai.c pulled in vms_kif.h. The survey's include list is built from
src/<c>/include per component, and src/libvmssys has no include/ subdir, so 8
libvmssys-dependent TUs failed to compile standalone and silently dropped from
the surveyed set. Add -I$REPO/src/libvmssys and regenerate (72obj/13fail ->
80obj/5fail; remaining 5 are unrelated missing-header cases). awk/tooling logic
otherwise unchanged.

userspace_service_register (#11): the gate walked $SRC_ROOT with a raw `find`,
descending into gitignored .claude/worktrees/ (parallel repo checkouts) and
reading their add_subdirectory()/install() as this tree's, flagging escapes that
belong to stale checkouts. Scope all three CMakeLists.txt walks to git-tracked
files via `git ls-files`, with a .claude-pruned `find` fallback for non-git
trees. "The product tree" == tracked source; not a silent skip.

userspace_service_register_negctl (#12): two stacked bugs in the
register_buildset.awk PARTIAL-parse control, deterministically red (identical on
a pristine HEAD worktree), not flaky. (a) The malformed fixture did `sed '$d'`,
deleting the trailing array ']' instead of the entry's '}', so the parser's
"file"-vs-"}" balance stayed even and never tripped. (b) Once (a) was fixed the
awk correctly refused with its diagnostic on stderr (by design; the real gate
splits stdout/stderr), but the control captured stdout only, so its "named
reason" grep saw an empty string. Fix both; register_buildset.awk is unchanged.

facility_attribution_negctl (#111): section G derived the host site list by
running the instrument against the LIVE shared checkout, then diffed it against
the container side — a snapshot frozen into the image at build. A concurrent
write to the checkout mid-run (another test or another session) skewed the diff,
producing a different spurious mismatch every run (the "different symptom every
run" flaky signature). Run the frozen $WORK/pristine snapshot on both sides so a
real image/tree divergence still reds but a mid-run edit cannot. No test
weakened, no retries/sleeps, committed execution record untouched.

Closes vms-354, vms-53f, vms-60c, vms-2d4; completes vms-aa6.

Co-authored-by: alice <alice@workspace.local>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant