Files
mars-nwe/TODO.md
2026-06-02 17:39:56 +02:00

70 KiB

TODO

This file collects follow-up work that is known but intentionally not part of the current patches. It is meant for project-level items that are too broad or too low-priority to keep as inline source TODO comments.

Server / NCP compatibility

Console privilege model

Current status:

  • NCP 23/200 Check Console Privileges is implemented as a protocol-compatible status check.
  • For now, console privileges are mapped to the existing supervisor-equivalence state computed for the connection.
  • Callers with supervisor equivalence get success; other callers get 0xc6 (No Console Rights).

Follow-up:

  • Add a real console-operator privilege model instead of treating console rights as identical to supervisor equivalence.
  • Decide where the console privilege map should live:
    • a bindery property,
    • a server configuration option,
    • or a small explicit internal list similar to queue operator handling.
  • Check how NetWare 3.x tools such as PCONSOLE, SYSCON, and console utilities expect console operators to be represented.
  • Keep NCP 23/200 as a completion-code-only endpoint; only the privilege source should change.

Queue spool path case handling

Current status:

  • Queue job paths can still be rebuilt from DOS/bindery path spelling such as SYS:SYSTEM/EPSON.QDR.
  • On a case-sensitive Unix filesystem this can differ from the existing directory, for example system/epson.qdr.

Follow-up:

  • Resolve queue job file paths case-insensitively in the queue connection/path resolver, or use the queue object's already-resolved Unix spool directory instead of rebuilding it from the DOS path.
  • Avoid creating duplicate directories that differ only by case.

NCP 17/4C test coverage

Current status:

  • NCP 17/4C List Relations of an Object is implemented server-side.
  • Existing DOS and Linux tools do not reliably trigger it for all useful set properties such as GROUP_MEMBERS and GROUPS_I'M_IN.

Follow-up:

  • Add a small direct test utility to mars-dosutils / NWTESTS that sends NCP 17/4C directly.
  • Suggested test cases:
    • TESTGRP1 type 0x0002, property GROUP_MEMBERS
    • TESTGRP2 type 0x0002, property GROUP_MEMBERS
    • MARIO type 0x0001, property GROUPS_I'M_IN
    • NOPASSUSER type 0x0001, property GROUPS_I'M_IN
    • GUEST type 0x0001, property GROUPS_I'M_IN

NCP endpoint SDK documentation / stub audit

Current status:

  • Several legacy NCP endpoints in src/nwconn.c are implemented only as disabled stubs, explicit 0xfb unsupported replies, or success/no-op dummies.
  • The known candidates now have inline SDK-context comments so future work can start from the documented wire semantics instead of from guesswork.

Follow-up:

  • Implement or deliberately reject remaining endpoint gaps after client evidence or direct protocol tests.
  • Keep SDK details close to the corresponding endpoint in nwconn.c, and keep broader prioritization/status here in TODO.md.

NCP endpoint audit tracking

Current status:

  • src/nwconn.c contains a mix of implemented, forwarded, partial, dummy, and intentionally unsupported NCP endpoints.
  • Endpoint comments should be aligned with the Novell SDK Web documentation, SDK headers, the Rust nwserver implementation, lwared, and the existing mars_nwe admin/Pascal code where those sources cover the same call.

Follow-up:

  • Keep inline TODO: comments only where endpoint behavior is incomplete, approximate, intentionally dummy/no-op, or still needs SDK layout verification.
  • Mirror every real incomplete endpoint in this file so follow-up work remains visible outside the source code.
  • Do not treat every return(-1) in nwconn.c as incomplete: many of those paths intentionally forward bindery/global-server work to nwbind.
  • When an endpoint returns to nwbind, keep the audit paired: the dispatcher comment in nwconn.c should name the handoff, and the concrete parser in nwbind.c should carry the request/reply layout. This was rechecked for the currently documented forwarded paths: message group 0x2222/21, quota prehandling in Directory Services 0x2222/22, File Server Environment 0x2222/23, End of Job 0x2222/24, Logout 0x2222/25, and Semaphore 0x2222/32.

NCP endpoint layout audit (version-bucketed compatibility)

Current status:

  • The default NCP endpoint audit is scoped to compatibility calls through NetWare 3.x. NetWare 1.x/2.x legacy calls are part of that compatibility target when they are documented, but they should be kept in their own buckets instead of being mixed into the 3.x/default list.
  • Bucket endpoints by the oldest generation that documents or requires them: 1.x/2.x legacy first, then remaining through-3.x compatibility calls, then a separate NetWare 4.x planning/stub bucket for later work.
  • Keep SDK request/reply details close to the corresponding endpoint in the source file that handles the call. If nwconn.c forwards a group to nwbind.c, document the handoff in nwconn.c and the concrete subfunctions in nwbind.c.
  • Documentation-only audit patches should not change parsing or reply behavior; record observed differences here for later implementation or compatibility testing. Compare against the local NDK/Core Protocols PDF, the WebSDK HTML, and the uploaded SDK include prototypes when those sources cover the call.
  • MARS_NWE_4 is hard-disabled in include/config.h.cmake. Do not move or wrap already implemented code just because it is 4.x-era; only new, unimplemented 4.x stubs should be guarded with #if MARS_NWE_4.

Version buckets for endpoints documented so far

NetWare 1.x/2.x legacy bucket:

  • Old direct file/logical/physical synchronization calls: 0x2222/01 through 0x2222/0e where documented by the legacy SDK/PDF.
  • Old direct utility/message handoff calls around 0x2222/12 through 0x2222/15, including the 1.x/2.x-compatible broadcast subfunctions handled in src/nwbind.c.
  • Older directory-handle compatibility calls that the local PDF marks as early NetWare compatibility, especially 0x2222/22/17 and 0x2222/22/18.

NetWare 3.x/default compatibility bucket:

  • Remaining documented 0x2222/22 Directory Services calls through the NetWare-3.x-compatible namespace/directory range ending at 22/48, unless a specific call is proven to belong to the older bucket above.
  • Salvage compatibility is part of this default bucket where the old 22/27, 22/28, 22/29 bridges map to the newer salvage backend.

NetWare 4.x planning/stub bucket:

  • 0x2222/22/50 Get Object Effective Rights for Directory Entry and 0x2222/22/51 Get Extended Volume Information are documented by the local NDK/Core Protocols PDF as NetWare 4.x/5.x calls and are also visible through the uploaded WebSDK/include material (NWGetObjectEffectiveRights, NWGetExtendedVolumeInfo).
  • MARS-NWE already has active compatibility implementations for these two calls; leave that code in place. Track them in the 4.x bucket for future cleanup, tests, and field mapping rather than moving them into the default 3.x TODO list or hiding them behind MARS_NWE_4.
  • Any additional not-yet-implemented NetWare 4.x endpoint discovered later should be documented as a plan and, if a source stub is useful, guarded with #if MARS_NWE_4 while the macro remains 0. Do not add source stubs merely for NetWare 5.x/OES/MOAB/newer endpoints during the current audit.

SDK-listed 0x2222 blocks not yet endpoint-audited

Current status:

  • The local NDK/Core-Protocols PDF and uploaded WebSDK/includes list several 0x2222 endpoint families that are not yet covered by the detailed per-endpoint audit above. This section is an index only; do not treat an entry here as implemented, missing, or in-scope until the block is compared against the real dispatcher and bucketed by the oldest documented NetWare generation.
  • Use SDK/PDF decimal numbers plus wire hex when drilling into a block. For example, SDK group 0x2222/23 is the top-level wire case 0x17; SDK group 0x2222/89 would be top-level wire case 0x59.

Present in the code but not yet fully endpoint-audited:

  • SDK 0x2222/23 / wire 0x17 File Server Environment: the audit has started with file-information, login/connection, and bindery-object calls. Remaining property, set, password, queue, and management/admin subfunctions still need the same PDF/WebSDK/include comparison in src/nwbind.c and the related queue prehandlers.
  • SDK 0x2222/34 / wire 0x22 TTS calls are present in src/nwconn.c and have been endpoint-audited as an unsupported/no-rollback compatibility group.
  • SDK 0x2222/35 / wire 0x23 AFP calls are present in src/nwconn.c and have been endpoint-audited as the AFP/Mac namespace compatibility block. AFP has separate smoke coverage under tests/afp/; future fixes should be driven by those tests and client traces rather than a new parallel metadata store.
  • SDK 0x2222/65 through 77 / wire 0x41 through 0x4d are old direct file open/create/read/write/rename/time/copy calls present in src/nwconn.c; they have been endpoint-audited as the old direct file-I/O compatibility block. Follow-up fixes, if any, should be driven by client traces, especially around the old six-byte file-handle layout and the 65 Open File (old) access-rights compatibility note.
  • SDK 0x2222/86 / wire 0x56 Extended Attribute is endpoint-audited as a compatibility shim block in src/nwconn.c and src/namspace.c; see the Extended Attribute section below for the exact per-subfunction status.
  • SDK 0x2222/87 / wire 0x57 Name Space is endpoint-audited for the current 1.x/2.x/3.x plus planned-4.x scope. Later-generation high selectors 87/44 and 87/64..87/69 are documented as out of current source-stub scope.
  • SDK 0x2222/97 / wire 0x61 Get Big Packet NCP Max Packet Size and SDK 0x2222/101 / wire 0x65 Packet Burst Connection Request are present in src/nwconn.c and endpoint-audited as the 4.x-era packet-burst negotiation and setup paths. The follow-on 0x7777 packet-burst data-plane handler is also documented, but it is not a normal 0x2222 endpoint.
  • SDK 0x2222/104 / wire 0x68 NDS/NCP fragger is endpoint-audited as planned NetWare-4.x/NDS work. The top-level source case remains active as unsupported (0xfb), while the documented 104/01..104/08 selector slots are recorded behind #if MARS_NWE_4 in src/nwconn.c.

SDK-listed blocks that do not currently show a top-level handler in src/nwconn.c:

  • SDK 0x2222/17 / wire 0x11 Print/Spool group. The PDF lists old print calls such as Write To Spool File, Close Spool File, Set Spool File Flags, Spool A Disk File, Get Printer Status, Create Spool File, and Get Printer's Queue. No top-level case 0x11 has been identified in src/nwconn.c yet.
  • SDK 0x2222/36 and 0x2222/37 / wire 0x24 and 0x25 NCP Extension families. The PDF lists extension-info and execute-extension calls; no top-level handlers have been identified yet. Bucket by generation before adding any #if MARS_NWE_4 stubs.
  • SDK 0x2222/79, 0x2222/84, and 0x2222/85 / wire 0x4f, 0x54, and 0x55 are listed by the SDK/PDF for later file/extended-data functions, but no top-level handlers have been identified yet.
  • SDK 0x2222/90 / wire 0x5a Data Migration/Compression/Parse Tree, SDK 0x2222/92 / wire 0x5c SecretStore, SDK 0x2222/123 / wire 0x7b service-address enumeration, and SDK 0x2222/131 / wire 0x83 RPC/NLM-control style calls appear in the PDF/WebSDK index but do not currently show top-level handlers in src/nwconn.c. These are likely later-generation buckets, but each must be confirmed against the includes/WebSDK before adding guarded stubs. Only endpoints bucketed as 1.x/2.x/3.x compatibility or planned 4.x work should receive disabled source stubs.

Follow-up:

  • When auditing one of these blocks, first check whether an existing handler is reached through nwconn.c, nwbind.c, or a queue/salvage/helper prehandler. Only add a missing-endpoint TODO or guarded stub after that handoff search.
  • Do not add every later SDK-listed endpoint to the active TODO list. Put NetWare 4.x items in the NetWare 4.x planning bucket, and only add a disabled #if MARS_NWE_4 stub when that 4.x planning marker is useful and no existing implementation is present. NetWare 5.x/OES/MOAB/newer items should remain prose-only/out-of-scope unless the target scope changes.

Old direct file/logical/physical synchronization calls

Current status:

  • The old direct synchronization family in src/nwconn.c is annotated with Novell SDK endpoint names and request-layout notes.
  • NCP 0x01 File Set Lock (old) and NCP 0x02 File Release Lock are documented in the SDK but are not implemented in MARS-NWE yet. Inline documentation and commented case/break stubs are present in src/nwconn.c.
  • NCP 0x03 Log File (old) is implemented, but still belongs on the audit list because the original source already marked this old log/lock area as not well tested.
  • NCP 0x04 Lock File Set (old) and NCP 0x6a Lock File Set share the current implementation. The SDK documents the old 0x04 timeout word as Lo-Hi and the newer 0x6a timeout word as Hi-Lo; MARS-NWE currently reads the shared field with GET_BE16(). This is documented inline but not changed yet.
  • NCP 0x05 Release File (old) and NCP 0x07 Clear File (old) have request parsing that matches the documented old header offsets.
  • NCP 0x06 Release File Set and NCP 0x08 Clear File Set are implemented, but the SDK request contains a LockFlag byte that the current code does not read. This parser difference is documented inline but not changed yet.
  • NCP 0x09 Log Logical Record (old), NCP 0x0a Lock Logical Record Set (old), NCP 0x0b Clear Logical Record, and NCP 0x0c Release Logical Record have inline SDK request-layout documentation. The direct old endpoints have been compared against the NDK/Core Protocols PDF request offsets.
  • NCP 0x0d Release Logical Record Set and NCP 0x0e Clear Logical Record Set are implemented, but the SDK request contains a LockFlag byte that the current code does not read. This parser difference is documented inline but not changed yet.
  • NCP 0x1a Log Physical Record (old), 0x1c Release Physical Record, and 0x1e Clear Physical Record are implemented and now have inline request layout documentation. The parser matches the documented 6-byte handle position by ignoring the high/reserved two bytes and using the low 4-byte handle; offsets, lengths, and the Log Physical Record timeout are read as Hi-Lo.
  • NCP 0x1b Lock Physical Record Set (old) and the newer 0x6e Lock Physical Record Set share one handler. The SDK/PDF documents old 0x1b LockTimeout as Lo-Hi and newer 0x6e as Hi-Lo, while MARS-NWE currently reads the shared field with GET_BE16(). The current LockFlag mapping also treats bit 1 as shareable/read-only and the unset case as exclusive/read-write, which is the inverse of the NDK/Core-Protocols text.
  • NCP 0x1d Release Physical Record Set and 0x1f Clear Physical Record Set are implemented, but both SDK requests contain a LockFlags byte that the current code does not read. The reply has no payload and completion reports the set-operation result.

Follow-up:

  • Decide whether NCP 0x01 and NCP 0x02 should be implemented for real old-client compatibility or should return a deliberate 0xfb unsupported completion with normalized endpoint logging.
  • Verify NCP 0x03 Log File (old) against a real DOS requester or direct test caller; the documented PDF/WebSDK request offsets already match the current parser.
  • Decide whether the shared 0x04/0x6a parser should keep the current big-endian timeout read for both functions or special-case old 0x04 as documented Lo-Hi after direct requester evidence is available.
  • Decide whether 0x06, 0x08, 0x0d, and 0x0e should consume or ignore the documented LockFlag byte after direct requester evidence is available.
  • Decide whether 0x0a should keep the current big-endian timeout read or special-case the documented old Lo-Hi byte order after direct requester evidence is available.
  • Continue direct requester or NWTESTS coverage for the file, logical-record, and physical-record synchronization calls that are now wired.
  • Decide whether the shared 0x1b/0x6e physical-record-set parser should special-case old 0x1b LockTimeout as documented Lo-Hi, and whether the LockFlag bit-1 mapping should follow the PDF text or preserve current compatibility behavior.
  • Decide whether 0x1d and 0x1f should consume or continue ignoring the documented LockFlags byte after direct requester evidence is available.

Legacy utility and message/broadcast calls

Current status:

  • NCP 0x12 Get Volume Info with Number, NCP 0x13 Get Station Number, NCP 0x14 Get File Server Date And Time, and the NCP 0x15 message group handoff have inline SDK request/reply layout documentation.
  • The forwarded NetWare 1.x/2.x/3.x-compatible NCP 0x15 message subfunctions in src/nwbind.c have inline SDK request/reply layout documentation for broadcast send/get, enable/disable, and console broadcast calls. The missing-endpoint pass for this group found implemented SDK 21/00, 21/01, 21/02, 21/03, 21/09, 21/10, and 21/11; no default-compatibility server NCPs were found for 21/04..21/08.
  • SDK 21/12 Connection Message Control is documented as NetWare 5.x, so it remains outside the default through-3.x endpoint target. Do not add it unless the later-generation feature work is explicitly enabled.
  • NCP 0x13 Get Station Number is documented by the SDK as a three-byte StationNumber reply; MARS-NWE currently returns only the low one-byte connection number. This parser/reply difference is documented inline but not changed yet.

Follow-up:

  • Verify whether the current one-byte 0x13 reply is required by old clients or whether the SDK three-byte StationNumber reply should be implemented.
  • Verify NCP 0x2222/21/10 Send Broadcast Message with a real client before changing the parser: the NDK/Core Protocols PDF page documents long connection numbers and long completion flags, while the CLIB/WebSDK NWSendBroadcastMessage prototype exposes a 16-bit connection list and byte result list, matching the current compatibility parser.

Directory Services group 0x2222/22

Current status:

  • NCP 0x2222/22 is handled in src/nwconn.c, with selected quota-related subfunctions forwarded to src/nwbind.c for bindery/ObjectID prehandling.
  • The group header is documented inline as SubFuncStrucLen (Hi-Lo), SubFunctionCode, and subfunction payload.
  • Endpoint numbers in SDK/PDF/WebSDK prose are decimal unless the source explicitly prefixes them with 0x. The wire case byte is listed below whenever decimal and hex notation can be confused.
  • Already audited and inline-documented default-compatibility calls:
    • SDK 22/00 / wire 0x00 Set Directory Handle
    • SDK 22/01 / wire 0x01 Get Directory Path
    • SDK 22/02 / wire 0x02 Scan Directory Information
    • SDK 22/03 / wire 0x03 Get Effective Directory Rights
    • SDK 22/04 / wire 0x04 Modify Maximum Rights Mask
    • SDK 22/05 / wire 0x05 Get Volume Number
    • SDK 22/06 / wire 0x06 Get Volume Name
    • SDK 22/10 / wire 0x0a Create Directory
    • SDK 22/11 / wire 0x0b Delete Directory
    • SDK 22/13 / wire 0x0d Add Trustee to Directory
    • SDK 22/14 / wire 0x0e Delete Trustee from Directory
    • SDK 22/15 / wire 0x0f Rename Directory
    • SDK 22/18 / wire 0x12 Allocate Permanent Directory Handle
    • SDK 22/19 / wire 0x13 Allocate Temporary Directory Handle
    • SDK 22/20 / wire 0x14 Deallocate Directory Handle
    • SDK 22/21 / wire 0x15 Get Volume Info with Handle
    • SDK 22/22 / wire 0x16 Allocate Special Temporary Directory Handle
    • SDK 22/23 / wire 0x17 Extract a Base Handle
    • SDK 22/24 / wire 0x18 Restore an Extracted Base Handle
    • SDK 22/25 / wire 0x19 Set Directory Information
    • SDK 22/26 / wire 0x1a Get Path Name of a Volume-Directory Number Pair
    • SDK 22/27 / wire 0x1b Scan Salvageable Files (old)
    • SDK 22/28 / wire 0x1c Recover Salvageable File (old)
    • SDK 22/29 / wire 0x1d Purge Salvageable File (old)
    • SDK 22/30 / wire 0x1e Scan a Directory
    • SDK 22/31 / wire 0x1f Get Directory Entry
    • SDK 22/32 / wire 0x20 Scan Volume's User Disk Restrictions
    • SDK 22/33 / wire 0x21 Add User Disk Space Restriction
    • SDK 22/34 / wire 0x22 Remove User Disk Space Restrictions
    • SDK 22/37 / wire 0x25 Set Directory Entry Information
    • SDK 22/38 / wire 0x26 Scan File or Directory for Extended Trustees
    • SDK 22/39 / wire 0x27 Add Extended Trustee to Directory or File
    • SDK 22/40 / wire 0x28 Scan Directory Disk Space
    • SDK 22/41 / wire 0x29 Get Object Disk Usage and Restrictions
    • SDK 22/42 / wire 0x2a Get Effective Rights for Directory Entry
    • SDK 22/43 / wire 0x2b Remove Extended Trustee from Dir or File
    • SDK 22/44 / wire 0x2c Get Volume and Purge Information
    • SDK 22/45 / wire 0x2d Get Directory Information
    • SDK 22/46 / wire 0x2e Rename Or Move (old)
    • SDK 22/47 / wire 0x2f Get Name Space Information
    • SDK 22/48 / wire 0x30 Get Name Space Directory Entry
  • Already audited NetWare 4.x planning-bucket calls with existing active MARS-NWE implementations:
    • SDK 22/50 / wire 0x32 Get Object Effective Rights for Directory Entry
    • SDK 22/51 / wire 0x33 Get Extended Volume Information These are not part of the default 1.x/2.x/3.x implementation TODO list, but existing compatibility code remains active.
  • The old SDK PDF table for SDK 22/00 repeats TargetDirectoryHandle for the second payload byte, but the remarks describe a source handle; MARS-NWE parses the byte as SourceDirectoryHandle. This is documented inline but not changed.
  • No NetWare 1.x/2.x/3.x SDK/PDF entries were found for direct SDK 22/07, 22/08, or 22/09 during this audit. The next documented direct directory calls continue at SDK 22/10 / wire 0x0a.
  • WebSDK/PDF recheck found SDK 22/12 / wire 0x0c Scan Directory for Trustees. Do not confuse this with the already implemented wire case 0x12 / SDK 22/18 Allocate Permanent Directory Handle. Scan Directory for Trustees has only a disabled inline stub for now.
  • WebSDK/PDF also documents SDK 22/35 / wire 0x23 Get Directory Disk Space Restriction and SDK 22/36 / wire 0x24 Set Directory Disk Space Restriction as NetWare 3.x-compatible directory quota calls. They are not active cases in this dispatcher yet; disabled inline stubs now sit at their numeric wire slots between SDK 22/34 / wire 0x22 and SDK 22/37 / wire 0x25.
  • SDK 22/13 / wire 0x0d and SDK 22/14 / wire 0x0e match the SDK/PDF payload layouts. SDK 22/15 / wire 0x0f matches the payload layout; the old PDF labels this call's SubFuncStrucLen as Lo-Hi, but MARS-NWE dispatches the group before using that length word and the surrounding NCP 22 group header is otherwise documented as Hi-Lo.
  • SDK 22/10 / wire 0x0a and SDK 22/11 / wire 0x0b preserve the documented offset of DirectoryAccessMask, but the current implementation does not use that field when creating or deleting the directory.
  • SDK 22/18, 22/19, 22/22, 22/20, and 22/21 request parsers match the documented NetWare 1.x/2.x/3.x payload offsets.
  • SDK 22/23 / wire 0x17 and SDK 22/24 / wire 0x18 now have inline request/reply layout documentation. The current parsers match the actual payload fields, but the local NDK/Core Protocols PDF tables for this older NetWare 2.x save/restore pair contain header/length wording that does not line up cleanly with the common 0x2222/22 group header. This is documented inline and no behavior was changed.
  • SDK 22/25, 22/26, 22/27, and 22/29 match the documented request payload offsets. SDK 22/26 uses the old 16-bit directory-entry-number form; the WebSDK table does not spell out byte order for that word, while MARS-NWE reads it as Hi-Lo.
  • SDK 22/28 validates the documented old/new filename fields, but the current backend call recovers by directory handle and sequence only and does not pass the old/new names to the salvage backend.
  • SDK 22/30 / wire 0x1e matches the documented offsets, but the SDK documents Sequence as Lo-Hi while the current parser reads it with GET_BE32().
  • SDK 22/31 / wire 0x1f consumes the documented DirectoryHandle; legacy source comments expected two extra unknown bytes after it, but the SDK request has no such fields and the helper ignores them.
  • SDK 22/32 / wire 0x20 reads VolumeNumber in the normal NCP 22 payload position, but the WebSDK/PDF table for this call shows VolumeNumber one byte later than the common group-header alignment. The code also reads Sequence with GET_BE32() although the SDK/PDF documents Lo-Hi; treat both as audit items until verified with a direct test caller.
  • SDK 22/33 and 22/34 are forwarded to nwbind.c for quota prehandling; both layers are documented. The shared nwbind prehandler reads ObjectID from the documented payload position. SDK 22/33 includes a documented DiskSpaceLimit field, but the current shared prehandler does not consume it before returning the uid/gid/permission tuple.
  • SDK 22/38, 22/39, and 22/41 match the documented request payload offsets.
  • SDK 22/37 matches the documented payload field order, but the current parser reads Sequence with GET_BE32() although the SDK/PDF documents Lo-Hi.
  • SDK 22/40 matches the documented payload offsets, but the current parser reads Sequence with GET_BE32() although the SDK/PDF documents Lo-Hi; it also returns the normal directory scan structure from nw_scan_a_directory() rather than the full documented Scan Directory Disk Space reply.
  • SDK 22/42, 22/43, 22/45, 22/46, and 22/47 match the NetWare 1.x/2.x/3.x SDK/PDF payload offsets used by the current parser.
  • SDK 22/44 / wire 0x2c matches the documented request offset, but the PDF marks TotalBlocks as Hi-Lo while the remaining 32-bit counters are Lo-Hi; current code uses U32_TO_32() for all counters.
  • SDK 22/48 / wire 0x30 matches the documented payload offsets; the PDF does not label the DOSSequence byte order, and current code reads it with GET_32().

Follow-up:

  • Implement or intentionally reject SDK 22/12 / wire 0x0c Scan Directory for Trustees. Do not confuse the SDK decimal subfunction number 12 with the already implemented wire case 0x12 / SDK 22/18 directory-handle call.
  • Implement or intentionally reject SDK 22/35 / wire 0x23 Get Directory Disk Space Restriction and SDK 22/36 / wire 0x24 Set Directory Disk Space Restriction. Both are NetWare 3.x-compatible, not MARS_NWE_4 work.
  • Verify the documented SDK 22/00 source-handle interpretation against an old requester or direct test caller before changing behavior.
  • Decide whether SDK 22/10 / wire 0x0a and SDK 22/11 / wire 0x0b should apply or validate the documented DirectoryAccessMask byte, or whether ignoring it is required for old requester compatibility.
  • Verify SDK 22/23 / wire 0x17 and SDK 22/24 / wire 0x18 against an old requester or direct test caller before changing the conservative connection-local implementation; the SDK/PDF tables for those two NetWare 2.x calls are less internally consistent than the surrounding directory-handle calls.
  • Verify SDK 22/26 directory-entry-number byte order against an old requester or direct test caller before changing the current Hi-Lo interpretation.
  • Decide whether SDK 22/28 should pass the documented old/new filename fields to the salvage backend, or whether sequence-only recovery is sufficient for old requester compatibility.
  • Verify SDK 22/30 Sequence byte order; current code uses GET_BE32() although the SDK/WebSDK documents Lo-Hi.
  • Verify whether SDK 22/31 should continue accepting legacy callers that send the two extra bytes described by the old source comment, even though the SDK request only contains DirectoryHandle.
  • Verify SDK 22/32 VolumeNumber offset and Sequence byte order against a direct test caller; the WebSDK table appears shifted by one byte compared with the normal NCP 22 group header, and current code uses GET_BE32() although the SDK/PDF documents Lo-Hi.
  • Decide whether SDK 22/33 should pass the documented DiskSpaceLimit through the quota prehandling path or whether the current behavior is intentionally handled later in the quota backend.
  • Verify SDK 22/37 Sequence byte order; current code uses GET_BE32() although the SDK/PDF documents Lo-Hi.
  • Verify SDK 22/40 Sequence byte order and reply shape; current code uses GET_BE32() and delegates to the normal directory scan reply rather than the documented Scan Directory Disk Space reply.
  • Verify SDK 22/44 Volume and Purge Information reply byte order for TotalBlocks; the SDK/PDF marks only that field as Hi-Lo, while current code emits all 32-bit counters with U32_TO_32().
  • Verify SDK 22/48 DOSSequence byte order against an old requester or direct test caller; current code uses GET_32() and the PDF table does not spell out the order for that field.
  • The NetWare 1.x/2.x/3.x-compatible 0x2222/22 endpoint layout pass is covered through the documented SDK 22/48 namespace call, with the newly found SDK 22/12, 22/35, and 22/36 gaps tracked as disabled stubs/TODO items. Continue with the next compatibility group after this block; 5.x/OES-only groups are not current stub targets.

Semaphore group 0x2222/32

Current status:

  • Direct NCP 0x2222/32 / wire 0x20 is forwarded unchanged from src/nwconn.c to src/nwbind.c, which passes requestdata[0] as the semaphore subfunction and requestdata[1..] to handle_func_0x20() in src/sema.c.
  • The NetWare 2.x/3.x-compatible old semaphore subfunctions are now documented at their real parser/reply site in src/sema.c:
    • SDK 32/00 / wire subfunction 0x00 Open Semaphore (old)
    • SDK 32/01 / wire subfunction 0x01 Examine Semaphore (old)
    • SDK 32/02 / wire subfunction 0x02 Wait On Semaphore (old)
    • SDK 32/03 / wire subfunction 0x03 Signal Semaphore (old)
    • SDK 32/04 / wire subfunction 0x04 Close Semaphore (old)
  • Request and response payloads were compared against the NDK/Core Protocols PDF, the extracted WebSDK semaphore pages, and nwsync.h. The old 32/00 through 32/04 operations line up with the currently implemented operation set.

Known differences / follow-up:

  • The PDF/WebSDK tables label SemaphoreHandle as long Lo-Hi. The current src/sema.c implementation parses and emits semaphore handles with GET_BE32() / U32_TO_BE32() while parsing SemaphoreTimeOut as Hi-Lo with GET_BE16(). Keep this documented as a compatibility detail until packet traces or client tests prove the expected wire order for MARS-NWE clients.
  • Wait On Semaphore currently does not sleep until SemaphoreTimeOut; the simple emulator returns timeout immediately when the semaphore value is not available.
  • Newer SDK 0x2222/111 semaphore calls are the modern paired variants and are not routed through this compatibility handler.

Direct connection lifecycle and buffer-size calls

Current status:

  • Direct NCP 0x2222/24 / wire function 0x18 End Of Job is implemented as a paired nwconn.c/nwbind.c handoff. The PDF/WebSDK request has no payload after FunctionCode 24 and the reply has no payload. nwconn.c releases task-local handles and jobs first; nwbind.c closes matching print jobs and sends the final empty success reply.
  • Direct NCP 0x2222/25 / wire function 0x19 Logout is implemented as a paired nwconn.c/nwbind.c handoff. The PDF/WebSDK request has no payload after FunctionCode 25 and the reply has no payload. nwconn.c releases local queue/file/user state; nwbind.c closes remaining print jobs, writes logout accounting state, clears bindery identity fields, and sends the final empty success reply.
  • Direct NCP 0x2222/33 / wire function 0x21 Negotiate Buffer Size is handled entirely in src/nwconn.c. The request is ProposedBufferSize as a Hi-Lo word and the reply is AcceptedBufferSize as a Hi-Lo word. The current parser/reply match the documented order. MARS-NWE clamps valid proposals to LOC_RW_BUFFERSIZE; proposals below 512 leave the existing/default negotiated size in force and return that value.

Missing-endpoint check:

  • These three are direct functions, not nested subfunction groups. No additional subfunctions are listed under SDK 24, SDK 25, or SDK 33 in the local NDK/Core-Protocols PDF/WebSDK material.

Retrospective endpoint coverage rule for audited blocks

Current status:

  • From this point on, each endpoint-family patch should first list the SDK/PDF/WebSDK endpoints in that family, then compare that list against the real dispatcher cases and any forwarded target handlers before documenting individual request/reply layouts.
  • Apply the same rule retroactively when touching an already-audited family: message 0x2222/21, directory/quota 0x2222/22, file-server environment 0x2222/23, direct lifecycle 0x2222/24 and 0x2222/25, semaphore 0x2222/32, and buffer negotiation 0x2222/33 should each state whether missing endpoints were checked, and whether the family has active code, disabled future stubs, or no top-level handler.
  • A disabled #if 0 stub is only a documentation/slot marker. Do not assign return(-1) forwarding semantics to such stubs in nwbind.c; that special forwarding meaning belongs to nwconn.c's handle_ncp_serv() path.

File Server Environment group 0x2222/23

Current status:

  • NCP 0x2222/23 is handled in src/nwconn.c for the locally parsed file-information subfunctions, while other login, bindery, queue, and management subfunctions are forwarded to src/nwbind.c or existing queue prehandlers.

  • The group header is documented inline as SubFuncStrucLen (Hi-Lo), SubFunctionCode, and subfunction payload.

  • Endpoint numbers in SDK/PDF/WebSDK prose are decimal unless explicitly prefixed. The local/forwarded subfunction cases audited so far are:

    • SDK 23/00 / wire 0x00 Login User (old) -- disabled future stub
    • SDK 23/01 / wire 0x01 Change User Password (old) -- hard failure stub
    • SDK 23/02 / wire 0x02 Get User Connection List (old) -- disabled future stub
    • SDK 23/05 / wire 0x05 Get Station's Logged Info (old) -- disabled future stub
    • SDK 23/12 / wire 0x0c Verify Serialization -- hard failure stub
    • SDK 23/15 / wire 0x0f Scan File Information
    • SDK 23/16 / wire 0x10 Set File Information
    • SDK 23/17 / wire 0x11 Get File Server Information
    • SDK 23/18 / wire 0x12 Get Network Serial Number
    • SDK 23/19 / wire 0x13 Get Internet Address (old)
    • SDK 23/20 / wire 0x14 Login Object
    • SDK 23/21 / wire 0x15 Get Object Connection List (old)
    • SDK 23/22 / wire 0x16 Get Station's Logged Info (old)
    • SDK 23/23 / wire 0x17 Get Login Key
    • SDK 23/24 / wire 0x18 Keyed Object Login
    • SDK 23/26 / wire 0x1a Get Internet Address
    • SDK 23/27 / wire 0x1b Get Object Connection List
    • SDK 23/28 / wire 0x1c Get Station's Logged Info
    • SDK 23/50 / wire 0x32 Create Bindery Object
    • SDK 23/51 / wire 0x33 Delete Bindery Object
    • SDK 23/52 / wire 0x34 Rename Object
    • SDK 23/53 / wire 0x35 Get Bindery Object ID
    • SDK 23/54 / wire 0x36 Get Bindery Object Name
    • SDK 23/55 / wire 0x37 Scan Bindery Object
    • SDK 23/56 / wire 0x38 Change Bindery Object Security
    • SDK 23/57 / wire 0x39 Create Property
    • SDK 23/58 / wire 0x3a Delete Property
    • SDK 23/59 / wire 0x3b Change Property Security
    • SDK 23/60 / wire 0x3c Scan Property
    • SDK 23/61 / wire 0x3d Read Property Value
    • SDK 23/62 / wire 0x3e Write Property Value
    • SDK 23/63 / wire 0x3f Verify Bindery Object Password -- disabled future stub
    • SDK 23/64 / wire 0x40 Change Bindery Object Password
    • SDK 23/65 / wire 0x41 Add Bindery Object To Set
    • SDK 23/66 / wire 0x42 Delete Bindery Object From Set
    • SDK 23/67 / wire 0x43 Is Bindery Object In Set
    • SDK 23/68 / wire 0x44 Close Bindery
    • SDK 23/69 / wire 0x45 Open Bindery
    • SDK 23/70 / wire 0x46 Get Bindery Access Level
    • SDK 23/71 / wire 0x47 Scan Bindery Object Trustee Paths
    • SDK 23/72 / wire 0x48 Get Bindery Object Access Level
    • SDK 23/73 / wire 0x49 Is Calling Station A Manager
    • SDK 23/74 / wire 0x4a Keyed Verify Password
    • SDK 23/75 / wire 0x4b Keyed Change Password
    • SDK 23/76 / wire 0x4c List Relations Of An Object
    • SDK 23/100 / wire 0x64 Create Queue
    • SDK 23/101 / wire 0x65 Destroy Queue
    • SDK 23/102 / wire 0x66 Read Queue Current Status (old)
    • SDK 23/103 / wire 0x67 Set Queue Current Status (old)
    • SDK 23/104 / wire 0x68 Create Queue Job And File (old)
    • SDK 23/105 / wire 0x69 Close File And Start Queue Job (old)
    • SDK 23/106 / wire 0x6a Remove Job From Queue (old)
    • SDK 23/107 / wire 0x6b Get Queue Job List (old)
    • SDK 23/108 / wire 0x6c Read Queue Job Entry (old)
    • SDK 23/109 / wire 0x6d Change Queue Job Entry (old)
    • SDK 23/110 / wire 0x6e Change Queue Job Position -- disabled future stub
    • SDK 23/111 / wire 0x6f Attach Queue Server To Queue
    • SDK 23/112 / wire 0x70 Detach Queue Server From Queue
    • SDK 23/113 / wire 0x71 Service Queue Job (old)
    • SDK 23/114 / wire 0x72 Finish Servicing Queue Job (old)
    • SDK 23/115 / wire 0x73 Abort Servicing Queue Job (old)
    • SDK 23/116 / wire 0x74 Change To Client Rights (old) -- disabled future stub
    • SDK 23/117 / wire 0x75 Restore Queue Server Rights -- disabled future stub
    • SDK 23/118 / wire 0x76 Read Queue Server Current Status (old) -- disabled future stub
    • SDK 23/119 / wire 0x77 Set Queue Server Current Status -- disabled future stub
    • SDK 23/120 / wire 0x78 Get Queue Job File Size (old)
    • SDK 23/121 / wire 0x79 Create Queue Job And File
    • SDK 23/122 / wire 0x7a Read Queue Job Entry
    • SDK 23/126 / wire 0x7e Set Queue Current Status
    • SDK 23/127 / wire 0x7f Close File And Start Queue Job
    • SDK 23/128 / wire 0x80 Remove Job From Queue
    • SDK 23/129 / wire 0x81 Get Queue Job List
    • SDK 23/130 / wire 0x82 Change Job Priority -- disabled future stub
    • SDK 23/131 / wire 0x83 Finish Servicing Queue Job
    • SDK 23/132 / wire 0x84 Abort Servicing Queue Job
    • SDK 23/133 / wire 0x85 Change To Client Rights -- disabled future stub
    • SDK 23/134 / wire 0x86 Read Queue Server Current Status -- disabled future stub
    • SDK 23/135 / wire 0x87 Get Queue Job File Size
    • SDK 23/200 / wire 0xc8 Check Console Privileges
    • SDK 23/201 / wire 0xc9 Get File Server Description Strings
    • SDK 23/202 / wire 0xca Set File Server Date And Time -- disabled future stub
    • SDK 23/203 / wire 0xcb Disable File Server Login -- disabled future stub
    • SDK 23/204 / wire 0xcc Enable File Server Login -- disabled future stub
    • SDK 23/205 / wire 0xcd Get File Server Login Status
    • SDK 23/207 / wire 0xcf Disable Transaction Tracking -- disabled future stub
    • SDK 23/208 / wire 0xd0 Enable Transaction Tracking -- disabled future stub
    • SDK 23/209 / wire 0xd1 Send Console Broadcast (old)
    • SDK 23/210 / wire 0xd2 Clear Connection Number (old)
    • SDK 23/211 / wire 0xd3 Down File Server
    • SDK 23/232 / wire 0xe8 Get File Server Misc Information -- disabled future stub
    • SDK 23/235 / wire 0xeb Get Connection's Open Files -- disabled future stub
    • SDK 23/253 / wire 0xfd Send Console Broadcast -- disabled future stub
    • SDK 23/254 / wire 0xfe Clear Connection Number -- disabled future stub
  • SDK 23/15 request payload offsets match the current parser: LastSearchIndex, DirectoryHandle, SearchAttributes, FileNameLen, and FileName. The reply shape also matches the documented fixed file information block. The SDK/PDF/WebSDK documents LastSearchIndex and NextSearchIndex as Lo-Hi words, while the current code uses GET_BE16() and U16_TO_BE16().

  • SDK 23/16 request payload field order matches the current parser. The code copies the documented status fields into NW_FILE_INFO after its 14-byte DOS-name prefix and then passes the documented directory handle, search attributes, and filename to nw_set_file_information().

  • Include cross-checks: NWScanFileInformation()/NWIntScanFileInformation() and NWSetFileInformation() in nwfile.h refer to this same SDK-level file-information family. The server/connection calls cross-check against NWGetFileServerInformation(), NWGetNetworkSerialNumber(), NWGetInternetAddress(), NWGetConnectionInformation(), NWGetObjectConnectionNumbers(), and related connection/server headers.

  • Bindery object calls SDK 23/50 through SDK 23/56 were compared against the NDK/Core-Protocols PDF, WebSDK API names, and nwbindry.h prototypes. The current nwbind.c parsers match the documented request payload order and Hi-Lo object type/object ID fields. Replies for SDK 23/53, 23/54, and 23/55 match the documented fixed bindery object reply blocks.

  • Bindery property calls SDK 23/57 through SDK 23/62 were compared against the NDK/Core-Protocols PDF, WebSDK API names, and nwbindry.h prototypes. The current nwbind.c parsers match the documented request payload order, including Hi-Lo ObjectType and Hi-Lo LastInstance/SearchInstance for SDK 23/60. Replies for SDK 23/60 and SDK 23/61 match the documented fixed property reply blocks. SDK 23/62 names the byte after SegmentNumber MoreFlag; the current local variable is named erase_segment, but it consumes that same byte.

  • Bindery password/set/access calls SDK 23/63 through SDK 23/76 were compared against the NDK/Core-Protocols PDF, WebSDK API names, and nwbindry.h prototypes where available. SDK 23/65 through SDK 23/67 share the documented object/property/member tuple and match the current parsers. SDK 23/68 and SDK 23/69 have no payload and are implemented as successful no-ops. SDK 23/70, 23/72, 23/73, 23/74, 23/75, and 23/76 match their documented request/reply layouts. SDK 23/71 is handled locally in src/nwconn.c because it resolves directory trustee paths; the disabled nwbind.c case comment now points back to that handler. SDK 23/63 / wire 0x3f is documented but not implemented, so a disabled future stub was added next to the surrounding bindery password calls. For SDK 23/64, the local NDK/Core-Protocols PDF text appears to contain a transposed set-member table; the WebSDK/include API shape matches the existing ObjectName/OldPassword/NewPassword parser.

  • Queue calls SDK 23/100 through SDK 23/108, queue-server and service calls SDK 23/109 through SDK 23/115, the old job-size call SDK 23/120, and the paired newer variants SDK 23/121 through SDK 23/129, SDK 23/131, SDK 23/132, and SDK 23/135 were compared against the nwqms.h prototypes and extracted WebSDK queue pages. src/nwconn.c performs required prehandling for queue path rewriting, queue-job file creation, queue job entry file-handle insertion, and close/start file association before forwarding to src/nwbind.c. The target handlers in nwbind.c now carry the concrete request/reply layout notes. The newer queue job-control calls that document 32-bit job numbers are intentionally noted where the current compatibility parser still consumes or emits old 16-bit job-number fields.

  • Remaining queue rights/status/priority calls SDK 23/110, SDK 23/116 through SDK 23/119, SDK 23/130, SDK 23/133, and SDK 23/134 were compared against the NDK/Core-Protocols PDF and nwqms.h/nwqueue.h prototypes. They are not implemented in the current queue backend. nwbind.c now documents them as disabled future stubs rather than leaving the wire slots implicit: job-position reorder, queue-server identity switch/restore, the per-server 64-byte status record, and newer long-priority/client-rights forms.

  • Console/server-management calls SDK 23/200 through SDK 23/211, plus SDK 23/232, SDK 23/235, SDK 23/253, and SDK 23/254, were compared against the NDK/Core-Protocols PDF and server/connection/message include prototypes (nwserver.h, nwconnec.h, nwmsg.h, and NLM nwenvrn.h). Implemented calls now carry inline layout notes in src/nwbind.c: console privilege check, description strings, login status, old console broadcast, old clear connection, and down server. Missing or non-modelled management calls are documented as disabled future stubs: set server date/time, enable and disable logins, enable and disable TTS, misc server information, open-file enumeration, new 32-bit console broadcast, and new 32-bit clear connection.

Follow-up:

  • Verify SDK 23/15 search-index byte order against a real old requester or direct test caller before changing the current big-endian parser/reply.
  • SDK 23/12 / wire 0x0c Verify Serialization is currently a hard failure stub; the PDF/WebSDK endpoint title is decimal 23/12, while one table row prints SubFunctionCode (212), so do not add a wire 0xd4 case without a packet trace or include-level confirmation.
  • SDK 23/17 / wire 0x11 returns the legacy server-info block; later PDF revisions name additional fields inside the current reserved tail. Keep the current behaviour until a client requires those fields.
  • SDK 23/18 / wire 0x12 documents the serial/application reply as Lo-Hi, while the current code writes both fields with big-endian helpers.
  • SDK 23/23 / wire 0x17 documents a TargetConnection byte, but the current implementation ignores it and returns a login key for the active connection.
  • SDK 23/27 / wire 0x1b documents SearchConnNumber and returned connection numbers as Lo-Hi long values; the current code reads the search number with GET_BE32() and returns 16-bit connection numbers.
  • Implement or deliberately hard-fail SDK 23/63 / wire 0x3f Verify Bindery Object Password; it is a NetWare 2.x/3.x compatibility call and is currently only a disabled documented stub.
  • Verify the shared queue handlers for newer queue calls that currently consume old 16-bit fields: SDK 23/122 / wire 0x7a, SDK 23/127 / wire 0x7f, SDK 23/128 / wire 0x80, SDK 23/131 / wire 0x83, SDK 23/132 / wire 0x84, and SDK 23/135 / wire 0x87 document long or Lo-Hi job-number fields in the WebSDK/include material, while the current compatibility parser often reuses the old 16-bit layout. SDK 23/126 / wire 0x7e also documents a long queue-status field but the shared parser consumes only one byte.
  • Implement or deliberately hard-fail the disabled queue future stubs once the queue backend can support their semantics: SDK 23/110 / wire 0x6e Change Queue Job Position, SDK 23/116 / wire 0x74 and SDK 23/133 / wire 0x85 Change To Client Rights, SDK 23/117 / wire 0x75 Restore Queue Server Rights, SDK 23/118 / wire 0x76 and SDK 23/134 / wire 0x86 Read Queue Server Current Status, SDK 23/119 / wire 0x77 Set Queue Server Current Status, and SDK 23/130 / wire 0x82 Change Job Priority.
  • SDK 23/205 / wire 0xcd Get File Server Login Status currently returns a one-byte enabled flag. The PDF documents a long UserLoginAllowed reply, while the CLIB/WebSDK prototype exposes a byte flag; verify expected wire length with a real client before changing the compatibility reply.
  • SDK 23/209 / wire 0xd1 Send Console Broadcast (old) is parsed as the old byte station-list form. The PDF table labels StationList as long[], but its own SubFuncStrucLen = 3 + NumberOfStations + MessageLen formula matches the byte-list parser; keep the newer 32-bit list in SDK 23/253 / wire 0xfd separate.
  • SDK 23/211 / wire 0xd3 Down File Server currently ignores the documented ForceFlag and always calls the local server-down path after supervisor-rights validation. Verify whether a non-forced request should fail when active files are open before changing behavior.
  • Implement or deliberately hard-fail the disabled management future stubs once the corresponding server state exists: SDK 23/202, SDK 23/203, SDK 23/204, SDK 23/207, SDK 23/208, SDK 23/232, SDK 23/235, SDK 23/253, and SDK 23/254.
  • Audit the remaining forwarded 0x2222/23 management subfunctions in the files that actually handle them instead of treating the nwconn.c forwarding points as complete local implementations.

Extended volume information field mapping

Current status:

  • NCP 0x16/0x33 Get Extended Volume Information returns the documented NWVolExtendedInfo reply and fills the core fields that can be derived from generic Unix filesystem statistics.
  • NetWare-specific fields that MARS-NWE does not currently model are returned as zero for now instead of guessed values.

Follow-up:

  • Fill additional NWVolExtendedInfo fields when reliable data is available from the backing filesystem or from MARS-NWE metadata.
  • Candidate fields include suballocation, deleted-file/limbo accounting, compression counters, migration counters, EA counters, Directory Services object id, and last-modified timestamp data.
  • Treat compression-related fields as real follow-up work rather than permanent zeroes; populate them only when the backing filesystem exposes trustworthy compressed-file or compressed-block accounting.

Object disk restriction fallback coverage

Current status:

  • NCP 0x16/0x29 Get Object Disk Usage And Restrictions keeps the existing QUOTA_SUPPORT split.
  • With quota support enabled, the endpoint is routed through nwbind so the bindery Object ID can be mapped to a Unix uid before querying the quota backend.
  • Without quota support, the endpoint returns the SDK-compatible fallback: unrestricted (0x40000000) and no space in use.

Follow-up:

  • Add direct tests for both build modes.
  • Verify the quota-enabled path against a real Unix quota setup.
  • Verify that the quota-disabled fallback remains compatible with requesters and with the WebSDK rule for invalid object IDs.

Server logging schema

Current status:

  • Server logging is useful during protocol work, but output is still noisy and not formatted consistently across NCP, namespace/path mapping, AFP, bindery, file, queue, trustee, and salvage code.
  • During salvage endpoint development, verbose logs are preferred over missing diagnostic information, but the messages should become easier to grep and compare across subsystems.

Follow-up:

  • Normalize new server log lines toward this shape:

    <LVL4> <AREA> <DEC-CODE> <EVENT> key=value ...
    
  • Use four-character levels so columns do not jump around:

    • INFO
    • DBUG
    • WARN
    • ERRR
  • Put the level first, then the subsystem/function area, for example NCP, SALVAGE, AFP, MAP, BIND, TRUST, AUTH, CONN, FILE, or QUEUE.

  • Use decimal/protocol-facing endpoint identifiers near the front when they are what the documentation uses, for example 87/16, 87/17, and 87/18.

  • Keep exact wire values as hex key/value fields later in the same line, for example fn=0x57 sub=0x10 ns=0x00 seq=0x00000000 vol=0x0000 base=0x00000004 result=0x89ff.

  • Mark missing or unimplemented endpoints with a stable UNKNOWN event, for example:

    INFO NCP 87/18 UNKNOWN fn=0x57 sub=0x12 msg="not implemented"
    INFO NCP 87/255 UNKNOWN fn=0x57 sub=0xff msg="unknown subfunction"
    INFO NCP 136 UNKNOWN fn=0x88 msg="unknown function"
    
  • Prefer existing mars_nwe logging functions/macros. Do not introduce a second logging subsystem just to change the message format.

  • Convert noisy areas gradually, starting with NCP function/subfunction dispatch and the salvage endpoints.

Printing / Queue backend

Q_UNIX_PRINT backend status

Current status:

  • Queue metadata handling and the Q_UNIX_PRINT backend are intentionally separate.
  • The backend can already call /usr/bin/lp, lpr, or a custom script.

Follow-up:

  • Improve logging around queue job submission to the Unix print command.
  • Capture and expose backend exit status where possible.
  • Consider direct CUPS integration only if MARS_NWE needs CUPS job IDs, cancellation, or status polling. Do not add a hard CUPS dependency for basic queue compatibility.

Transaction Tracking System (TTS)

Current status:

  • NCP 0x2222/34 / wire 0x22 is endpoint-audited in src/nwconn.c.
  • 34/00 TTS Is Available reports the WebSDK/NDK-documented unavailable status by returning completion 0x00 and no reply payload.
  • The SDK-listed through-3.x TTS subfunctions are documented inline: 34/01 Begin Transaction, 34/02 End Transaction, 34/03 Abort Transaction, 34/04 Transaction Status, 34/05/34/06 application thresholds, 34/07/34/08 workstation thresholds, and 34/09/34/10 transaction bits.
  • MARS-NWE does not currently implement TTS rollback semantics, transaction files, transaction status tracking, threshold state, or begin/end/abort transaction state. The non-availability subfunctions intentionally return 0xfb instead of pretending to succeed.
  • No SDK-listed through-3.x TTS subfunctions beyond 34/10 were found in the NDK/Core-Protocols TTS table during this audit.

Follow-up:

  • Implement TTS only if a concrete client requires it.
  • Treat this as a real transaction subsystem, not as a completion-code shim: the SDK calls require transaction numbering/status, rollback/backout, threshold state, control flags, and interaction with logical/physical locks.
  • If TTS is ever implemented, add tests that prove 34/02 returns a real TransactionNumber and that 34/04 reports status for that number.

Old direct file commit/search calls

Current status:

  • NCP 0x2222/59 / wire 0x3b Commit File and 0x2222/61 / wire 0x3d Commit File are endpoint-audited in src/nwconn.c. They share the same old six-byte file-handle request layout and return no reply payload. MARS-NWE commits the low four-byte handle via GET_32() and ignores the reserved/extended high bytes, matching the existing host file-handle model.
  • NCP 0x2222/62 / wire 0x3e File Search Initialize is endpoint-audited. The request payload after FunctionCode is DirectoryHandle, DirectoryPathLen, and DirectoryPath; the response returns volume, directory id, search sequence, and directory rights.
  • NCP 0x2222/63 / wire 0x3f File Search Continue is endpoint-audited. The parser reads volume, directory id, search sequence, search attributes, search path length, and search path in the documented old order. The reply returns the new search sequence, directory id, and the project's NW_FILE_INFO/NW_DIR_INFO compatibility body.
  • NCP 0x2222/64 / wire 0x40 Search for a File is endpoint-audited as the old two-byte-sequence direct search variant. It is intentionally documented separately from the newer 22/30 and 87/03 namespace search families.

Follow-up:

  • Verify old direct search replies against a real requester or packet test, especially the exact NW_FILE_INFO/NW_DIR_INFO packing and directory body.
  • Decide later whether the ignored high/extended bytes in the old six-byte file handle should remain compatibility padding or participate in a future handle table expansion.

Extended Attribute group 0x2222/86

Current status:

  • NCP 0x2222/86 / wire 0x56 is endpoint-audited as the old Extended Attribute group. src/nwconn.c forwards requestdata starting at the EA SubFunction byte to handle_func_0x56() in src/namspace.c, and maps the handler's non-negative return value to data_len or its negative return value to the NCP Completion code.
  • The NDK/Core-Protocols EA table lists through-3.x subfunctions 86/01 through 86/05; all five source slots are present in src/namspace.c, so no additional disabled source stubs are needed for this block.
  • 86/01 Close Extended Attribute Handle is a success shim: it ignores the handle and returns no reply payload.
  • 86/02 Write Extended Attribute is a success shim: it does not persist EA data and currently returns no reply payload, although the NDK reply format includes ErrorCode, BytesWritten, and NewEAHandle.
  • 86/03 Read Extended Attribute returns a fixed body with ErrorCode 0xc9 / ERR_EA_NOT_FOUND and zero lengths/handle fields, rather than reading real EA storage.
  • 86/04 Enumerate Extended Attribute returns a fixed all-zero body and no enumerated EA structures.
  • 86/05 Duplicate Extended Attributes has a source case but is intentionally unimplemented and returns unknown request via 0xfb.

Follow-up:

  • Keep this block as a compatibility shim unless a concrete client needs real Extended Attribute storage.
  • If real EA support is added, decide whether to use the existing Unix xattr layer, the future libdirectory store, or a filesystem-backed sidecar, and add packet tests for the Lo-Hi EA handle structs, flag information levels, and multi-action EA return values.

Name Space group 0x2222/87 core block

Current status:

  • NCP 0x2222/87 / wire 0x57 is endpoint-audited for the core namespace subfunctions 87/01 through 87/12. src/nwconn.c forwards requestdata starting at the Name Space SubFunction byte to handle_func_0x57() in src/namspace.c, and maps a non-negative handler return value to data_len or a negative value to the NCP Completion code.
  • The audited source slots are present for 87/01 Open/Create File or Subdirectory, 87/02 Initialize Search, 87/03 Search for File or Subdirectory, 87/04 Rename Or Move, 87/05 Scan for Trustees, 87/06 Obtain File/Subdirectory Information, 87/07 Modify DOS Information, 87/08 Delete, 87/09 Set Short Directory Handle, 87/10 Add Trustee Set, 87/11 Delete Trustee Set, and 87/12 Allocate Short Directory Handle.
  • No new disabled source stubs were needed for this core block: the local NDK/Core-Protocols table jumps from 87/12 to salvageable-file calls such as 87/16, and no default-compatibility 87/13..87/15 endpoints were found during this pass.
  • Current compatibility notes are documented inline per endpoint. Important differences include 87/03 returning at most one entry and treating the data stream as the same value as NameSpace, and 87/10/87/11 expecting trustee entries after fixed legacy path-structure areas.

Follow-up:

  • Continue the 0x2222/87 audit after the later salvage/metadata subset. Keep the comments per endpoint rather than adding a large pre-block checklist.

Name Space group 0x2222/87 salvage and metadata subset

Current status:

  • NCP 0x2222/87 / wire 0x57 is endpoint-audited for the later salvage/metadata/namespace subfunctions 87/16 through 87/29 that are present in the current source range.
  • Active source cases are documented inline for 87/16 Scan Salvageable Files, 87/17 Recover Salvageable File, 87/18 Purge Salvageable File, 87/20 Search for File or Subdirectory Set, 87/21 Get Path String from Short Directory Handle, 87/22 Generate Directory Base and Volume Number, 87/24 Get Name Spaces Loaded List from Volume Number, 87/26 Get Huge NS Information, 87/28 Get Full Path String, and 87/29 Get Effective Directory Rights.
  • Disabled source stubs were added for eligible 3.x/4.x metadata gaps that were not active in the source: 87/19 Get NS Information, 87/23 Query NS Information Format, 87/25 Set NS Information, and 87/27 Get Name Space Directory Entry. These stubs are documentation-only and do not change runtime behavior.
  • 87/26 already had a source slot, but it is effectively unimplemented and still returns the default 0xfb unknown request completion.

Name Space group 0x2222/87 open/create callback subset

Current status:

  • NCP 0x2222/87 / wire 0x57 is source-stub-audited for the next documented namespace subfunctions 87/30 through 87/35.
  • The current source did not contain active handlers for this range, so disabled #if 0 stubs were added at the correct selector locations for: 87/30 Open/Create File or Subdirectory with DataStream, 87/31 Get File Information, 87/32 Open/Create File or Subdirectory with Callback, 87/33 Open/Create File or Subdirectory II with Callback, 87/34 Open CallBack Control, and 87/35 Modify DOS Attributes on a File or Subdirectory.
  • These endpoints are eligible under the stub rule because they are 3.x/4.x namespace/file-system compatibility calls, including planned 4.x callback and DataStream variants. The stubs are documentation-only and leave runtime behavior unchanged.

Follow-up:

  • Continue the namespace audit with the remaining 87 subfunction ranges such as 87/36..87/44, 87/64..87/69, or the matching 89 long-name-space family. Keep future missing 1.x/2.x/3.x and planned 4.x endpoints as disabled source stubs at the correct selector location, not as prose-only notes.

Name Space group 0x2222/87 lock/quota/search/salvage-rights subset

Current status:

  • NCP 0x2222/87 / wire 0x57 is source-stub-audited for the next documented namespace/file subfunctions 87/36 through 87/43.
  • The active source had no handlers for this range, so disabled #if 0 stubs were added at the correct selector locations for: 87/36 Log File, 87/37 Release File, 87/38 Clear File, 87/39 Get Directory Disk Space Restriction, 87/40 Search for File or Subdirectory Set (Extended Errors), 87/41 Scan Salvageable File List, 87/42 Purge Salvageable File List, and 87/43 Revoke File Handle Rights.
  • 87/44 Update File Handle Rights is documented as NetWare 5.x in the NDK material, so it is intentionally not added as a source stub under the current 1.x/2.x/3.x plus planned-4.x scope.
  • These stubs are documentation-only and leave runtime behavior unchanged.

Name Space group 0x2222/87 later-generation high selectors

Current status:

  • The remaining SDK-listed high selectors in the 0x2222/87 / wire 0x57 family are explicitly reviewed for scope rather than implemented or stubbed: 87/44 Update File Handle Rights, 87/64 Read File, 87/65 Write to a File, 87/66 Get Current Size of File, 87/67 Log Physical Record, 87/68 Release Physical Record, and 87/69 Clear Physical Record.
  • These selectors are later-generation NDK additions and are outside the current 1.x/2.x/3.x plus planned-4.x source-stub rule. Do not add #if 0 cases for them during the current endpoint audit unless the project scope is explicitly extended beyond NetWare 4.x.
  • The older direct file-I/O calls (65..77) and old/new physical-record calls already audited in nwconn.c remain the compatibility paths for the current scope.

Follow-up:

  • The 87 family is now closed for the current endpoint-audit scope. Continue with the matching 89 Enhanced Name Space family as out-of-current-scope documentation, AFP 35, or another unaudited endpoint family requested by the user.

Enhanced Name Space group 0x2222/89

Current status:

  • NCP 0x2222/89 / wire 0x59 Enhanced Name Space has been reviewed for generation scope. src/nwconn.c has no top-level case 0x59, and the local NDK/Core-Protocols Enhanced NCP chapter lists the 89/xx operations as a later-generation family, with request pages such as 89/04 and 89/17 marked for NetWare Servers 6.5 SP2.
  • The documented 89 selectors are enhanced variants of namespace, trustee, salvage, EA, and rights calls already represented for the current scope by the 86 EA and 87 namespace audits. Examples include 89/01 Open/Create, 89/02 Initialize Search, 89/03 Search, 89/04 Rename/Move, 89/05 Scan Trustees, 89/06 Obtain Information, 89/07 Modify DOS Information, 89/08 Delete, 89/09 Set Short Directory Handle, 89/10 Add Trustee Set, 89/11 Delete Trustee Set, 89/12 Allocate Short Directory Handle, salvage and metadata selectors 89/16, 89/17, 89/19, 89/20, 89/22, 89/25, 89/28, 89/29, 89/35, 89/39, 89/40, plus enhanced EA/rights selectors 89/50, 89/52, 89/53, 89/54, and 89/71.
  • Under the current target rule, this block is out of source-stub scope because it is later than the planned NetWare 4.x compatibility target. Do not add a disabled top-level case 0x59 or per-selector #if 0 stubs unless the project scope is explicitly extended beyond NetWare 4.x.

Follow-up:

  • If the target is extended later, treat 89 as a filesystem/namespace provider family, not NDS. Reuse the normalized selector-path audit style from 87, and map any real implementation onto the future filesystem/namespace provider rather than nwnds.

NDS/NCP Fragger group 0x2222/104

Current status:

  • NCP 0x2222/104 / wire 0x68 is planned NetWare-4.x/NDS work, not a default NetWare-3.x server feature. src/nwconn.c already had a top-level case 0x68 that returns 0xfb; patch 0217 keeps that runtime behavior and adds disabled MARS_NWE_4 source-stub selectors for the documented NDS subfunctions.
  • The documented selector slots are 104/01 Ping for NDS NCP, 104/02 Send NDS Fragmented Request/Reply, 104/03 Fragment Close, 104/04 Return Bindery Context, 104/05 Monitor NDS Connection, 104/06 Return NDS Statistics, 104/07 Clear Statistics, and 104/08 Reload NDS Software.
  • 104/02 is a nested-selector endpoint: after the NDS SubFunctionCode it carries a 32-bit NDS Verb payload field. Document selector paths as 0x2222/104/02 verb=<Verb> when future nwnds work reaches this block; do not flatten the verb into a one-byte NCP case.
  • Future implementation belongs to nwnds and libdirectory, with nwserv used only for control-plane actions such as reload/supervision. Normal NDS request payloads must not be routed through nwserv as a data-plane broker.

Follow-up:

  • Keep the MARS_NWE_4 stubs disabled until a real nwnds/fragment-state design exists. The next endpoint audit can continue with deeper 23 bindery/property/admin coverage, 36/37 NCP Extension scope, print/spool 17, or another user-selected family.

Retrospective source-stub coverage for already audited blocks

Current status:

  • The endpoint-stub scope is source-level as well as documentation-level. When an already audited family has a documented 1.x/2.x/3.x compatibility gap or a planned 4.x gap, the dispatcher should contain a disabled #if 0 slot marker at the correct numeric case, unless that slot is already active.
  • Retro-check of the already touched families found the known eligible stubs already present in source:
    • Directory Services 22/12 / wire 0x0c, 22/35 / wire 0x23, and 22/36 / wire 0x24 are disabled source stubs in src/nwconn.c.
    • File Server Environment 23 queue/server-management gaps that were previously documented as disabled stubs are present in src/nwbind.c.
  • No source stubs are needed for message 21/04..21/08 because they were not default-compatibility server endpoints in the checked SDK/PDF/WebSDK material. 21/12 remains later-generation only and should stay out of source under the current through-4.x planning scope.
  • Physical-record 26..31 plus 110, TTS 34/00..34/10, and direct file commit/search/I/O 59, 61..77 did not expose additional eligible missing slots during the retro-check.

Follow-up:

  • For each next endpoint-family patch, record the source outcome inline: active case, already-present disabled stub, newly added disabled stub, no server endpoint, or later-generation/out-of-scope.
  • If a disabled stub already exists, do not churn its code merely to restyle it; add or adjust prose only unless the user explicitly asks for cleanup or the endpoint is being implemented.

AFP / Mac namespace backend

Current status:

  • The current AFP compatibility slice is implemented and covered by the smoke tests under tests/afp/. Endpoint inventory, WebSDK audit notes, and AFP implementation history live in that directory instead of this project-level TODO file.
  • AFP 0x13 Get Macintosh Info On Deleted File is implemented as a salvage/deleted-entry adapter and covered by the AFP smoke suite. It returns FinderInfo, ProDOSInfo, resource fork size, and deleted filename from the shared Salvage snapshot.
  • ProDOSInfo is persisted through the existing nwatalk AFP metadata xattr layer (org.mars-nwe.afp.prodos-info) and is captured/restored in Salvage as prodos_info_hex; no parallel AFP metadata store was added.
  • The verified AFP smoke suite covers live FinderInfo/ProDOSInfo xattrs, AFP 35/19 deleted-file metadata, and the readonly Modify-rights negative path.
  • Keep future AFP deleted-file work on the shared salvage backend; do not expose .recycle or .salvage through normal AFP/NCP path opens.
  • Keep AFP metadata restore/lookup paths tied to the existing mars_nwe AFP and nwatalk mechanisms, not a new side database.
  • Keep the detailed AFP inventory and audit notes in tests/afp/.
  • Patch 0214 also records the NCP-level AFP 35/01..35/19 coverage inline in src/nwconn.c: all documented NDK/Core-Protocols AFP subfunctions in that range are represented by the current dispatcher, so no new missing-endpoint source stubs are needed for the current 1.x/2.x/3.x plus planned-4.x scope.

Follow-up:

  • AFP endpoint coverage is now documented at the NCP dispatcher level. Continue any remaining WebSDK/client-trace cleanup only where tests/afp/ inventory files still mark a behavioral or metadata-layout issue.

Deferred / optional protocol work

  • Basic Packet Burst file transfer support is implemented and verified with a diagnostics-enabled DOS client test.
  • Packet Burst support is built by default, but runtime use remains controlled by nwserv.conf. Endpoint coverage for SDK 97 and 101 is now documented; remaining Packet Burst work is behavioral/client-trace driven.
  • Packet Burst/NDS fragmentation support remains out of scope unless a concrete client requires it.