# NSS namespace and storage import audit This note records the namespace follow-up after the Unicode/codepage/GUID import series. The goal is to replace the old MARS `namedos`/`nameos2` logic with the more complete NSS namespace implementation. Do not add a permanent wrapper around the old MARS namespace code; import/adapt NSS namespace sources directly and then retire the duplicate MARS implementation in controlled steps. ## Source tree Primary NSS namespace source locations in the supplied reference archives: ```text public_core/comn/namespace/nameSpace.c public_core/comn/namespace/dosNSpace.c public_core/comn/namespace/dosNSWild.c public_core/comn/namespace/longNSpace.c public_core/comn/namespace/macNSpace.c public_core/comn/namespace/unixNSpace.c public_core/comn/namespace/dataStreamNSpace.c public_core/comn/namespace/extAttrNSpace.c public_core/comn/namespace/*NSpace.h public_core/comn/namespace/nspaceStartup.h shared/sdk/include/nameSpace.h shared/sdk/internal/macNSpace.h shared/sdk/internal/unixNSpace.h ``` The imported mars-nwe namespace model now lives directly under `src/nwfs/` and `include/nwfs/`. The duplicate `src/nwfs/nss/namespace/` staging tree was removed after adding `nwfs.namespace.model`; future concrete function imports should come from the supplied NSS archives and land directly in normal libnwfs paths. The NSS namespace set covers the target replacement area: - DOS namespace - LONG namespace - MAC namespace - UNIX namespace - Data Stream namespace - Extended Attribute namespace ## Why this is not a small helper import The namespace implementation is not just string parsing. The real NSS files use common-layer/file-system state: ```text comnPublics.h comnParams.h comnBeasts.h comnVariableData.h adminVolume.h comnBeastClass.h pssStartup.h name.h msgName.h msgGen.h zParams.h sysimp.h ``` Important runtime hooks include: - namespace registration through `COMN_RegisterNameSpace()` - AdminVolume namespace beasts - root variable-data registration for MAC/UNIX metadata - name-beast/cache structures - unique-name generation against directories - message/error plumbing So the namespace block should not be treated like the earlier pure helper libs (`crc`, `unicode`, `utc`, `guid`, `xString`). It is closer to an NSS common-layer subsystem and belongs on the path toward `libnwfs`. ## Import direction ### libnwcore `libnwcore` should receive only stable reusable primitives needed by several other imports: - public NSS namespace IDs/flags/types - component scan/compare/convert helpers once their common-layer dependencies are adapted - wildcard helpers - DOS/LONG/MAC/UNIX legal-character logic - Data Stream / Extended Attribute namespace constants and parser helpers ### libnwfs `libnwfs` is the target for direct NSS namespace runtime integration: - namespace registration - DOS/LONG/MAC/UNIX namespace objects - Data Stream namespace objects - Extended Attribute namespace objects - volume/pool namespace exposure - metadata/salvage/stream integration - future `_ADMIN` virtual management volume The old MARS files are replacement targets, not extension points: ```text include/namedos.h include/nameos2.h src/namedos.c src/nameos2.c src/namspace.c ``` `namedos`/`nameos2` should be retired after NSS DOS/LONG/MAC/UNIX namespace code is imported and tests show identical or better NetWare 3.x DOS behavior. ### libnwnds NDS/eDirectory helpers stay out of `libnwcore`: ```text public_core/library/eDir/getDSGuid.c public_core/library/eDir/parseDSObjectName.c ``` `getDSGuid.c` depends on DDC/DS read APIs and belongs in a future `libnwnds`. A simple DS object-name parser can be imported there later if 4.x guarded endpoints need it. ### libnwbind Bindery/auth/object-ID bridging remains separate: ```text public_core/comn/authsys/* ``` That code references bindery/auth/common-layer internals and should become a future `libnwbind` or `libnwauth` block, not a core namespace import. ## Bottom-up namespace dependency order The namespace import is now intentionally ordered from the lowest reusable NSS state upward. Do not make `dosNSpace.c` compile by adding local shim functions or reduced replacement headers. If an imported file needs another NSS symbol, find the source/header that owns that symbol, check whether the corresponding primitive already exists in `include/core`, and import the missing layer first. Current dependency walk from the imported DOS namespace source: ```text dosNSpace.c -> DOSNS_Startup() -> COMN_RegisterNameSpace() -> public_core/comn/namespace/nameSpace.c -> comnBeastClass.h / comnBeasts.h / adminVolume.h / pssStartup.h -> latch.h + xCache.h + NSS MPK/OS abstraction headers ``` `comnBeasts.h` is the first blocker, not the DOS namespace code itself. It includes `latch.h` and `xCache.h`; `xCache.h` then pulls the scheduler/FSM/cache header family (`alarm.h`, `control.h`, `fsm.h`, `asyncio.h`), and `latch.h` pulls `pssmpk.h`, `pssDebug.h`, `fsm.h` and `parse.h`. These are NSS runtime abstractions, so the next import must start below beast/namespace with the smallest real buildable support layer rather than with `nameSpace.c`. Core-owned headers must not be duplicated under `include/nwfs`. The following are already supplied by the existing core layer and should be found through the `mars_nwe::core` dependency or the explicit core include path: ```text include/core/bit.h include/core/guid.h include/core/omni.h include/core/que.h include/core/utc.h include/core/xError.h include/core/xUnicode.h include/core/zOmni.h ``` Headers that are genuinely NSS/NWFS-specific are imported flat as `include/nwfs/
.h`; do not keep them under `include/nwfs/nss/...`, and do not add private copies under `src/nwfs/`. The planned code order is therefore: 1. `nwcore-nss-spinlock`: Linux-userspace spinlock primitive backed by POSIX `pthread_spinlock_t`. This is core-owned because the NSS latch/MPK/runtime layer is shared infrastructure, not a filesystem object. mars-nwe is Linux userspace only for this path; do not add BSD portability scaffolding here. 2. `nwcore-nss-mpk-lock`: direct NSS `pssmpk.h` plus `public_core/library/os/pssmpk.c` import for the global `MPKNSS_LOCK` API, ported to the core Linux-userspace spinlock backend. The companion NSS histogram base from `shared/sdk/include/histogram.h` and `public_core/library/misc/histogram.c` is also present so the MPK `MeasureSpinLock` instrumentation path keeps its original shape. This is now present in `libnwcore` and covered by `nwcore.pssmpk`. 3. `nwcore-nss-runtime-base`: the next smallest real subset of NSS scheduler/FSM headers and sources needed by `latch.h`/`xCache.h`, with Linux-kernel-only or NDPS/DDS-only includes removed or guarded only when the filesystem path does not use them. 4. `nwfs-latch-cache-base`: direct imports for `latch`/cache types required by beast structures once the generic runtime primitives are in core. 5. `nwfs-beast-base`: beast class and root-beast structure support. 6. `nwfs-admin-volume`: build the `_ADMIN` virtual volume model, but do not expose it through NCP until the runtime path is ready. 7. `nwfs-namespace-registry`: `nameSpace.c` and registration state. 8. DOS namespace activation: build `dosNSpace.c` only after the registry and its real dependencies are present. The `_ADMIN` volume ID policy for that later import is fixed even while the volume is hidden from NCP: ```text SYS => volume ID 0 _ADMIN => volume ID 1 other volumes start at ID 2 ``` ## `_ADMIN` virtual volume NSS also carries the `_ADMIN` management volume model. It is storage/filesystem management state, not a primitive core helper and not an eDirectory library by itself. Known NSS/OES shape to preserve later: ```text SYS => reserved volume ID 0 _ADMIN => reserved volume ID 1 ``` `_ADMIN` is a virtual system/management NCP volume. It should not be treated as a normal exported data volume and should not be enabled by default for NetWare 3.x behavior. Later `libnwfs` work can model it as hidden/admin-only and expose NSS management trees such as: ```text _ADMIN:/Pools _ADMIN:/Volumes _ADMIN:/NameSpaces _ADMIN:/BeastClasses _ADMIN:/AuthModels _ADMIN:/Manage_NSS/... ``` Use `libnwnds` only for the eDirectory backend portions behind this virtual filesystem when those are imported. The virtual volume/runtime belongs to `libnwfs`. ## Compression follow-up NSS compression is another `libnwfs` candidate, not `libnwcore`. Lowlevel algorithm sources found under `public_core/comn/compression/`: ```text cdcomp.c cdcompa.c cduncomp.c cduncompa.c copyAlgo.c nwAlgo.c nwAlgo.h cdcommon.h cdcomp.h cduncomp.h ``` Larger compression manager/runtime sources also exist there: ```text cmActivity.c cmAlgoMan.c cmBgCompress.c cmCompDecomp.c cmCompFile.c cmControl.c cmRuntime.c comnCompress.c ``` Import order should be: 1. Data stream / namespace / volume metadata basis. 2. Lowlevel NetWare/NSS compression algorithm. 3. Compression metadata/accounting and active compression/decompression state. 4. NCP providers. Relevant NCP endpoints already audited in decimal and wire/code notation: ```text decimal 90/12 == wire/code 0x5a/0x0c Set Compressed File Size decimal 123/70 == wire/code 0x7b/0x46 Get Current Compressing File decimal 123/71 == wire/code 0x7b/0x47 Get Current DeCompressing File Info List decimal 123/72 == wire/code 0x7b/0x48 Get Compression and Decompression Time and Counts decimal 22/51 == wire/code 0x16/0x33 Extended Volume Info compression counters ``` Do not synthesize fake compression state. Those endpoints should remain stubbed/guarded until `libnwfs` has real stream/volume compression state. ## Host-created files and namespace reconciliation The namespace replacement must cover files that appear without a MARS/NCP create path. Samba, rsync, backup restore, local `mv`/`cp`, and administrator edits can all create visible directory entries under a volume root before MARS-NWE has a DOS/LONG/MAC/UNIX namespace record for them. The future `libnwfs` namespace layer should therefore pair the NSS namespace engine with a host-side reconcile path: ```text watcher path: inotify/fanotify for CREATE, MOVED_TO, DELETE, RENAME and ATTRIB update or create netware.metadata where the event is unambiguous invalidate namespace lookup/search/namecache state startup/full scan path: walk the visible Linux tree after volume mount/startup allocate missing stable file IDs in netware.metadata create DOS/LONG/MAC/UNIX namespace records for normal files report orphaned .nwfs_streams and invalid .recycle metadata ``` For an ordinary host-created file, use conservative initial names: UNIX/backend name is the current Linux name, LONG/OS2 name is the current Linux name, DOS name is generated by the DOS namespace engine, and MAC name is derived only through the future MAC namespace rules. Do not create a private side database for this state; `netware.metadata` remains authoritative. MAC namespace state is not transport state. Classic Mac clients may later arrive through TCP/IP NCP, but the namespace engine sees namespace IDs and file requests, not TCP-specific session data. Resource forks and Finder info belong to `libnwfs` streams/metadata. ## Patch plan Recommended next patches: 1. Continue replacing namespace-model stubs with the smallest buildable NSS namespace primitives directly under `src/nwfs/`. 2. Import/adapt DOS and LONG namespace scan/compare/convert functions. 3. Import/adapt MAC and UNIX namespace functions, with metadata hooks tied to NSS-shaped metadata rather than private parallel state. 4. Import/adapt Data Stream and Extended Attribute namespace helpers. 5. Add regression tests against current MARS DOS/OS2 behavior. 6. Switch `namspace.c` callsites from old MARS `namedos`/`nameos2` logic to the imported NSS namespace code. 7. Remove old `namedos`/`nameos2` after behavior is covered. 8. Add `libnwfs` follow-ups for `_ADMIN`, namespace registration visibility, and compression after the namespace/storage basis is present. ## Endpoint relevance The namespace replacement primarily supports NCP namespace/file endpoints, especially decimal 87 == wire/code `0x57`. Data stream and extended attribute namespace support also feeds NSS-shaped metadata and future 4.x guarded work. This does not change the NetWare 3.x priority: DOS behavior must remain correct, and 4.x/MAC/UNIX/DataStream/EA pieces can stay guarded until callsites are ready. ## 0488 core: import NSS mailbox runtime Imported the real NSS mailbox runtime before FSM/latch: - `shared/sdk/include/mailbox.h` -> `include/core/mailbox.h` - `public_core/library/os/mailbox.c` -> `src/core/mailbox.c` This is a bottom-up dependency for `public_core/library/fsm/fsmnw.c` and the latch runtime. No scheduler wrapper is introduced in this step. ## 0489 core: import NSS production debug header base Imported the real NSS production-debug interface before FSM/latch: - `shared/sdk/include/pssDebug.h` -> `include/core/pssDebug.h` - `shared/sdk/include/schedule.h` -> `include/core/schedule.h` - `shared/sdk/library/xStdio.h` -> `include/core/xStdio.h` - `shared/sdk/library/inlines.h` -> `include/core/inlines.h` - `public_core/library/debug/pssDebug.c` -> `src/core/pssDebug.c` This is intentionally the production/no-debug path: `NSS_DEBUG` is disabled by `include/core/omni.h`, so `DEBUG_PRINTF`, `ENTER`, `RTN_*`, and related macros compile to the same inert form as the original header's `#else /* NSS_DEBUG */` branch. The Linux userspace port keeps the original header/source shape but moves the scheduler/xStdio/inlines includes behind `NSS_DEBUG IS_ENABLED`, so the inactive debug branch does not pull the full scheduler/console stack before FSM and alarm are imported. The next runtime import can now use `` without local stubs. FSM still comes later from `public_core/library/fsm/fsmnw.c`; do not reintroduce a scheduler wrapper. ## 0490 core: import NSS stdio formatter runtime Imported the NSS bounded formatter as another bottom-up core dependency before parse/FSM/latch code: - `public_core/library/stdio/snprintf.c` -> `src/core/snprintf.c` - `public_core/library/stdio/snprintf.h` -> `include/core/snprintf.h` This is not an `.imp` reconstruction and not a libc replacement. The port keeps the formatter implementation and makes only Linux-userspace compile changes: remove the kernel module include, use existing core Unicode declarations, and keep the two formatter-local `Stack_s` allocations on automatic storage until the real NSS private stack/MPK allocator layer is imported. Existing core UTC remains authoritative; no NSS UTC duplicate was imported. ## 0491 stdio formatter prerequisite Imported `public_core/library/stdio/sprintf.c` and `public_core/library/stdio/vsprintf.c` into `src/core/` with only Linux userspace include adjustment from `/` to the existing Core NSS stdio header and standard ``. This keeps parse/wio work bottom-up without inventing wrappers. ## 0492 core: import NSS Linux WIO output base The parse dependency chain now has the real NSS WIO output base instead of a local wrapper: - `shared/sdk/include/wio.h` is imported as `include/core/wio.h`. - `public_core/library/wio/wio.c` is imported as `src/core/wio.c`; its Linux `LB__wioOutput()` path is used. - `public_core/library/wio/nssUI.c` is imported as `src/core/nssUI.c`; the kernel `/proc` transport is ported to Linux userspace stdout while retaining the NSS `NSS_UI_vprintf()` formatter/colour path. - The small WIO stdio forwarding files are imported from NSS rather than recreated: `printf.c`, `vprintf.c`, `aprintf.c`, `vaprintf.c`, `wprintf.c`, `wvprintf.c`, and `waprintf.c`. This still does not import full interactive window/input handling. Parser help paths that require cursor movement and wrapping will need the next real WIO functions (`wGetPos`, `wSetPos`, `wWrapString`) or the parser must be imported only after those NSS sources are available and ported. ## 0493 Core production-debug/WIO cleanup After importing the Linux WIO output path, the production `pssDebug.h` path no longer needs to hide the NSS stdio declarations behind `NSS_DEBUG`. Keep the heavy scheduler include gated until the real scheduler/FSM runtime is imported, but expose the real `xStdio.h` and `inlines.h` includes unconditionally so `PRINT()` resolves through the imported WIO/stdio stack instead of relying on implicit declarations or placeholder output assumptions. This audit also rechecked the earlier runtime patches for placeholders. The remaining known non-final item is `procdefs.h`, which is still a small Core port header rather than the full Linux-kernel NSS `lnxmbINC/procdefs.h`; keep it tracked until the real scheduler/OS layer decides which declarations are needed. Do not expand it by copying `.imp` files or inventing missing APIs.