Files
mars-nwe/TODO.md
2026-06-02 18:30:37 +02:00

1361 lines
73 KiB
Markdown

# 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 `0x2222/111` / wire `0x6f` Semaphore is source-stub-audited as
the newer NetWare 3.x/4.x paired semaphore family. The old `32/xx`
semaphore calls remain the active compatibility implementation; patch 0223
records `111/00`..`111/04` as disabled `#if 0` selector slots in
`src/nwconn.c` so the future semaphore provider can bridge both families.
- SDK `0x2222/90` / wire `0x5a` Data Migration / tree metadata is
source-stub-audited as planned 4.x filesystem/namespace work. Patch 0224
records the 4.x-era `90/00`, `90/10`, `90/11`, `90/12`, `90/128`..`90/136`,
and `90/150` selector slots behind `MARS_NWE_4` in `src/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, not `nwnds`.
- SDK `0x2222/17` / wire `0x11` direct 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 slots `17/00`, `17/01`, `17/02`, `17/03`, `17/06`,
`17/09`, and `17/10` as a disabled `#if 0` stub in `src/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 to `nwnds`.
- SDK `0x2222/36` and `0x2222/37` / wire `0x24` and `0x25` NCP Extension
are source-stub-audited as a NetWare 4.x extension-registration family.
Patch 0221 records the documented `36/00`..`36/06` information selectors and
direct `37` execute-extension call behind `MARS_NWE_4` in `src/nwconn.c`.
There is no active extension registry/provider yet, and `nwserv` must remain
a control-plane registry/supervisor rather than a data-plane broker for
extension payloads.
- SDK `0x2222/79`, `0x2222/84`, and `0x2222/85` / wire `0x4f`, `0x54`, and
`0x55` are source-stub-audited as old direct file-metadata/open-create and
sparse-data compatibility calls. Patch 0222 records disabled `#if 0` slots
in `src/nwconn.c`; future implementation belongs to the filesystem/namespace
provider and should not be confused with NDS directory-object attributes.
SDK-listed blocks that do not currently show a top-level handler in
`src/nwconn.c`:
- SDK `0x2222/92` / wire `0x5c` SecretStore 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
subverbs `0` Query Server through `9` Get Service Information. There is no
active top-level handler in `src/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` / 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.
They are now source-stub-audited separately at the direct wire `0x6f`
dispatch slot; any future implementation should bridge to a shared
semaphore provider rather than duplicating the old `32/xx` implementation.
#### Direct semaphore group 0x2222/111
Current status:
- Direct `NCP 0x2222/111` / wire `0x6f` is source-stub-audited in
`src/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 0` block:
- `111/00` Open/Create a Semaphore
- `111/01` Examine Semaphore
- `111/02` Wait On (P) Semaphore
- `111/03` Signal (V) Semaphore
- `111/04` Close Semaphore
- The old `32/xx` semaphore group remains the active compatibility path.
Future implementation should decode the `111/xx` wrapper and share the
same semaphore provider/state rather than building a second semaphore table.
Known differences / follow-up:
- The NDK documents `SemaphoreHandle` as long Lo-Hi for both old `32/xx` and
newer `111/xx` families. 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 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:
```text
<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:
```text
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.