Commit Graph

23 Commits

Author SHA1 Message Date
Mario Fetka
162ff2b10f nwconn: implement AFP temporary directory handles
All checks were successful
Source release / source-package (push) Successful in 49s
Implement the WebSDK/nwafp.h NCP 0x2222/35 AFP subfunction 0x0b, Alloc Temporary Directory Handle, for the same conservative path-backed subset used by the current AFP Entry ID and File Information probes.\n\nThe documented request carries an AFP volume number, a base AFP Entry ID, and an optional AFP-style path.  mars_nwe still has no persistent CNID/base-ID lookup, so this patch deliberately accepts only requests with a path component and rejects entry-id-only allocation as Invalid Path.  For the supported smoke-test path, raw SYS:-style paths are resolved through the existing NetWare path machinery and the final handle is allocated with nw_alloc_dir_handle() as a temporary, task-scoped NetWare directory handle.\n\nThe implementation keeps the AFP namespace gate intact: without the optional Netatalk/libatalk backend, the endpoint continues to return Invalid Namespace rather than pretending that the Mac namespace exists.  With the backend enabled, successful replies contain the allocated temporary directory handle and the effective-rights mask returned by the existing directory-handle table.  Diagnostics include the AFP volume/base Entry ID input, path, returned handle, and rights so smoke-test output can be matched to server logs.\n\nAdd a Linux ncpfs/libncp smoke helper for the new endpoint.  The helper sends the AFP 0x0b request through NWRequestSimple(), prints the returned handle and rights mask, and immediately deallocates the handle in the same connection via the normal NetWare Deallocate Directory Handle call.  The README documents that these handles are connection/task-local and must not be copied into later tests or reused from server logs.\n\nTests:\n- git diff --check\n- gcc -fsyntax-only tests/linux/afp_temp_dir_handle_smoke.c with temporary local ncpfs header stubs\n\nNot run:\n- Full CMake build in this container: missing gdbm/ncpfs development headers/libraries.\n\nTODO:\n- Replace the path-backed subset with persistent CNID/base-ID lookup once the AFP metadata backend grows durable directory identity support.\n- Verify live Linux smoke cases against SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST on a mars_nwe host with ENABLE_NETATALK_LIBATALK=ON.
2026-05-30 09:27:51 +02:00
Mario Fetka
776c7e7510 tests: document AFP entry-id-from-handle smoke coverage
All checks were successful
Source release / source-package (push) Successful in 47s
Document the Linux smoke-test coverage for NCP 0x23 AFP subfunction 0x06, Get Entry ID From NetWare Handle.

The WebSDK documents the request as NCP 0x2222/35/06, with the SDK headers exposing the same operation through AFPGetEntryIDFromNetWareHandle() and NWAFPGetEntryIDFromNetWareHandle(). Unlike the path and name probes, this request is centered on a 6-byte NetWare file handle that is valid only in the current client connection.

Record the known-good libncp smoke invocations for SYS:PUBLIC files. The test opens each file in the same connection, passes the returned NetWare handle to the AFP request, and verifies the conservative reply shape: volume 0, a 32-bit AFP Entry ID, and data-fork indicator fork=0.

Also document the current implementation boundary. The returned Entry IDs are still stat-derived fallback values, server diagnostics mark them with fallback, parent Entry ID derivation remains conservative, and persistent CNID/AppleDouble/libatalk-backed identity plus AFP resource-fork handle semantics remain TODO work.

Tests:

- Documentation-only change; no binary rebuild required.

- Previously verified: ./afp_entry_id_smoke --from-handle -S MARS -U SUPERVISOR -P ... SYS:PUBLIC/pmdflts.ini

- Previously verified: ./afp_entry_id_smoke --from-handle -S MARS -U SUPERVISOR -P ... SYS:PUBLIC/ohlogscr.bat
2026-05-30 09:20:16 +02:00
Mario Fetka
8cd0cad6fb tests: document AFP get-entry-id-from-name smoke coverage
All checks were successful
Source release / source-package (push) Successful in 49s
Document the Linux smoke coverage for NCP 0x23/0x04 AFP Get Entry ID From Name after the path-backed implementation was verified.

The same afp_entry_id_smoke tool now exercises both the older path-name probe and the name-based entry-id lookup. Record the --from-name examples for SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST, and note that the current implementation still returns stat-derived fallback Entry IDs until persistent CNID/AppleDouble mapping is available.

Update TODO.md so the implemented AFP status matches the tested endpoints while keeping the remaining base-entry-id-relative lookup and persistent Mac namespace work tracked as follow-up.
2026-05-30 08:59:47 +02:00
Mario Fetka
2134f83ac4 tests: document AFP scan file information smoke coverage
All checks were successful
Source release / source-package (push) Successful in 47s
Document the Linux AFP 2.0 Scan File Information smoke coverage after the endpoint was verified against SYS:PUBLIC.

The scan test exercises the WebSDK-documented NCP 0x23/0x11 request by walking a directory one entry at a time and feeding the returned next_last_seen AFP Entry ID into the next request. Record the verified multi-entry SYS:PUBLIC sequence and explain that the current Entry IDs are still stat-derived fallback values until persistent CNID/AppleDouble mapping is implemented.

Update the Linux test README with the afp_scan_info_smoke build target and examples, and move Scan File Information out of the generic unimplemented AFP follow-up list while keeping broader scan edge cases and full Mac namespace work tracked.

This is documentation-only and does not change AFP protocol behavior.
2026-05-30 08:37:30 +02:00
Mario Fetka
43dc118ea3 tests: document AFP 2.0 file information smoke coverage
All checks were successful
Source release / source-package (push) Successful in 48s
Document the verified AFP 2.0 Get File Information smoke-test coverage after the endpoint was exercised against the same standard SYS volume paths as the older AFP file-information call.

The Linux afp_file_info_smoke test now covers both NCP 0x23/0x05 and NCP 0x23/0x0f. Record that --afp20 was verified against SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST using the current path-backed read-only reply.

Keep the remaining AFP limitations explicit: the reply still uses stat/libatalk-derived fields, marks temporary Entry IDs with the fallback diagnostic, and leaves persistent CNID/AppleDouble IDs, Parent ID mapping, and fuller Mac namespace metadata as future work.

This is documentation-only and does not change AFP protocol behavior.
2026-05-30 08:20:05 +02:00
Mario Fetka
8e885bb16d nwconn: implement AFP 2.0 Get File Information
All checks were successful
Source release / source-package (push) Successful in 46s
Route NCP 0x23/0x0f AFP 2.0 Get File Information through the existing read-only AFP file-information helper.

The WebSDK and nwafp.h list both AFP Get File Information and AFP 2.0 Get File Information as path/file-information queries that return the AFP file-information record used by Mac namespace clients. The already implemented 0x05 path handles SYS:-style path requests and fills the safe read-only fields from Unix stat data plus the optional libatalk Finder Info and resource-fork helpers.

Use the same conservative path-backed reply for 0x0f for now. This gives Linux smoke-test coverage for the AFP 2.0 subfunction without adding entry-id-only lookup, persistent CNID mapping, write-side metadata updates, or fuller resource-fork semantics.

Extend afp_file_info_smoke with --afp20 so the same SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST cases can exercise the AFP 2.0 subfunction. Update the Linux test README and TODO tracking to record that AFP 2.0 file information is covered by the same temporary fallback model.

This implements only the read-only path-based subset; richer AFP 2.0 behavior remains future Mac-namespace work.
2026-05-30 08:05:46 +02:00
Mario Fetka
b3d06fbf3f tests: document AFP file information smoke coverage
All checks were successful
Source release / source-package (push) Successful in 47s
Document the Linux smoke-test coverage for the newly implemented AFP Get File Information endpoint.\n\nThe WebSDK-documented NCP 0x2222/35/05 path now has a Linux libncp smoke test alongside the existing AFP Entry ID probe. Record the verified SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST cases and describe the read-only reply fields currently populated from Unix stat data and the optional libatalk helper wrappers.\n\nAlso update the AFP Entry ID smoke-test documentation to match the current default raw-path mode, where SYS:-style paths are sent with directory handle 0 and handle allocation is kept behind --alloc-handle for separate debugging.\n\nKeep the remaining AFP/Mac namespace work in TODO.md, including persistent CNID/AppleDouble entry IDs, Parent ID mapping, Finder Info/resource-fork semantics, AFP 2.0 file information, and Scan File Information coverage.\n\nThis is documentation-only and does not change AFP protocol behavior.
2026-05-30 07:55:53 +02:00
Mario Fetka
f6861ba3d6 tests: document AFP entry id smoke coverage
All checks were successful
Source release / source-package (push) Successful in 45s
Document the Linux AFP Entry ID smoke-test coverage after the endpoint was verified against the standard SYS volume paths.

The test exercises the WebSDK-documented NCP 0x23/0x0c AFP Get Entry ID From Path Name request by logging in through libncp, allocating a temporary directory handle for the volume root, and sending the relative path to the AFP endpoint.

Record the verified SYS:, SYS:PUBLIC, SYS:SYSTEM, and SYS:BURST cases, and describe the current stat-derived fallback Entry ID diagnostics so the result is not confused with persistent CNID/AppleDouble storage.

Keep the remaining AFP work tracked in TODO.md, including replacing the fallback with persistent CNID/directory-id mapping and extending tests when additional AFP subfunctions are implemented.

This is documentation-only and does not change AFP protocol behavior.
2026-05-30 03:38:10 +02:00
Mario Fetka
eb2983bc1a nwconn: implement AFP entry id path lookup
All checks were successful
Source release / source-package (push) Successful in 48s
Wire NCP 0x23/0x0c AFP Get Entry ID From Path Name to a real path lookup when the optional Netatalk/libatalk backend is available.

The WebSDK documents NCP 0x2222/35/12 as converting a NetWare directory handle plus short-name path string into a unique 32-bit Macintosh file or directory Entry ID. The request carries the AFP subfunction, NetWare directory handle, path length, and path string; the reply carries the 4-byte AFP Entry ID. The SDK headers expose the same operation as AFPGetEntryIDFromPathName() and NWAFPGetEntryIDFromPathName(), and NWAFPSupported() uses this path-name probe to test AFP support.

Resolve the NetWare directory handle and path through the existing mars_nwe path machinery, require the optional libatalk backend before returning AFP success, and then ask libatalk for an AppleDouble/CNID-style id when available. If libatalk is present but the file has no stored id yet, return a deterministic stat-derived local entry id as a temporary fallback so the path-name probe can succeed without inventing NetWare directory base numbers.

Keep all other AFP subfunctions returning invalid namespace for now. They still need Finder Info, resource fork, AFP file information, fork open, and persistent CNID/directory-id support before they can safely report success.

Add the SDK request/reply semantics to the inline endpoint comments and keep the remaining AFP work tracked in TODO.md.

This implements only the AFP path-to-entry-id probe; it does not add general AFP file or resource-fork semantics yet.
2026-05-30 01:45:58 +02:00
Mario Fetka
0456882be3 nwconn: decode AFP subfunction diagnostics
All checks were successful
Source release / source-package (push) Successful in 47s
Decode the NCP 0x23 AFP subfunction number in diagnostics before rejecting the
call as an unavailable Mac namespace request.

The WebSDK documents the old NetWare AFP calls as NCP 0x2222/35 subfunctions,
and the SDK headers expose the same entry points through nwafp.h.  Record the
known subfunction names for AFP Delete, Get Entry ID From Name, Get Entry ID
From NetWare Handle, Rename, Open File Fork, Alloc Temporary Dir Handle, Get
Entry ID From Path Name, AFP 2.0 Create, Get/Set File Information, and Scan
File Information.

MARS-NWE still does not implement the per-volume Mac namespace semantics
required to return success for these calls.  Netatalk/libatalk can provide local
AppleDouble/Finder Info/resource-fork helpers, but mars_nwe must still decode
and answer the NetWare NCPs itself.

Keep returning invalid namespace for now, but make the rejected call visible in
the log so real client probes can be mapped to the SDK subcall that needs to be
implemented next.  Update TODO.md to track that the AFP dispatcher now has
subfunction-aware diagnostics.

This is diagnostics-only and does not change AFP protocol behavior.
2026-05-30 01:34:51 +02:00
Mario Fetka
13737d03c3 build: add optional Netatalk libatalk backend hook
Some checks failed
Source release / source-package (push) Failing after 41s
Add an opt-in CMake hook for Netatalk/libatalk and a small nwconn-side helper
layer for future AFP/Mac namespace work.

NetWare AFP NCP 0x23 calls still have to be decoded and answered by MARS-NWE;
libatalk is not used as an afpd proxy. Instead, expose local helper wrappers
that can read AppleDouble/Finder Info metadata and resource-fork sizes from a
backing Unix path when libatalk is available.

The WebSDK documents the AFP calls as NetWare server entry points for Mac
namespace semantics, and the SDK headers expose probes such as NWAFPSupported()
plus AFP entry-id and file-information calls. Those calls require AFP entry
IDs, Finder Info, resource forks, and per-volume Mac namespace state before
MARS-NWE can return success.

Keep NCP 0x23 returning invalid namespace for now, but record whether the
libatalk metadata backend was compiled in when rejecting AFP calls. Update
TODO.md to track the remaining NetWare AFP implementation work on top of the
new backend hook.

This adds build-time integration and local metadata helpers only; it does not
change AFP protocol behavior.
2026-05-30 01:25:55 +02:00
Mario Fetka
3421fceda3 nwconn: document TTS unavailable status
All checks were successful
Source release / source-package (push) Successful in 50s
Add WebSDK context to the Transaction Tracking System endpoint handling.

The WebSDK documents NCP 0x2222/34/00 TTS Is Available as a
completion-code-only status probe with no reply data. A completion code of
0x00 means Transaction Tracking Unavailable, 0xfd means Disabled, and 0xff
means Available. The SDK headers expose this call as NWTTSIsAvailable().

MARS-NWE does not implement TTS rollback semantics, transaction files,
transaction status tracking, or the begin/end/abort transaction state machine.
Keep reporting the documented unavailable status for the availability probe,
but leave state-changing TTS subfunctions unsupported rather than pretending
to start or complete transactions without rollback behavior.

lwared and the Rust nwserver implementation do not provide a fuller TTS
transaction implementation to mirror, so keep the remaining TTS work tracked
as deferred optional protocol work in TODO.md.

This preserves existing protocol behavior while documenting why the only
locally handled TTS subfunction is the availability probe.
2026-05-30 00:59:54 +02:00
Mario Fetka
297bb192f8 nwconn: document object disk restriction fallback
All checks were successful
Source release / source-package (push) Successful in 53s
Add SDK context to NCP 0x16/0x29 Get Object Disk Usage And Restrictions while
keeping the existing QUOTA_SUPPORT split intact.

The WebSDK documents NCP 0x2222/22/41 as taking a Volume Number and a high-low
Object ID, and returning Restriction and In Use values in 4K blocks. A
restriction of 0x40000000 means that the object has no disk restriction, and
invalid object IDs return success with no restriction and no space used.

With QUOTA_SUPPORT enabled, MARS-NWE routes the call through nwbind so the
object ID can be mapped to a Unix uid before nw_get_vol_restrictions() queries
the quota backend. With quota support disabled, keep the local SDK-compatible
unrestricted/no-use fallback so hosts without quota support do not need the
quota backend.

Add the SDK request/reply semantics to the inline endpoint comment and track
direct test coverage for both build modes in TODO.md.

This is documentation-only apart from renaming the debug message from DUMMY to
fallback, and preserves the build-time QUOTA_SUPPORT behavior.
2026-05-30 00:31:21 +02:00
Mario Fetka
c80861b92b nwconn: implement extracted base handle restore
All checks were successful
Source release / source-package (push) Successful in 54s
Wire NCP 0x16/0x17 Extract a Base Handle and NCP 0x16/0x18 Restore an
Extracted Base Handle to connection-local directory-handle state.

The WebSDK documents NCP 0x2222/22/23 as taking a DirectoryHandle and
returning a 14-byte save buffer composed of a 10-byte ServerNetworkAddress
plus a 4-byte HandleID. The same documentation describes NCP 0x2222/22/24 as
taking that saved ServerNetworkAddress/HandleID pair and returning a
NewDirectoryHandle plus AccessRightsMask.

The SDK headers expose these calls as NWSaveDirectoryHandle() and
NWRestoreDirectoryHandle(), with the save buffer explicitly documented as 14
bytes. The Rust nwserver and lwared references do not implement this older
save/restore pair, and newer clients typically use the normal allocate/set
directory-handle calls instead, so keep the MARS-NWE HandleID opaque and
connection-local rather than guessing a global NetWare directory-base number.

Store extracted base-handle IDs in a small per-connection table that records
the saved volume/path tuple. Extract requires a live permanent directory
handle, and Restore validates the saved server address against this server
before allocating a new permanent directory handle for the saved path.

Add the SDK request/reply semantics to the inline endpoint comments and remove
the corresponding TODO entry.

This enables the documented endpoint path while keeping the saved HandleID
conservative and private to MARS-NWE.
2026-05-30 00:12:31 +02:00
Mario Fetka
701e33e0ce docs: update endpoint follow-up tracking
All checks were successful
Source release / source-package (push) Successful in 46s
Update TODO.md after the recently enabled synchronization and extended volume
information endpoints.

The file/logical-record/physical-record synchronization entries no longer need
to list NCP 0x04, 0x0c, and 0x1f as disabled or dummy endpoints. Keep the
remaining work focused on requester/NWTESTS coverage plus timeout and
error-code verification for set-oriented locking calls.

Also track follow-up work for fields that are currently returned as zero by
Get Extended Volume Information because MARS-NWE does not yet model them. The
endpoint now returns the documented NWVolExtendedInfo reply, but NetWare-
specific counters such as suballocation, deleted-file/limbo, compression,
migration, EA, Directory Services, and timestamp fields should only be filled
once reliable backing filesystem or MARS-NWE metadata is available.

This is documentation-only and does not change NCP behavior.
2026-05-29 23:46:20 +02:00
Mario Fetka
f78ae0fb2a nwconn: implement Get Extended Volume Information
All checks were successful
Source release / source-package (push) Successful in 48s
Wire NCP 0x16/0x33 Get Extended Volume Information to a real reply instead of
returning 0xfb.

The WebSDK documents NCP 0x2222/22/51 as taking a VolumeNumber and returning a
low-high VolInfoReplyLen, an NWVolExtendedInfo structure, and a
length-prefixed volume name. The SDK headers define NWVolExtendedInfo as 33
32-bit fields covering volume type, status flags, sector and cluster geometry,
free-space counters, suballocation/limbo/compression/migration counters,
directory counters, EA counters, a Directory Services object id, and a
last-modified timestamp.

Map the Unix filesystem data already used by the older volume-information
calls to the core extended-volume fields: report a NetWare 386 v3.1 style
volume type, 512-byte sectors, 8 sectors per cluster, total/free clusters, and
directory-entry counters derived from fs_usage. Report NetWare-specific
suballocation, limbo, compression, migration, EA, Directory Services, and
timestamp fields as zero for now.

Add the SDK request/reply semantics to the inline endpoint comment and remove
the corresponding TODO entry.

This enables the documented endpoint path while keeping the mapping
conservative; fields MARS-NWE cannot currently model remain zero rather than
guessed.
2026-05-29 23:34:55 +02:00
Mario Fetka
bcf58e3b0a nwconn: enable Physical Record Set calls
All checks were successful
Source release / source-package (push) Successful in 47s
Wire the physical-record set endpoints to the shared synchronization-set
handler.

The Novell SDK documents NCP 0x2222/27 Lock Physical Record Set (old) and NCP
0x2222/110 Lock Physical Record Set as locking all byte ranges logged by the
calling client. The request carries a one-byte Lock Flag plus a 2-byte Lock
Timeout in 1/18 second units. Bit 1 of the Lock Flag selects shareable/read-only
locking; otherwise the set is locked exclusive/read-write.

The SDK documents NCP 0x2222/29 Release Physical Record Set as releasing all
locked byte ranges while leaving them in the client data byte range table, and
NCP 0x2222/31 Clear Physical Record Set as releasing all locked ranges and
clearing that table. The set calls return no reply data and report success,
timeout, or lock errors through the completion code.

Maintain the physical-record set table from the individual Log/Release/Clear
Physical Record path: successful 0x1a calls add the range, 0x1c leaves it
logged, and 0x1e removes the matching range after a successful unlock. Then
route 0x1b/0x6e, 0x1d, and 0x1f through share_handle_lock_sets() with type 4.

Remove the old Clear Physical Record Set dummy and the corresponding TODO
entry.

This enables the documented endpoint paths; timeout handling remains limited to
the existing underlying share implementation.
2026-05-29 23:21:32 +02:00
Mario Fetka
4e5573c992 nwconn: enable Lock File Set
All checks were successful
Source release / source-package (push) Successful in 47s
Wire NCP 0x04 Lock File Set and NCP 0x6a Lock File Set to the existing
file-set lock path.

The Novell SDK documents NCP 0x2222/04 as the old Lock File Set call and NCP
0x2222/106 as its replacement. Both calls lock all files logged by the calling
client's current task. The request carries a 2-byte Lock Timeout in 1/18
second units, the reply carries no data, and completion reports success,
timeout, or lock error.

MARS-NWE already records file-set members through Log File and already routes
Release File Set and Clear File Set through share_handle_lock_sets(). Use the
same set handler for Lock File Set with lock_flag 0 so the handler locks the
logged entries using each entry's recorded lock directive, defaulting to
exclusive when no directive was logged.

Enable the previously disabled old endpoint, add support for the SDK
replacement endpoint, add the SDK request/reply semantics to the inline
endpoint comment, and remove the corresponding TODO entry.

This enables the documented endpoint path; timeout handling remains limited to
the existing underlying share implementation.
2026-05-29 22:55:14 +02:00
Mario Fetka
215e0d02b4 nwconn: enable Release Logical Record
All checks were successful
Source release / source-package (push) Successful in 47s
Wire NCP 0x0c Release Logical Record to the existing logical-record release
path.

The Novell SDK documents NCP 0x2222/12 as releasing one synchronization string
held by the calling client without removing it from the client's
synchronization string table. The string remains logged and may be relocked by
a later Lock Logical Record Set call.

The handler already distinguished this from NCP 0x0b Clear Logical Record:
0x0b uses lock_flag -2 to unlock and unlog the record, while 0x0c uses
lock_flag -1 to unlock only.

Enable the previously disabled case label, add the SDK request/reply semantics
to the inline endpoint comment, and remove the corresponding TODO entry.

This only enables the documented endpoint path; the underlying locking
implementation is unchanged.
2026-05-29 22:43:04 +02:00
Mario Fetka
44a309de40 nwserv: escape SAP names in debug logs
All checks were successful
Source release / source-package (push) Successful in 45s
SAP service names are fixed-size 48-byte fields and are not guaranteed to be
safe C strings in diagnostics.  Some NetWare 6.5 SAP service types advertise
non-printable or high-bit bytes in the name field, which made the debug log
hard to read and could run past the intended protocol field if logged with a
plain %s.

Add bounded formatting for SAP names used in debug output.  Stop at NUL within
the fixed field, keep printable ASCII unchanged, and escape other bytes as
\\xNN.

This is logging-only and does not change SAP/RIP protocol behavior.
2026-05-29 21:51:57 +02:00
Mario Fetka
ae4cb39790 docs: annotate remaining NCP endpoint stubs
All checks were successful
Source release / source-package (push) Successful in 50s
Add SDK/protocol context comments for the remaining known nwconn.c endpoint
stubs and partial implementations.

Document the intended behavior and follow-up work for Lock File Set, Release
Logical Record, Restore Directory Handle, Get Extended Volume Information, and
Clear Physical Record Set. Also add matching TODO.md entries so these
compatibility gaps are tracked outside inline source comments.

This is documentation-only and does not change NCP behavior.
2026-05-29 20:39:48 +02:00
Mario Fetka
b4fbfa6a8a docs: update packet burst TODO status
All checks were successful
Source release / source-package (push) Successful in 47s
Packet Burst is no longer merely optional follow-up work for DOS tool
compatibility.

A diagnostics-enabled DOS client run verified real Packet Burst negotiation
and READ/WRITE data-path usage, and ENABLE_BURSTMODE now defaults to ON at
build time while runtime use remains controlled by nwserv.conf.

Keep Packet Burst/NDS fragmentation listed as deferred optional work.
2026-05-29 20:20:26 +02:00
Mario Fetka
f10a81566d docs: add TODO tracking file
All checks were successful
Source release / source-package (push) Successful in 46s
Add a top-level TODO.md for follow-up work that should not remain as scattered
inline source comments.

Document the current Check Console Privileges limitation, where console rights
are mapped to supervisor equivalence for now, and track the need for a real
console privilege map. Also record follow-ups for queue spool path case
handling, direct NCP 17/4c test coverage, Q_UNIX_PRINT backend improvements,
and deferred optional protocol work.

Reference TODO.md from the main README.
2026-05-29 18:51:37 +02:00