All checks were successful
Source release / source-package (push) Successful in 47s
Extend the conservative NCP 0x2222/35/16 AFP 2.0 Set File Information smoke path beyond FinderInfo-only writes by accepting the file Attributes bitmap for one deliberately narrow bit: Finder Invisible. WebSDK and Netatalk FPSetFileParams semantics carry file attributes as bitmap bit 0, with ATTRBIT_SETCLR selecting set-vs-clear behavior. Mirror that model only for ATTRBIT_INVISIBLE and reject all other AFP attribute bits so DOS/NetWare mode bits, timestamp writes, resource forks, and broader file protection semantics are not implied accidentally. Persist the mars_nwe-owned AFP attribute word in org.mars-nwe.afp.attributes via the local xattr abstraction. On Linux this maps to user.org.mars-nwe.afp.attributes, matching the org.mars-nwe.* source-level namespace while remaining portable on Linux xattr backends. Get File Information and Scan File Information now merge that stored Invisible bit into the existing 120-byte AFP file-info record. Update the Linux Set File Information smoke helper with --invisible, --clear-invisible, --attributes-only, and --finder-info-only so FinderInfo and the narrow AFP attribute path can be tested independently or together. Tests: git diff --check Tests: gcc -Iinclude -I/mnt/data/stubs -fsyntax-only tests/linux/afp_set_file_info_smoke.c TODO: keep all other AFP Set File Information bits rejected until their write-safe mapping to NetWare/DOS attributes, timestamps, CNID, and resource-fork metadata is designed.
16 KiB
16 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.
NCP synchronization endpoint audit
Current status:
- The old NCP synchronization endpoint family in
src/nwconn.cis 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, and0x1ehave 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 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.
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 0x22/0x00 TTS Is Availablereports 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.
AFP / Mac namespace backend
Current status:
NCP 0x23still returns invalid namespace for AFP calls that are not implemented yet.AFP Get Entry ID From Path Nameis implemented when the optional Netatalk/libatalk backend is available. Linux smoke coverage exists intests/linux/afp_entry_id_smokeand has been verified againstSYS:,SYS:PUBLIC,SYS:SYSTEM, andSYS:BURSTwith stat-derived fallback entry IDs.AFP Get Entry ID From Nameis implemented for the same path-backed smoke mode. Linux smoke coverage usestests/linux/afp_entry_id_smoke --from-nameand has been verified againstSYS:,SYS:PUBLIC,SYS:SYSTEM, andSYS:BURSTwith stat-derived fallback entry IDs.AFP Get File Informationis implemented for read-only path-based requests. Linux smoke coverage exists intests/linux/afp_file_info_smokeand has been verified againstSYS:,SYS:PUBLIC,SYS:SYSTEM, andSYS:BURST. The same test verifies the AFP 2.0 Get File Information subfunction via--afp20against the same paths, using the same path-backed read-only reply for now. The current reply fills stat/libatalk-derived fields and leaves persistent CNID Parent ID / fuller Mac namespace metadata as future work.AFP Scan File Information(0x0a) andAFP 2.0 Scan File Information(0x11) are implemented for path-backed read-only directory scans. Linux smoke coverage exists intests/linux/afp_scan_info_smoke; the helper defaults to the AFP 2.0 subfunction and uses--afp10for the older endpoint. Runtime coverage has been verified againstSYS:PUBLICby walking multiple directory entries with the returnednext_last_seenAFP Entry ID continuation value. The verified AFP 2.0 and older0x0afirst records both returnpmdflts.ini(entry_id=0x23c8787d,data_len=8161) on the sample tree, and an AFP 2.0 continuation with that Entry ID returnsohlogscr.bat(entry_id=0x260437f6,data_len=1296).AFP Get Entry ID From NetWare Handleis implemented for read-only data-fork file handles that are opened in the same client connection. Linux smoke coverage usestests/linux/afp_entry_id_smoke --from-handleand has been verified againstSYS:PUBLIC/pmdflts.iniandSYS:PUBLIC/ohlogscr.bat, returning volume 0,fork=0, and stat-derived fallback Entry IDs for now.AFP Open File Forkis implemented for the same path-backed smoke subset. RawVOL:-style paths resolve the effective NetWare volume from the path prefix instead of assuming volume 0, so the same smoke path can coverSYS:and non-SYS:volumes. It opens only the data fork read-only and returns a normal six-byte NetWare file handle plus the current data-fork length; the Linux smoke helpertests/linux/afp_open_file_fork_smokecloses the returned handle in the same connection. Runtime smoke coverage is green forSYS:PUBLIC/pmdflts.ini(fork_len=8161) andSYS:PUBLIC/ohlogscr.bat(fork_len=1296) usingfork=0and read access0x01. Resource-fork opens, write access, and Entry-ID-only lookup stay TODO until AppleDouble/resource-fork and persistent CNID/base-ID semantics are available.AFP Alloc Temporary Directory Handleis implemented for the same path-backed smoke subset. RawVOL:-style paths resolve the effective NetWare volume from the path prefix instead of assuming volume 0. Linux smoke coverage exists intests/linux/afp_temp_dir_handle_smoke; runtime smoke coverage is green forSYS:,SYS:PUBLIC,SYS:SYSTEM, andSYS:BURST. The helper returns a temporary NetWare directory handle plus the AFP one-byte access-rights mask and immediately deallocates the handle in the same connection. Server diagnostics log the wider internal NetWare effective-rights mask, so privileged directories can showrights=0x1ffwhile the client printsrights=0xff. Entry-ID-only allocation remains TODO until persistent CNID/base-ID lookup exists.AFP 2.0 Set File Informationis implemented only for path-backed file metadata smoke writes: the FinderInfo bitmap (0x0020) and the AFP Attributes bitmap (0x0001) restricted to the Finder Invisible bit. Linux smoke coverage exists intests/linux/afp_set_file_info_smoke; runtime FinderInfo coverage is green forSYS:PUBLIC/pmdflts.iniwith Finder typeTEXTand creatorMARS. The helper writes 32 bytes of FinderInfo toorg.mars-nwe.afp.finder-info, stores the narrow attribute word inorg.mars-nwe.afp.attributes, and verifies the result through AFP 2.0 Get File Information. The first stat-derived AFP entry id for a path is now cached in the versionedorg.mars-nwe.afp.entry-idxattr; afallbackmarker on that first verification Get File Information diagnostic describes the entry-id origin, not the FinderInfo write result. Follow-up probes should read the cached mars_nwe entry id and omit the fallback marker. All other Set File Information bits remain rejected until their write semantics are explicitly designed.- The AFP dispatcher now decodes the WebSDK/NWAFP subfunction number in diagnostics so real client probes can be mapped to the corresponding AFP call before implementation work starts.
- Optional build-time detection/linking for Netatalk/libatalk exists as a first local metadata backend hook. It is deliberately not an AFP protocol implementation yet.
- Existing mars_nwe private xattr payloads use the
org.mars-nwe.<domain>.*namespace (org.mars-nwe.netware.archiveandorg.mars-nwe.netware.fileinfo) rather than the unreleased test-onlyuser.mars_nwe.*names. There is no legacy read fallback because the old names never shipped outside local test systems. On Linux, mars_nwe's local xattr helper maps source-levelorg.mars-nwe.<domain>.*names to the portableuser.org.mars-nwe.<domain>.*storage namespace, mirroring Netatalk'sorg.netatalk.*EA abstraction. - NetWare AFP calls are NCP entry points for Mac namespace semantics on a
NetWare volume, not transport-level AFP proxy calls to
afpd.
Follow-up:
- Implement the NetWare AFP NCP calls locally, using libatalk helpers rather
than proxying requests to
afpd. - Candidate libatalk pieces include the new AppleDouble/Finder Info/resource fork helper wrappers, plus future CNID/directory-id helpers, attribute mapping, and filename conversion.
- Keep returning invalid namespace for AFP calls that still lack a real per-volume Mac namespace/AFP metadata layer. Do not return success for additional AFP calls without data/resource fork and Finder Info semantics.
- Replace the compatibility stat-derived AFP entry-id generator with a real CNID/directory-id allocator once the libatalk/CNID backend is integrated.
- mars_nwe-owned AFP entry ids are probed first from the versioned
org.mars-nwe.afp.entry-idxattr before consulting Netatalk/libatalk AppleDouble/CNID metadata. If neither source has an id, mars_nwe derives the existing stat-compatible id and caches it in that xattr so subsequent probes can use persistent mars_nwe metadata. Linux smoke coverage confirms the versioned xattr payload shape, for example0x010000007b9c42e1for a cached0x7b9c42e1Entry ID. AFP directory-scan continuation remains directory iteration based:last_seenskips past the previously returned object, but the next returned Entry ID is not required to be numerically greater than the continuation token. FinderInfo and the Finder Invisible AFP attribute now have deliberately narrow write paths through AFP 2.0 Set File Information; CNID allocation and broader AFP metadata writes still need a deliberate write-safe design. - Put additional future mars_nwe-owned AFP metadata under
org.mars-nwe.afp.*(or a compactorg.mars-nwe.afp.metadatarecord) and keep Netatalk-owned metadata under Netatalk's ownorg.netatalk.*keys. - Extend the Linux AFP smoke tests once additional AFP subfunctions are implemented, especially Finder Info updates, fork open/read/write paths, resource-fork handling, and broader directory-scan edge cases.
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.