diff --git a/TODO.md b/TODO.md index 221d254..1b4b8e3 100644 --- a/TODO.md +++ b/TODO.md @@ -265,6 +265,22 @@ Current status: 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. +- `22/2a` Get Effective Rights for Directory Entry, `22/2b` Remove Extended + Trustee from Dir or File, `22/2d` Get Directory Information, `22/2e` Rename + Or Move (old), and `22/2f` Get Name Space Information now have inline + request/reply layout documentation and match the NetWare 1.x/2.x/3.x SDK/PDF + payload offsets used by the current parser. +- `22/2c` Get Volume and Purge Information 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. +- `22/30` Get Name Space Directory Entry matches the documented payload offsets; + the PDF does not label the `DOSSequence` byte order, and current code reads it + with `GET_32()`. +- `22/32` Get Object Effective Rights for Directory Entry and `22/33` Get + Extended Volume Information are documented by the local NDK/Core Protocols PDF + as NetWare 4.x/5.x calls. They are intentionally not added as TODO work for + the NetWare 1.x/2.x/3.x compatibility audit slice, even though MARS-NWE has + compatibility code for some newer clients. Follow-up: @@ -299,8 +315,15 @@ Follow-up: - Verify `22/28` 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. -- Continue the `0x2222/22` audit from `22/30` Get Name Space Directory Entry - onward, keeping each patch to a small logical endpoint block. +- Verify `22/2c` 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 `22/30` 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 now + complete through the documented `22/48` namespace call. Continue with the + next non-4.x/OES-only group after this block. ### Extended volume information field mapping diff --git a/src/nwconn.c b/src/nwconn.c index 3c4aacb..fd01ae6 100644 --- a/src/nwconn.c +++ b/src/nwconn.c @@ -4542,6 +4542,21 @@ static int handle_ncp_serv(void) break; case 0x2a : { /* Get Eff. Rights of DIR's and Files */ + /* + * NCP 0x2222/22/42 Get Effective Rights for Directory Entry. + * + * SDK request payload after the group header: + * byte DirHandle + * byte PathLen + * byte Path[PathLen] + * + * Reply: + * word AccessRights (Lo-Hi) + * + * Parser comparison: current code reads the documented + * payload offsets and returns the documented Lo-Hi rights + * word. + */ struct XDATA { uint8 eff_rights[2]; /* LO-HI */ } *xdata = (struct XDATA*) responsedata; @@ -4574,6 +4589,22 @@ static int handle_ncp_serv(void) break; case 0x2b : { /* remove ext trustees */ + /* + * NCP 0x2222/22/43 Remove Extended Trustee from Dir or File. + * + * SDK request payload after the group header: + * byte DirHandle + * long ObjectID (Hi-Lo) + * byte Unused + * byte PathLen + * byte Path[PathLen] + * + * No reply data. + * + * Parser comparison: current code reads DirHandle, + * ObjectID, the reserved byte, PathLen, and Path at the + * documented offsets. + */ struct INPUT { uint8 header[7]; /* Requestheader */ uint8 div[3]; /* 0x0, dlen, ufunc */ @@ -4610,6 +4641,29 @@ static int handle_ncp_serv(void) break; case 0x2c : { /* Get Volume and Purge Information */ + /* + * NCP 0x2222/22/44 Get Volume and Purge Information. + * + * SDK request payload after the group header: + * byte VolumeNumber + * + * Reply: + * long TotalBlocks (Hi-Lo in the PDF) + * long FreeBlocks (Lo-Hi) + * long PurgeableBlocks (Lo-Hi) + * long NotYetPurgeableBlocks (Lo-Hi) + * long TotalDirEntries (Lo-Hi) + * long AvailableDirEntries (Lo-Hi) + * byte Reserved[4] + * byte SectorsPerBlock + * byte VolumeNameLen + * byte VolumeName[VolumeNameLen] + * + * Parser comparison: request offset matches. The current + * reply maps Unix filesystem totals to the legacy shape and + * uses U32_TO_32() for all 32-bit counters; the PDF marks + * only TotalBlocks as Hi-Lo while the rest are Lo-Hi. + */ /* new Call since V3.11 */ /* ncpfs need this call */ int volume = (int) *(p+1); @@ -4645,6 +4699,25 @@ static int handle_ncp_serv(void) break; case 0x2d : { /* Get Direktory Information */ + /* + * NCP 0x2222/22/45 Get Directory Information. + * + * SDK request payload after the group header: + * byte DirHandle + * + * Reply: + * long TotalBlocks (Lo-Hi) + * long AvailableBlocks (Lo-Hi) + * long TotalDirEntries (Lo-Hi) + * long AvailableDirEntries (Lo-Hi) + * byte Reserved[4] + * byte SectorsPerBlock + * byte VolumeNameLen + * byte VolumeName[VolumeNameLen] + * + * Parser comparison: request offset and reply byte order + * match the documented legacy directory-information shape. + */ int dir_handle = (int) *(p+1); struct XDATA { uint8 total_blocks[4]; @@ -4679,19 +4752,23 @@ static int handle_ncp_serv(void) case 0x2e : { /* Rename or Move (old) */ /* - * NCP 22 / subfunction 46 (0x2e): Rename Or Move (old) + * NCP 0x2222/22/46 Rename Or Move (old). * - * Request: - * byte source directory handle - * byte search attributes - * byte source path component count - * source path components: byte len + bytes, repeated - * byte destination directory handle - * byte destination path component count - * destination path components: byte len + bytes, repeated + * SDK request payload after the group header: + * byte SourceDirHandle + * byte SearchAttribute + * byte SourcePathComponentCount + * byte SourcePath[SourcePathLen] + * byte DestDirHandle + * byte DestPathComponentCount + * byte DestPath[DestPathLen] * * No reply data. This old call uses component-counted * paths, unlike the plain length-prefixed NCP 69 rename. + * + * Parser comparison: current code decodes both component + * path lists in the documented order and supports different + * source/destination handles. */ uint8 srcpath[256]; uint8 dstpath[256]; @@ -4755,6 +4832,22 @@ static int handle_ncp_serv(void) #if WITH_NAME_SPACE_CALLS case 0x2f : { /* Fill namespace buffer */ + /* + * NCP 0x2222/22/47 Get Name Space Information. + * + * SDK request payload after the group header: + * byte VolumeNumber + * + * Reply is a variable-length namespace/datastream inventory: + * DefinedNameSpaces, namespace names, DefinedDataStreams, + * stream-to-namespace mappings, loaded namespaces, volume + * namespaces, and volume data streams. + * + * Parser comparison: request offset matches. Reply is built + * by fill_namespace_buffer(); it reports MARS-NWE's known + * DOS/MAC/NFS/FTAM/OS2 namespace table and loaded/volume + * namespace lists in the documented variable layout. + */ /* ncopy use this call */ int volume = (int) *(p+1); /* (p+2) == 0xe4 or 0xe2 sometimes ???? */ @@ -4767,6 +4860,21 @@ static int handle_ncp_serv(void) break; case 0x30 : { /* Get Name Space Directory Entry */ + /* + * NCP 0x2222/22/48 Get Name Space Directory Entry. + * + * SDK request payload after the group header: + * byte VolumeNumber + * long DOSSequence + * byte NameSpace + * + * Reply is the namespace-specific directory-entry record. + * + * Parser comparison: request offset matches. The PDF does + * not label DOSSequence byte order; current code reads it + * with GET_32() and get_namespace_dir_entry() returns the + * DOS NW_SCAN_DIR_INFO-shaped entry for the resolved base. + */ int volume = (int) *(p+1); uint32 basehandle = GET_32(p+2); int namespace = (int) *(p+6);