Files
mars-nwe/TODO.md

12 KiB

TODO

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

Server / NCP compatibility

Console privilege model

Current status:

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

Follow-up:

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

Queue spool path case handling

Current status:

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

Follow-up:

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

NCP 17/4C test coverage

Current status:

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

Follow-up:

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

NCP endpoint SDK documentation / stub audit

Current status:

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

Follow-up:

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

NCP endpoint audit tracking

Current status:

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

Follow-up:

  • Keep inline TODO: comments only where endpoint behavior is incomplete, approximate, intentionally dummy/no-op, or still needs SDK layout verification.
  • Mirror every real incomplete endpoint in this file so follow-up work remains visible outside the source code.
  • Do not treat every return(-1) in nwconn.c as incomplete: many of those paths intentionally forward bindery/global-server work to nwbind.

NCP synchronization endpoint audit

Current status:

  • The old NCP synchronization endpoint family in src/nwconn.c is now annotated with Novell SDK endpoint names.
  • The existing source already marked this area as not well tested, so the comments intentionally keep that compatibility warning visible.
  • NCP 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x1a, and 0x1e have local implementations.

Follow-up:

  • Verify the implemented file/logical-record/physical-record calls against the Novell SDK request/reply layouts and a real DOS requester or direct test caller.
  • Continue direct requester or NWTESTS coverage for the file, logical-record, and physical-record synchronization calls that are now wired.
  • Verify timeout and error-code behavior for set-oriented locking calls against a real requester, especially where MARS-NWE currently relies on the existing underlying share implementation.

Extended volume information field mapping

Current status:

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

Follow-up:

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

Object disk restriction fallback coverage

Current status:

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

Follow-up:

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

Server logging schema

Current status:

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

Follow-up:

  • Normalize new server log lines toward this shape:

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

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

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

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

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

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

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

Printing / Queue backend

Q_UNIX_PRINT backend status

Current status:

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

Follow-up:

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

Transaction Tracking System (TTS)

Current status:

  • NCP 0x22/0x00 TTS Is Available reports the WebSDK-documented unavailable status.
  • MARS-NWE does not currently implement TTS rollback semantics, transaction files, transaction status tracking, or the begin/end/abort transaction state machine.
  • Other TTS subfunctions remain unsupported instead of pretending to succeed without real transaction tracking.

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 WebSDK TTS calls include begin/end/abort transaction, status, threshold, and control/statistics operations.

Salvage / deleted-entry backend

Current status:

  • The shared salvage backend lives in src/nwsalvage.c / include/nwsalvage.h and is hooked into the normal server delete path.
  • Deleted payloads are moved to .recycle and per-object JSON sidecars are written below .salvage.
  • The sidecar schema preserves NetWare archive/fileinfo xattrs, AFP metadata when present, inherited rights mask, and explicit trustee entries.
  • The runtime configuration uses low nw.ini sections 51-59. Section 53 maps Samba-style behaviour flags (k, v, t, m), and sections 55-58 cover size filters, exclude, exclude_dir, and noversions lists.
  • NCP delete, Samba-compatible history naming, 87/16 scan, 87/17 recover, and 87/18 purge are covered by the combined smoke suite in tests/salvage/.
  • The legacy old salvage calls 22/27, 22/28, and 22/29 are adapters over the same shared backend, not a second deleted-entry implementation.
  • Samba-compatible history naming is the literal English Copy #n of NAME format used by vfs_recycle; it is not localized.
  • NCP 0x2222 / 87 / 16 has a backend-backed scanner that reads .salvage JSON entries and returns one salvageable entry per call. Stale JSON sidecars whose .recycle payload has disappeared are not returned and are removed by the scan path.

Follow-up:

  • Add explicit endpoint coverage for stale .salvage cleanup after manually or externally removing the matching .recycle payload.

AFP / Mac namespace backend

Current status:

  • The active 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 Files remains unsupported until the NCP salvage scan/recover/purge endpoints expose the shared deleted-entry backend semantics.

Follow-up:

  • After the NetWare salvage endpoints exist, implement AFP 0x13 as an adapter over the mars_nwe salvage/deleted-entry record.
  • AFP must not scan .recycle or .salvage directly.
  • Keep the detailed AFP TODO, inventory, and audit notes in tests/afp/.

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.
  • Packet Burst/NDS fragmentation support remains out of scope unless a concrete client requires it.