74 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 Privilegesis 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/200as 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 Objectis implemented server-side.- Existing DOS and Linux tools do not reliably trigger it for all useful set properties such as
GROUP_MEMBERSandGROUPS_I'M_IN.
Follow-up:
- Add a small direct test utility to
mars-dosutils/NWTESTSthat sendsNCP 17/4Cdirectly. - Suggested test cases:
TESTGRP1type0x0002, propertyGROUP_MEMBERSTESTGRP2type0x0002, propertyGROUP_MEMBERSMARIOtype0x0001, propertyGROUPS_I'M_INNOPASSUSERtype0x0001, propertyGROUPS_I'M_INGUESTtype0x0001, propertyGROUPS_I'M_IN
NCP endpoint SDK documentation / stub audit
Current status:
- Several legacy NCP endpoints in
src/nwconn.care implemented only as disabled stubs, explicit0xfbunsupported 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 inTODO.md.
NCP endpoint audit tracking
Current status:
src/nwconn.ccontains 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
nwserverimplementation,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)innwconn.cas incomplete: many of those paths intentionally forward bindery/global-server work tonwbind. - When an endpoint returns to
nwbind, keep the audit paired: the dispatcher comment innwconn.cshould name the handoff, and the concrete parser innwbind.cshould carry the request/reply layout. This was rechecked for the currently documented forwarded paths: message group0x2222/21, quota prehandling in Directory Services0x2222/22, File Server Environment0x2222/23, End of Job0x2222/24, Logout0x2222/25, and Semaphore0x2222/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.cforwards a group tonwbind.c, document the handoff innwconn.cand the concrete subfunctions innwbind.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_4is hard-disabled ininclude/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/01through0x2222/0ewhere documented by the legacy SDK/PDF. - Old direct utility/message handoff calls around
0x2222/12through0x2222/15, including the 1.x/2.x-compatible broadcast subfunctions handled insrc/nwbind.c. - Older directory-handle compatibility calls that the local PDF marks as early
NetWare compatibility, especially
0x2222/22/17and0x2222/22/18.
NetWare 3.x/default compatibility bucket:
- Remaining documented
0x2222/22Directory Services calls through the NetWare-3.x-compatible namespace/directory range ending at22/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/29bridges map to the newer salvage backend.
NetWare 4.x planning/stub bucket:
0x2222/22/50 Get Object Effective Rights for Directory Entryand0x2222/22/51 Get Extended Volume Informationare 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_4while the macro remains0. 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
0x2222endpoint 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/23is the top-level wirecase 0x17; SDK group0x2222/89would be top-level wirecase 0x59.
Present in the code but not yet fully endpoint-audited:
- SDK
0x2222/23/ wire0x17File Server Environment: the audit has started with file-information, login/connection, bindery-object, queue, management/admin, and accounting calls. Remaining property, set, and password subfunctions still need the same PDF/WebSDK/include comparison insrc/nwbind.cand the related queue prehandlers. - SDK
0x2222/34/ wire0x22TTS calls are present insrc/nwconn.cand have been endpoint-audited as an unsupported/no-rollback compatibility group. - SDK
0x2222/35/ wire0x23AFP calls are present insrc/nwconn.cand have been endpoint-audited as the AFP/Mac namespace compatibility block. AFP has separate smoke coverage undertests/afp/; future fixes should be driven by those tests and client traces rather than a new parallel metadata store. - SDK
0x2222/65through77/ wire0x41through0x4dare old direct file open/create/read/write/rename/time/copy calls present insrc/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/ wire0x56Extended Attribute is endpoint-audited as a compatibility shim block insrc/nwconn.candsrc/namspace.c; see the Extended Attribute section below for the exact per-subfunction status. - SDK
0x2222/87/ wire0x57Name Space is endpoint-audited for the current 1.x/2.x/3.x plus planned-4.x scope. Later-generation high selectors87/44and87/64..87/69are documented as out of current source-stub scope. - SDK
0x2222/97/ wire0x61Get Big Packet NCP Max Packet Size and SDK0x2222/101/ wire0x65Packet Burst Connection Request are present insrc/nwconn.cand endpoint-audited as the 4.x-era packet-burst negotiation and setup paths. The follow-on0x7777packet-burst data-plane handler is also documented, but it is not a normal0x2222endpoint. - SDK
0x2222/104/ wire0x68NDS/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_4insrc/nwconn.c. - SDK
0x2222/111/ wire0x6fSemaphore is source-stub-audited as the newer NetWare 3.x/4.x paired semaphore family. The old32/xxsemaphore calls remain the active compatibility implementation; patch 0223 records111/00..111/04as disabled#if 0selector slots insrc/nwconn.cso the future semaphore provider can bridge both families. - SDK
0x2222/90/ wire0x5aData Migration / tree metadata is source-stub-audited as planned 4.x filesystem/namespace work. Patch 0224 records the 4.x-era90/00,90/10,90/11,90/12,90/128..90/136, and90/150selector slots behindMARS_NWE_4insrc/nwconn.c. There is no active data-migration support module, compression metadata backend, or parse-tree provider yet; future ownership belongs to the filesystem/namespace provider, notnwnds. - SDK
0x2222/17/ wire0x11direct Print/Spool is source-stub-audited as a NetWare 2.x/3.x/4.x compatibility family. There is no active top-level handler for these legacy direct spool NCPs, so patch 0218 records the documented selector slots17/00,17/01,17/02,17/03,17/06,17/09, and17/10as a disabled#if 0stub insrc/nwconn.c. This is not a statement that all printing is absent: queue-based printing already exists through print queues,Q_UNIX_PRINT, and queue-job close/service paths. Any future direct-spool implementation should reuse that queue printing machinery where possible, and it does not belong tonwnds. - SDK
0x2222/36and0x2222/37/ wire0x24and0x25NCP Extension are source-stub-audited as a NetWare 4.x extension-registration family. Patch 0221 records the documented36/00..36/06information selectors and direct37execute-extension call behindMARS_NWE_4insrc/nwconn.c. There is no active extension registry/provider yet, andnwservmust remain a control-plane registry/supervisor rather than a data-plane broker for extension payloads. - SDK
0x2222/79,0x2222/84, and0x2222/85/ wire0x4f,0x54, and0x55are source-stub-audited as old direct file-metadata/open-create and sparse-data compatibility calls. Patch 0222 records disabled#if 0slots insrc/nwconn.c; future implementation belongs to the filesystem/namespace provider and should not be confused with NDS directory-object attributes. - SDK
0x2222/23/150..23/153/ wire0x96..0x99Accounting is source-stub-audited as a NetWare 2.x/3.x/4.x-compatible accounting-server family. Patch 0226 records disabled#if 0selector slots insrc/nwbind.cfor Get Current Account Status, Submit Account Charge, Submit Account Hold, and Submit Account Note. Future ownership belongs to an accounting provider, with possible bridge points to queue printing for charge/hold/note behavior.
SDK-listed blocks that do not currently show a top-level handler in
src/nwconn.c:
- SDK
0x2222/92/ wire0x5cSecretStore is scope-audited as a later-generation SecretStore/eDirectory single-sign-on family. The local NDK PDF marks the family as NetWare Server 5.x and eDirectory 8.5 or later, with subverbs0Query Server through9Get Service Information. There is no active top-level handler insrc/nwconn.c, no indirect provider path was found in the audited source, and no source stub should be added under the current 1.x/2.x/3.x plus planned-4.x rule. It remains prose-only/out of the current compatibility target. - SDK
0x2222/123/ wire0x7bservice-address enumeration and SDK0x2222/131/ wire0x83RPC/NLM-control style calls appear in the PDF/WebSDK index but do not currently show top-level handlers insrc/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_4stub 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.cis annotated with Novell SDK endpoint names and request-layout notes. NCP 0x01 File Set Lock (old)andNCP 0x02 File Release Lockare documented in the SDK but are not implemented in MARS-NWE yet. Inline documentation and commented case/break stubs are present insrc/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)andNCP 0x6a Lock File Setshare the current implementation. The SDK documents the old0x04timeout word as Lo-Hi and the newer0x6atimeout word as Hi-Lo; MARS-NWE currently reads the shared field withGET_BE16(). This is documented inline but not changed yet.NCP 0x05 Release File (old)andNCP 0x07 Clear File (old)have request parsing that matches the documented old header offsets.NCP 0x06 Release File SetandNCP 0x08 Clear File Setare implemented, but the SDK request contains aLockFlagbyte 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, andNCP 0x0c Release Logical Recordhave 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 SetandNCP 0x0e Clear Logical Record Setare implemented, but the SDK request contains aLockFlagbyte 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, and0x1e Clear Physical Recordare 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 newer0x6e Lock Physical Record Setshare one handler. The SDK/PDF documents old0x1bLockTimeout as Lo-Hi and newer0x6eas Hi-Lo, while MARS-NWE currently reads the shared field withGET_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 Setand0x1f Clear Physical Record Setare implemented, but both SDK requests contain aLockFlagsbyte that the current code does not read. The reply has no payload and completion reports the set-operation result.
Follow-up:
- Decide whether
NCP 0x01andNCP 0x02should be implemented for real old-client compatibility or should return a deliberate0xfbunsupported 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/0x6aparser should keep the current big-endian timeout read for both functions or special-case old0x04as documented Lo-Hi after direct requester evidence is available. - Decide whether
0x06,0x08,0x0d, and0x0eshould consume or ignore the documentedLockFlagbyte after direct requester evidence is available. - Decide whether
0x0ashould 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/0x6ephysical-record-set parser should special-case old0x1bLockTimeout as documented Lo-Hi, and whether the LockFlag bit-1 mapping should follow the PDF text or preserve current compatibility behavior. - Decide whether
0x1dand0x1fshould consume or continue ignoring the documentedLockFlagsbyte 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 theNCP 0x15message group handoff have inline SDK request/reply layout documentation.- The forwarded NetWare 1.x/2.x/3.x-compatible
NCP 0x15message subfunctions insrc/nwbind.chave 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 SDK21/00,21/01,21/02,21/03,21/09,21/10, and21/11; no default-compatibility server NCPs were found for21/04..21/08. - SDK
21/12Connection 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 Numberis 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
0x13reply is required by old clients or whether the SDK three-byte StationNumber reply should be implemented. - Verify
NCP 0x2222/21/10 Send Broadcast Messagewith a real client before changing the parser: the NDK/Core Protocols PDF page documents long connection numbers and long completion flags, while the CLIB/WebSDKNWSendBroadcastMessageprototype exposes a 16-bit connection list and byte result list, matching the current compatibility parser.
Directory Services group 0x2222/22
Current status:
NCP 0x2222/22is handled insrc/nwconn.c, with selected quota-related subfunctions forwarded tosrc/nwbind.cfor 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 wirecasebyte is listed below whenever decimal and hex notation can be confused. - Already audited and inline-documented default-compatibility calls:
- SDK
22/00/ wire0x00Set Directory Handle - SDK
22/01/ wire0x01Get Directory Path - SDK
22/02/ wire0x02Scan Directory Information - SDK
22/03/ wire0x03Get Effective Directory Rights - SDK
22/04/ wire0x04Modify Maximum Rights Mask - SDK
22/05/ wire0x05Get Volume Number - SDK
22/06/ wire0x06Get Volume Name - SDK
22/10/ wire0x0aCreate Directory - SDK
22/11/ wire0x0bDelete Directory - SDK
22/13/ wire0x0dAdd Trustee to Directory - SDK
22/14/ wire0x0eDelete Trustee from Directory - SDK
22/15/ wire0x0fRename Directory - SDK
22/18/ wire0x12Allocate Permanent Directory Handle - SDK
22/19/ wire0x13Allocate Temporary Directory Handle - SDK
22/20/ wire0x14Deallocate Directory Handle - SDK
22/21/ wire0x15Get Volume Info with Handle - SDK
22/22/ wire0x16Allocate Special Temporary Directory Handle - SDK
22/23/ wire0x17Extract a Base Handle - SDK
22/24/ wire0x18Restore an Extracted Base Handle - SDK
22/25/ wire0x19Set Directory Information - SDK
22/26/ wire0x1aGet Path Name of a Volume-Directory Number Pair - SDK
22/27/ wire0x1bScan Salvageable Files (old) - SDK
22/28/ wire0x1cRecover Salvageable File (old) - SDK
22/29/ wire0x1dPurge Salvageable File (old) - SDK
22/30/ wire0x1eScan a Directory - SDK
22/31/ wire0x1fGet Directory Entry - SDK
22/32/ wire0x20Scan Volume's User Disk Restrictions - SDK
22/33/ wire0x21Add User Disk Space Restriction - SDK
22/34/ wire0x22Remove User Disk Space Restrictions - SDK
22/37/ wire0x25Set Directory Entry Information - SDK
22/38/ wire0x26Scan File or Directory for Extended Trustees - SDK
22/39/ wire0x27Add Extended Trustee to Directory or File - SDK
22/40/ wire0x28Scan Directory Disk Space - SDK
22/41/ wire0x29Get Object Disk Usage and Restrictions - SDK
22/42/ wire0x2aGet Effective Rights for Directory Entry - SDK
22/43/ wire0x2bRemove Extended Trustee from Dir or File - SDK
22/44/ wire0x2cGet Volume and Purge Information - SDK
22/45/ wire0x2dGet Directory Information - SDK
22/46/ wire0x2eRename Or Move (old) - SDK
22/47/ wire0x2fGet Name Space Information - SDK
22/48/ wire0x30Get Name Space Directory Entry
- SDK
- Already audited NetWare 4.x planning-bucket calls with existing active
MARS-NWE implementations:
- SDK
22/50/ wire0x32Get Object Effective Rights for Directory Entry - SDK
22/51/ wire0x33Get 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.
- SDK
- The old SDK PDF table for SDK
22/00repeatsTargetDirectoryHandlefor the second payload byte, but the remarks describe a source handle; MARS-NWE parses the byte asSourceDirectoryHandle. 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, or22/09during this audit. The next documented direct directory calls continue at SDK22/10/ wire0x0a. - WebSDK/PDF recheck found SDK
22/12/ wire0x0cScan Directory for Trustees. Do not confuse this with the already implemented wirecase 0x12/ SDK22/18Allocate Permanent Directory Handle. Scan Directory for Trustees has only a disabled inline stub for now. - WebSDK/PDF also documents SDK
22/35/ wire0x23Get Directory Disk Space Restriction and SDK22/36/ wire0x24Set 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 SDK22/34/ wire0x22and SDK22/37/ wire0x25. - SDK
22/13/ wire0x0dand SDK22/14/ wire0x0ematch the SDK/PDF payload layouts. SDK22/15/ wire0x0fmatches the payload layout; the old PDF labels this call'sSubFuncStrucLenas 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/ wire0x0aand SDK22/11/ wire0x0bpreserve the documented offset ofDirectoryAccessMask, but the current implementation does not use that field when creating or deleting the directory. - SDK
22/18,22/19,22/22,22/20, and22/21request parsers match the documented NetWare 1.x/2.x/3.x payload offsets. - SDK
22/23/ wire0x17and SDK22/24/ wire0x18now 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 common0x2222/22group header. This is documented inline and no behavior was changed. - SDK
22/25,22/26,22/27, and22/29match the documented request payload offsets. SDK22/26uses 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/28validates 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/ wire0x1ematches the documented offsets, but the SDK documentsSequenceas Lo-Hi while the current parser reads it withGET_BE32(). - SDK
22/31/ wire0x1fconsumes the documentedDirectoryHandle; 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/ wire0x20readsVolumeNumberin the normal NCP 22 payload position, but the WebSDK/PDF table for this call showsVolumeNumberone byte later than the common group-header alignment. The code also readsSequencewithGET_BE32()although the SDK/PDF documents Lo-Hi; treat both as audit items until verified with a direct test caller. - SDK
22/33and22/34are forwarded tonwbind.cfor quota prehandling; both layers are documented. The sharednwbindprehandler reads ObjectID from the documented payload position. SDK22/33includes 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, and22/41match the documented request payload offsets. - SDK
22/37matches the documented payload field order, but the current parser reads Sequence withGET_BE32()although the SDK/PDF documents Lo-Hi. - SDK
22/40matches the documented payload offsets, but the current parser reads Sequence withGET_BE32()although the SDK/PDF documents Lo-Hi; it also returns the normal directory scan structure fromnw_scan_a_directory()rather than the full documented Scan Directory Disk Space reply. - SDK
22/42,22/43,22/45,22/46, and22/47match the NetWare 1.x/2.x/3.x SDK/PDF payload offsets used by the current parser. - SDK
22/44/ wire0x2cmatches the documented request offset, but the PDF marksTotalBlocksas Hi-Lo while the remaining 32-bit counters are Lo-Hi; current code usesU32_TO_32()for all counters. - SDK
22/48/ wire0x30matches the documented payload offsets; the PDF does not label theDOSSequencebyte order, and current code reads it withGET_32().
Follow-up:
- Implement or intentionally reject SDK
22/12/ wire0x0cScan Directory for Trustees. Do not confuse the SDK decimal subfunction number 12 with the already implemented wirecase 0x12/ SDK22/18directory-handle call. - Implement or intentionally reject SDK
22/35/ wire0x23Get Directory Disk Space Restriction and SDK22/36/ wire0x24Set Directory Disk Space Restriction. Both are NetWare 3.x-compatible, notMARS_NWE_4work. - Verify the documented SDK
22/00source-handle interpretation against an old requester or direct test caller before changing behavior. - Decide whether SDK
22/10/ wire0x0aand SDK22/11/ wire0x0bshould apply or validate the documentedDirectoryAccessMaskbyte, or whether ignoring it is required for old requester compatibility. - Verify SDK
22/23/ wire0x17and SDK22/24/ wire0x18against 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/26directory-entry-number byte order against an old requester or direct test caller before changing the current Hi-Lo interpretation. - Decide whether SDK
22/28should 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/30Sequence byte order; current code usesGET_BE32()although the SDK/WebSDK documents Lo-Hi. - Verify whether SDK
22/31should continue accepting legacy callers that send the two extra bytes described by the old source comment, even though the SDK request only containsDirectoryHandle. - Verify SDK
22/32VolumeNumber 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 usesGET_BE32()although the SDK/PDF documents Lo-Hi. - Decide whether SDK
22/33should 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/37Sequence byte order; current code usesGET_BE32()although the SDK/PDF documents Lo-Hi. - Verify SDK
22/40Sequence byte order and reply shape; current code usesGET_BE32()and delegates to the normal directory scan reply rather than the documented Scan Directory Disk Space reply. - Verify SDK
22/44Volume and Purge Information reply byte order forTotalBlocks; the SDK/PDF marks only that field as Hi-Lo, while current code emits all 32-bit counters withU32_TO_32(). - Verify SDK
22/48DOSSequence byte order against an old requester or direct test caller; current code usesGET_32()and the PDF table does not spell out the order for that field. - The NetWare 1.x/2.x/3.x-compatible
0x2222/22endpoint layout pass is covered through the documented SDK22/48namespace call, with the newly found SDK22/12,22/35, and22/36gaps 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/ wire0x20is forwarded unchanged fromsrc/nwconn.ctosrc/nwbind.c, which passesrequestdata[0]as the semaphore subfunction andrequestdata[1..]tohandle_func_0x20()insrc/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 subfunction0x00Open Semaphore (old) - SDK
32/01/ wire subfunction0x01Examine Semaphore (old) - SDK
32/02/ wire subfunction0x02Wait On Semaphore (old) - SDK
32/03/ wire subfunction0x03Signal Semaphore (old) - SDK
32/04/ wire subfunction0x04Close Semaphore (old)
- SDK
- Request and response payloads were compared against the NDK/Core Protocols
PDF, the extracted WebSDK semaphore pages, and
nwsync.h. The old32/00through32/04operations line up with the currently implemented operation set.
Known differences / follow-up:
- The PDF/WebSDK tables label
SemaphoreHandleas long Lo-Hi. The currentsrc/sema.cimplementation parses and emits semaphore handles withGET_BE32()/U32_TO_BE32()while parsingSemaphoreTimeOutas Hi-Lo withGET_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 Semaphorecurrently does not sleep untilSemaphoreTimeOut; the simple emulator returns timeout immediately when the semaphore value is not available.- Newer SDK
0x2222/111semaphore calls are the modern paired variants. They are now source-stub-audited separately at the direct wire0x6fdispatch slot; any future implementation should bridge to a shared semaphore provider rather than duplicating the old32/xximplementation.
Direct semaphore group 0x2222/111
Current status:
- Direct
NCP 0x2222/111/ wire0x6fis source-stub-audited insrc/nwconn.c. There is no active top-level handler for this newer NetWare 3.x/4.x paired semaphore family. - The documented selector slots are recorded in a disabled
#if 0block:111/00Open/Create a Semaphore111/01Examine Semaphore111/02Wait On (P) Semaphore111/03Signal (V) Semaphore111/04Close Semaphore
- The old
32/xxsemaphore group remains the active compatibility path. Future implementation should decode the111/xxwrapper and share the same semaphore provider/state rather than building a second semaphore table.
Known differences / follow-up:
- The NDK documents
SemaphoreHandleas long Lo-Hi for both old32/xxand newer111/xxfamilies. The active old handler currently uses big-endian helpers for handles; verify client traces before bridging the new family. - This remains local semaphore/synchronization state. It does not belong to
nwnds,nwdirectory, or the future directory store.
Direct connection lifecycle and buffer-size calls
Current status:
- Direct
NCP 0x2222/24/ wire function0x18End Of Job is implemented as a pairednwconn.c/nwbind.chandoff. The PDF/WebSDK request has no payload after FunctionCode 24 and the reply has no payload.nwconn.creleases task-local handles and jobs first;nwbind.ccloses matching print jobs and sends the final empty success reply. - Direct
NCP 0x2222/25/ wire function0x19Logout is implemented as a pairednwconn.c/nwbind.chandoff. The PDF/WebSDK request has no payload after FunctionCode 25 and the reply has no payload.nwconn.creleases local queue/file/user state;nwbind.ccloses remaining print jobs, writes logout accounting state, clears bindery identity fields, and sends the final empty success reply. - Direct
NCP 0x2222/33/ wire function0x21Negotiate Buffer Size is handled entirely insrc/nwconn.c. The request isProposedBufferSizeas a Hi-Lo word and the reply isAcceptedBufferSizeas a Hi-Lo word. The current parser/reply match the documented order. MARS-NWE clamps valid proposals toLOC_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, SDK25, or SDK33in 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/quota0x2222/22, file-server environment0x2222/23, direct lifecycle0x2222/24and0x2222/25, semaphore0x2222/32, and buffer negotiation0x2222/33should 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 0stub is only a documentation/slot marker. Do not assignreturn(-1)forwarding semantics to such stubs innwbind.c; that special forwarding meaning belongs tonwconn.c'shandle_ncp_serv()path.
File Server Environment group 0x2222/23
Current status:
-
NCP 0x2222/23is handled insrc/nwconn.cfor the locally parsed file-information subfunctions, while other login, bindery, queue, and management subfunctions are forwarded tosrc/nwbind.cor 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/ wire0x00Login User (old) -- disabled future stub - SDK
23/01/ wire0x01Change User Password (old) -- hard failure stub - SDK
23/02/ wire0x02Get User Connection List (old) -- disabled future stub - SDK
23/05/ wire0x05Get Station's Logged Info (old) -- disabled future stub - SDK
23/12/ wire0x0cVerify Serialization -- hard failure stub - SDK
23/15/ wire0x0fScan File Information - SDK
23/16/ wire0x10Set File Information - SDK
23/17/ wire0x11Get File Server Information - SDK
23/18/ wire0x12Get Network Serial Number - SDK
23/19/ wire0x13Get Internet Address (old) - SDK
23/20/ wire0x14Login Object - SDK
23/21/ wire0x15Get Object Connection List (old) - SDK
23/22/ wire0x16Get Station's Logged Info (old) - SDK
23/23/ wire0x17Get Login Key - SDK
23/24/ wire0x18Keyed Object Login - SDK
23/26/ wire0x1aGet Internet Address - SDK
23/27/ wire0x1bGet Object Connection List - SDK
23/28/ wire0x1cGet Station's Logged Info - SDK
23/50/ wire0x32Create Bindery Object - SDK
23/51/ wire0x33Delete Bindery Object - SDK
23/52/ wire0x34Rename Object - SDK
23/53/ wire0x35Get Bindery Object ID - SDK
23/54/ wire0x36Get Bindery Object Name - SDK
23/55/ wire0x37Scan Bindery Object - SDK
23/56/ wire0x38Change Bindery Object Security - SDK
23/57/ wire0x39Create Property - SDK
23/58/ wire0x3aDelete Property - SDK
23/59/ wire0x3bChange Property Security - SDK
23/60/ wire0x3cScan Property - SDK
23/61/ wire0x3dRead Property Value - SDK
23/62/ wire0x3eWrite Property Value - SDK
23/63/ wire0x3fVerify Bindery Object Password -- disabled future stub - SDK
23/64/ wire0x40Change Bindery Object Password - SDK
23/65/ wire0x41Add Bindery Object To Set - SDK
23/66/ wire0x42Delete Bindery Object From Set - SDK
23/67/ wire0x43Is Bindery Object In Set - SDK
23/68/ wire0x44Close Bindery - SDK
23/69/ wire0x45Open Bindery - SDK
23/70/ wire0x46Get Bindery Access Level - SDK
23/71/ wire0x47Scan Bindery Object Trustee Paths - SDK
23/72/ wire0x48Get Bindery Object Access Level - SDK
23/73/ wire0x49Is Calling Station A Manager - SDK
23/74/ wire0x4aKeyed Verify Password - SDK
23/75/ wire0x4bKeyed Change Password - SDK
23/76/ wire0x4cList Relations Of An Object - SDK
23/100/ wire0x64Create Queue - SDK
23/101/ wire0x65Destroy Queue - SDK
23/102/ wire0x66Read Queue Current Status (old) - SDK
23/103/ wire0x67Set Queue Current Status (old) - SDK
23/104/ wire0x68Create Queue Job And File (old) - SDK
23/105/ wire0x69Close File And Start Queue Job (old) - SDK
23/106/ wire0x6aRemove Job From Queue (old) - SDK
23/107/ wire0x6bGet Queue Job List (old) - SDK
23/108/ wire0x6cRead Queue Job Entry (old) - SDK
23/109/ wire0x6dChange Queue Job Entry (old) - SDK
23/110/ wire0x6eChange Queue Job Position -- disabled future stub - SDK
23/111/ wire0x6fAttach Queue Server To Queue - SDK
23/112/ wire0x70Detach Queue Server From Queue - SDK
23/113/ wire0x71Service Queue Job (old) - SDK
23/114/ wire0x72Finish Servicing Queue Job (old) - SDK
23/115/ wire0x73Abort Servicing Queue Job (old) - SDK
23/116/ wire0x74Change To Client Rights (old) -- disabled future stub - SDK
23/117/ wire0x75Restore Queue Server Rights -- disabled future stub - SDK
23/118/ wire0x76Read Queue Server Current Status (old) -- disabled future stub - SDK
23/119/ wire0x77Set Queue Server Current Status -- disabled future stub - SDK
23/120/ wire0x78Get Queue Job File Size (old) - SDK
23/121/ wire0x79Create Queue Job And File - SDK
23/122/ wire0x7aRead Queue Job Entry - SDK
23/126/ wire0x7eSet Queue Current Status - SDK
23/127/ wire0x7fClose File And Start Queue Job - SDK
23/128/ wire0x80Remove Job From Queue - SDK
23/129/ wire0x81Get Queue Job List - SDK
23/130/ wire0x82Change Job Priority -- disabled future stub - SDK
23/131/ wire0x83Finish Servicing Queue Job - SDK
23/132/ wire0x84Abort Servicing Queue Job - SDK
23/133/ wire0x85Change To Client Rights -- disabled future stub - SDK
23/134/ wire0x86Read Queue Server Current Status -- disabled future stub - SDK
23/135/ wire0x87Get Queue Job File Size - SDK
23/200/ wire0xc8Check Console Privileges - SDK
23/201/ wire0xc9Get File Server Description Strings - SDK
23/202/ wire0xcaSet File Server Date And Time -- disabled future stub - SDK
23/203/ wire0xcbDisable File Server Login -- disabled future stub - SDK
23/204/ wire0xccEnable File Server Login -- disabled future stub - SDK
23/205/ wire0xcdGet File Server Login Status - SDK
23/207/ wire0xcfDisable Transaction Tracking -- disabled future stub - SDK
23/208/ wire0xd0Enable Transaction Tracking -- disabled future stub - SDK
23/209/ wire0xd1Send Console Broadcast (old) - SDK
23/210/ wire0xd2Clear Connection Number (old) - SDK
23/211/ wire0xd3Down File Server - SDK
23/232/ wire0xe8Get File Server Misc Information -- disabled future stub - SDK
23/235/ wire0xebGet Connection's Open Files -- disabled future stub - SDK
23/253/ wire0xfdSend Console Broadcast -- disabled future stub - SDK
23/254/ wire0xfeClear Connection Number -- disabled future stub
- SDK
-
SDK
23/15request payload offsets match the current parser:LastSearchIndex,DirectoryHandle,SearchAttributes,FileNameLen, andFileName. The reply shape also matches the documented fixed file information block. The SDK/PDF/WebSDK documentsLastSearchIndexandNextSearchIndexas Lo-Hi words, while the current code usesGET_BE16()andU16_TO_BE16(). -
SDK
23/16request payload field order matches the current parser. The code copies the documented status fields intoNW_FILE_INFOafter its 14-byte DOS-name prefix and then passes the documented directory handle, search attributes, and filename tonw_set_file_information(). -
Include cross-checks:
NWScanFileInformation()/NWIntScanFileInformation()andNWSetFileInformation()innwfile.hrefer to this same SDK-level file-information family. The server/connection calls cross-check againstNWGetFileServerInformation(),NWGetNetworkSerialNumber(),NWGetInternetAddress(),NWGetConnectionInformation(),NWGetObjectConnectionNumbers(), and related connection/server headers. -
Bindery object calls SDK
23/50through SDK23/56were compared against the NDK/Core-Protocols PDF, WebSDK API names, andnwbindry.hprototypes. The currentnwbind.cparsers match the documented request payload order and Hi-Lo object type/object ID fields. Replies for SDK23/53,23/54, and23/55match the documented fixed bindery object reply blocks. -
Bindery property calls SDK
23/57through SDK23/62were compared against the NDK/Core-Protocols PDF, WebSDK API names, andnwbindry.hprototypes. The currentnwbind.cparsers match the documented request payload order, including Hi-Lo ObjectType and Hi-Lo LastInstance/SearchInstance for SDK23/60. Replies for SDK23/60and SDK23/61match the documented fixed property reply blocks. SDK23/62names the byte after SegmentNumberMoreFlag; the current local variable is namederase_segment, but it consumes that same byte. -
Bindery password/set/access calls SDK
23/63through SDK23/76were compared against the NDK/Core-Protocols PDF, WebSDK API names, andnwbindry.hprototypes where available. SDK23/65through SDK23/67share the documented object/property/member tuple and match the current parsers. SDK23/68and SDK23/69have no payload and are implemented as successful no-ops. SDK23/70,23/72,23/73,23/74,23/75, and23/76match their documented request/reply layouts. SDK23/71is handled locally insrc/nwconn.cbecause it resolves directory trustee paths; the disablednwbind.ccase comment now points back to that handler. SDK23/63/ wire0x3fis documented but not implemented, so a disabled future stub was added next to the surrounding bindery password calls. For SDK23/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/100through SDK23/108, queue-server and service calls SDK23/109through SDK23/115, the old job-size call SDK23/120, and the paired newer variants SDK23/121through SDK23/129, SDK23/131, SDK23/132, and SDK23/135were compared against thenwqms.hprototypes and extracted WebSDK queue pages.src/nwconn.cperforms required prehandling for queue path rewriting, queue-job file creation, queue job entry file-handle insertion, and close/start file association before forwarding tosrc/nwbind.c. The target handlers innwbind.cnow 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, SDK23/116through SDK23/119, SDK23/130, SDK23/133, and SDK23/134were compared against the NDK/Core-Protocols PDF andnwqms.h/nwqueue.hprototypes. They are not implemented in the current queue backend.nwbind.cnow 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/200through SDK23/211, plus SDK23/232, SDK23/235, SDK23/253, and SDK23/254, were compared against the NDK/Core-Protocols PDF and server/connection/message include prototypes (nwserver.h,nwconnec.h,nwmsg.h, and NLMnwenvrn.h). Implemented calls now carry inline layout notes insrc/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/15search-index byte order against a real old requester or direct test caller before changing the current big-endian parser/reply. - SDK
23/12/ wire0x0cVerify Serialization is currently a hard failure stub; the PDF/WebSDK endpoint title is decimal23/12, while one table row printsSubFunctionCode (212), so do not add a wire0xd4case without a packet trace or include-level confirmation. - SDK
23/17/ wire0x11returns 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/ wire0x12documents the serial/application reply as Lo-Hi, while the current code writes both fields with big-endian helpers. - SDK
23/23/ wire0x17documents a TargetConnection byte, but the current implementation ignores it and returns a login key for the active connection. - SDK
23/27/ wire0x1bdocumentsSearchConnNumberand returned connection numbers as Lo-Hi long values; the current code reads the search number withGET_BE32()and returns 16-bit connection numbers. - Implement or deliberately hard-fail SDK
23/63/ wire0x3fVerify 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/ wire0x7a, SDK23/127/ wire0x7f, SDK23/128/ wire0x80, SDK23/131/ wire0x83, SDK23/132/ wire0x84, and SDK23/135/ wire0x87document long or Lo-Hi job-number fields in the WebSDK/include material, while the current compatibility parser often reuses the old 16-bit layout. SDK23/126/ wire0x7ealso 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/ wire0x6eChange Queue Job Position, SDK23/116/ wire0x74and SDK23/133/ wire0x85Change To Client Rights, SDK23/117/ wire0x75Restore Queue Server Rights, SDK23/118/ wire0x76and SDK23/134/ wire0x86Read Queue Server Current Status, SDK23/119/ wire0x77Set Queue Server Current Status, and SDK23/130/ wire0x82Change Job Priority. - SDK
23/205/ wire0xcdGet File Server Login Status currently returns a one-byte enabled flag. The PDF documents a longUserLoginAllowedreply, 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/ wire0xd1Send Console Broadcast (old) is parsed as the old byte station-list form. The PDF table labelsStationListas long[], but its ownSubFuncStrucLen = 3 + NumberOfStations + MessageLenformula matches the byte-list parser; keep the newer 32-bit list in SDK23/253/ wire0xfdseparate. - SDK
23/211/ wire0xd3Down 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, SDK23/203, SDK23/204, SDK23/207, SDK23/208, SDK23/232, SDK23/235, SDK23/253, and SDK23/254. - Audit the remaining forwarded
0x2222/23management subfunctions in the files that actually handle them instead of treating thenwconn.cforwarding points as complete local implementations.
Extended volume information field mapping
Current status:
NCP 0x16/0x33 Get Extended Volume Informationreturns the documentedNWVolExtendedInforeply 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
NWVolExtendedInfofields 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 Restrictionskeeps the existingQUOTA_SUPPORTsplit.- With quota support enabled, the endpoint is routed through
nwbindso 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:
INFODBUGWARNERRR
-
Put the level first, then the subsystem/function area, for example
NCP,SALVAGE,AFP,MAP,BIND,TRUST,AUTH,CONN,FILE, orQUEUE. -
Use decimal/protocol-facing endpoint identifiers near the front when they are what the documentation uses, for example
87/16,87/17, and87/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
UNKNOWNevent, 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_PRINTbackend 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/ wire0x22is endpoint-audited insrc/nwconn.c.34/00 TTS Is Availablereports the WebSDK/NDK-documented unavailable status by returning completion0x00and no reply payload.- The SDK-listed through-3.x TTS subfunctions are documented inline:
34/01Begin Transaction,34/02End Transaction,34/03Abort Transaction,34/04Transaction Status,34/05/34/06application thresholds,34/07/34/08workstation thresholds, and34/09/34/10transaction 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
0xfbinstead of pretending to succeed. - No SDK-listed through-3.x TTS subfunctions beyond
34/10were 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/02returns a real TransactionNumber and that34/04reports status for that number.
Old direct file commit/search calls
Current status:
NCP 0x2222/59/ wire0x3bCommit File and0x2222/61/ wire0x3dCommit File are endpoint-audited insrc/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 viaGET_32()and ignores the reserved/extended high bytes, matching the existing host file-handle model.NCP 0x2222/62/ wire0x3eFile Search Initialize is endpoint-audited. The request payload afterFunctionCodeisDirectoryHandle,DirectoryPathLen, andDirectoryPath; the response returns volume, directory id, search sequence, and directory rights.NCP 0x2222/63/ wire0x3fFile 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'sNW_FILE_INFO/NW_DIR_INFOcompatibility body.NCP 0x2222/64/ wire0x40Search for a File is endpoint-audited as the old two-byte-sequence direct search variant. It is intentionally documented separately from the newer22/30and87/03namespace search families.
Follow-up:
- Verify old direct search replies against a real requester or packet test,
especially the exact
NW_FILE_INFO/NW_DIR_INFOpacking 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/ wire0x56is endpoint-audited as the old Extended Attribute group.src/nwconn.cforwards requestdata starting at the EASubFunctionbyte tohandle_func_0x56()insrc/namspace.c, and maps the handler's non-negative return value todata_lenor its negative return value to the NCP Completion code.- The NDK/Core-Protocols EA table lists through-3.x subfunctions
86/01through86/05; all five source slots are present insrc/namspace.c, so no additional disabled source stubs are needed for this block. 86/01 Close Extended Attribute Handleis a success shim: it ignores the handle and returns no reply payload.86/02 Write Extended Attributeis a success shim: it does not persist EA data and currently returns no reply payload, although the NDK reply format includesErrorCode,BytesWritten, andNewEAHandle.86/03 Read Extended Attributereturns a fixed body withErrorCode0xc9/ERR_EA_NOT_FOUNDand zero lengths/handle fields, rather than reading real EA storage.86/04 Enumerate Extended Attributereturns a fixed all-zero body and no enumerated EA structures.86/05 Duplicate Extended Attributeshas a source case but is intentionally unimplemented and returns unknown request via0xfb.
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
libdirectorystore, 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/ wire0x57is endpoint-audited for the core namespace subfunctions87/01through87/12.src/nwconn.cforwards requestdata starting at the Name SpaceSubFunctionbyte tohandle_func_0x57()insrc/namspace.c, and maps a non-negative handler return value todata_lenor a negative value to the NCP Completion code.- The audited source slots are present for
87/01Open/Create File or Subdirectory,87/02Initialize Search,87/03Search for File or Subdirectory,87/04Rename Or Move,87/05Scan for Trustees,87/06Obtain File/Subdirectory Information,87/07Modify DOS Information,87/08Delete,87/09Set Short Directory Handle,87/10Add Trustee Set,87/11Delete Trustee Set, and87/12Allocate Short Directory Handle. - No new disabled source stubs were needed for this core block: the local
NDK/Core-Protocols table jumps from
87/12to salvageable-file calls such as87/16, and no default-compatibility87/13..87/15endpoints were found during this pass. - Current compatibility notes are documented inline per endpoint. Important
differences include
87/03returning at most one entry and treating the data stream as the same value as NameSpace, and87/10/87/11expecting trustee entries after fixed legacy path-structure areas.
Follow-up:
- Continue the
0x2222/87audit 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/ wire0x57is endpoint-audited for the later salvage/metadata/namespace subfunctions87/16through87/29that are present in the current source range.- Active source cases are documented inline for
87/16Scan Salvageable Files,87/17Recover Salvageable File,87/18Purge Salvageable File,87/20Search for File or Subdirectory Set,87/21Get Path String from Short Directory Handle,87/22Generate Directory Base and Volume Number,87/24Get Name Spaces Loaded List from Volume Number,87/26Get Huge NS Information,87/28Get Full Path String, and87/29Get Effective Directory Rights. - Disabled source stubs were added for eligible 3.x/4.x metadata gaps that were
not active in the source:
87/19Get NS Information,87/23Query NS Information Format,87/25Set NS Information, and87/27Get Name Space Directory Entry. These stubs are documentation-only and do not change runtime behavior. 87/26already had a source slot, but it is effectively unimplemented and still returns the default0xfbunknown request completion.
Name Space group 0x2222/87 open/create callback subset
Current status:
NCP 0x2222/87/ wire0x57is source-stub-audited for the next documented namespace subfunctions87/30through87/35.- The current source did not contain active handlers for this range, so disabled
#if 0stubs were added at the correct selector locations for:87/30Open/Create File or Subdirectory with DataStream,87/31Get File Information,87/32Open/Create File or Subdirectory with Callback,87/33Open/Create File or Subdirectory II with Callback,87/34Open CallBack Control, and87/35Modify 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
87subfunction ranges such as87/36..87/44,87/64..87/69, or the matching89long-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/ wire0x57is source-stub-audited for the next documented namespace/file subfunctions87/36through87/43.- The active source had no handlers for this range, so disabled
#if 0stubs were added at the correct selector locations for:87/36Log File,87/37Release File,87/38Clear File,87/39Get Directory Disk Space Restriction,87/40Search for File or Subdirectory Set (Extended Errors),87/41Scan Salvageable File List,87/42Purge Salvageable File List, and87/43Revoke File Handle Rights. 87/44Update 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/ wire0x57family are explicitly reviewed for scope rather than implemented or stubbed:87/44Update File Handle Rights,87/64Read File,87/65Write to a File,87/66Get Current Size of File,87/67Log Physical Record,87/68Release Physical Record, and87/69Clear 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 0cases 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 innwconn.cremain the compatibility paths for the current scope.
Follow-up:
- The
87family is now closed for the current endpoint-audit scope. Continue with the matching89Enhanced Name Space family as out-of-current-scope documentation, AFP35, or another unaudited endpoint family requested by the user.
Enhanced Name Space group 0x2222/89
Current status:
NCP 0x2222/89/ wire0x59Enhanced Name Space has been reviewed for generation scope.src/nwconn.chas no top-levelcase 0x59, and the local NDK/Core-Protocols Enhanced NCP chapter lists the89/xxoperations as a later-generation family, with request pages such as89/04and89/17marked for NetWare Servers 6.5 SP2.- The documented
89selectors are enhanced variants of namespace, trustee, salvage, EA, and rights calls already represented for the current scope by the86EA and87namespace audits. Examples include89/01Open/Create,89/02Initialize Search,89/03Search,89/04Rename/Move,89/05Scan Trustees,89/06Obtain Information,89/07Modify DOS Information,89/08Delete,89/09Set Short Directory Handle,89/10Add Trustee Set,89/11Delete Trustee Set,89/12Allocate Short Directory Handle, salvage and metadata selectors89/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 selectors89/50,89/52,89/53,89/54, and89/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 0x59or per-selector#if 0stubs unless the project scope is explicitly extended beyond NetWare 4.x.
Follow-up:
- If the target is extended later, treat
89as a filesystem/namespace provider family, not NDS. Reuse the normalized selector-path audit style from87, and map any real implementation onto the future filesystem/namespace provider rather thannwnds.
NDS/NCP Fragger group 0x2222/104
Current status:
NCP 0x2222/104/ wire0x68is planned NetWare-4.x/NDS work, not a default NetWare-3.x server feature.src/nwconn.calready had a top-levelcase 0x68that returns0xfb; patch 0217 keeps that runtime behavior and adds disabledMARS_NWE_4source-stub selectors for the documented NDS subfunctions.- The documented selector slots are
104/01Ping for NDS NCP,104/02Send NDS Fragmented Request/Reply,104/03Fragment Close,104/04Return Bindery Context,104/05Monitor NDS Connection,104/06Return NDS Statistics,104/07Clear Statistics, and104/08Reload NDS Software. 104/02is a nested-selector endpoint: after the NDS SubFunctionCode it carries a 32-bit NDSVerbpayload field. Document selector paths as0x2222/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
nwndsandlibdirectory, withnwservused only for control-plane actions such as reload/supervision. Normal NDS request payloads must not be routed throughnwservas a data-plane broker.
Follow-up:
- Keep the
MARS_NWE_4stubs disabled until a realnwnds/fragment-state design exists. The next endpoint audit can continue with deeper23bindery/property/admin coverage,36/37NCP Extension scope, print/spool17, 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 0slot 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/ wire0x0c,22/35/ wire0x23, and22/36/ wire0x24are disabled source stubs insrc/nwconn.c. - File Server Environment
23queue/server-management gaps that were previously documented as disabled stubs are present insrc/nwbind.c.
- Directory Services
- No source stubs are needed for message
21/04..21/08because they were not default-compatibility server endpoints in the checked SDK/PDF/WebSDK material.21/12remains later-generation only and should stay out of source under the current through-4.x planning scope. - Physical-record
26..31plus110, TTS34/00..34/10, and direct file commit/search/I/O59,61..77did 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 Fileis 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
nwatalkAFP metadata xattr layer (org.mars-nwe.afp.prodos-info) and is captured/restored in Salvage asprodos_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
.recycleor.salvagethrough 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
0214also records the NCP-level AFP 35/01..35/19 coverage inline insrc/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 SDK97and101is 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.