From af8287ff85b6607367e19f677ae4583c9edac4db Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Tue, 2 Jun 2026 04:53:33 +0000 Subject: [PATCH] docs: document remaining queue service layouts --- TODO.md | 37 +++++++++++------ src/nwbind.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 13 deletions(-) diff --git a/TODO.md b/TODO.md index 9e441c4..95ca60f 100644 --- a/TODO.md +++ b/TODO.md @@ -606,13 +606,18 @@ Current status: 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` and the paired newer - variants SDK `23/121`, `23/122`, `23/126`, `23/127`, and `23/128` were - compared against the NDK/Core-Protocols PDF and `nwqms.h`/WebSDK queue APIs. +- 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. + `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. Follow-up: @@ -636,13 +641,23 @@ Follow-up: 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/126` / wire `0x7e`, - SDK `23/127` / wire `0x7f`, and SDK `23/128` / wire `0x80` document long or - Lo-Hi fields in the PDF, while the current compatibility parser often reuses - the old 16-bit layout. -- Audit the remaining forwarded `0x2222/23` queue and management subfunctions - in the files that actually handle them instead of treating the `nwconn.c` - forwarding points as complete local implementations. + 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. +- Continue the `0x2222/23` audit with the remaining queue rights/status calls + not yet documented in `src/nwbind.c`: SDK `23/116` / wire `0x74` Change To + Client Rights (old), SDK `23/117` / wire `0x75` Restore Queue Server Rights, + SDK `23/118` / wire `0x76` Read Queue Server Current Status (old), SDK + `23/119` / wire `0x77` Set Queue Server Current Status, SDK `23/130` / wire + `0x82` Change Queue Job Position, SDK `23/133` / wire `0x85` Change To Client + Rights, SDK `23/134` / wire `0x86` Read Queue Server Current Status, and any + matching helper/prehandler paths. +- 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 diff --git a/src/nwbind.c b/src/nwbind.c index 5131b22..dde9b32 100644 --- a/src/nwbind.c +++ b/src/nwbind.c @@ -2352,7 +2352,14 @@ static void handle_fxx(int gelen, int func) break; case 0x6f : { /* attach server to queue */ - /* from pserver */ + /* + * SDK 23/111 / wire 0x6f Attach Queue Server To Queue. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * Reply: no data. + * Parser comparison matches the documented queue-server + * attach layout. + */ uint32 q_id = GET_BE32(rdata); int result=nw_attach_server_to_queue( act_c->object_id, @@ -2365,7 +2372,14 @@ static void handle_fxx(int gelen, int func) break; case 0x70 : { /* detach server from queue */ - /* from pserver */ + /* + * SDK 23/112 / wire 0x70 Detach Queue Server From Queue. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * Reply: no data. + * Parser comparison matches the documented queue-server + * detach layout. + */ uint32 q_id = GET_BE32(rdata); int result=nw_detach_server_from_queue( act_c->object_id, @@ -2380,6 +2394,20 @@ static void handle_fxx(int gelen, int func) case 0x78: /* Get Queue Job File Size (old) */ case 0x87: /* Get Queue Job File Size */ { + /* + * SDK 23/120 / wire 0x78 Get Queue Job File Size (old) + * and SDK 23/135 / wire 0x87 Get Queue Job File Size. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * word JobNumber (Hi-Lo) for old wire 0x78 + * long JobNumber for newer wire 0x87 + * Reply documented by the WebSDK queue pages: + * long QueueID, long JobNumber, long FileSize. + * Parser/reply comparison: both variants currently consume + * a 16-bit JobNumber. The old reply returns a 16-bit + * JobNumber, and the newer reply pads that 16-bit value to + * four bytes instead of serializing a true long. + */ uint32 q_id = GET_BE32(rdata); uint32 job_id = (ufunc==0x78) ? GET_BE16(rdata+4) @@ -2405,6 +2433,19 @@ static void handle_fxx(int gelen, int func) case 0x71 : /* service queue job old */ case 0x7c : { /* service queue job */ + /* + * SDK 23/113 / wire 0x71 Service Queue Job (old) and + * SDK 23/124 / wire 0x7c Service Queue Job. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * word TargetServiceType (Hi-Lo) + * Reply: QueueJobStruct, old 54-byte fixed reply for wire + * 0x71 and newer reserved-prefix/NWQueueJobStruct reply for + * wire 0x7c, including the opened job file handle. + * Parser comparison matches the common QueueID/type request + * header and delegates the variant reply shape to the queue + * backend helper. + */ uint32 q_id = GET_BE32(rdata); int type = GET_BE16(rdata+4); int result=nw_service_queue_job( @@ -2423,6 +2464,18 @@ static void handle_fxx(int gelen, int func) case 0x6D: /* Change Queue Job Entry old */ case 0x7B: /* Change Queue Job Entry */ { + /* + * SDK 23/109 / wire 0x6d Change Queue Job Entry (old) and + * SDK 23/123 / wire 0x7b Change Queue Job Entry. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * QueueJobStruct, 256 bytes for old wire 0x6d and 280 + * bytes for newer wire 0x7b. + * Reply: no data. + * Parser comparison matches the documented QueueID plus + * variant job-structure layout and delegates the structure + * copy to the queue backend helper. + */ uint32 q_id = GET_BE32(rdata); int result = nw_change_queue_job_entry(act_c->object_id, q_id, rdata+4, @@ -2434,6 +2487,21 @@ static void handle_fxx(int gelen, int func) #endif case 0x7d : { /* Read Queue Current Status, new */ + /* + * SDK 23/125 / wire 0x7d Read Queue Current Status. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * Reply: + * long QueueID (Hi-Lo) + * long QueueStatus + * long CurrentEntries + * long CurrentServers + * long ServerIDList[CurrentServers] (Hi-Lo) + * long ServerStationList[CurrentServers] + * Parser/reply comparison matches the documented new + * queue-status layout; scalar status/count/station fields use + * the existing 32-bit mars_nwe queue byte-order convention. + */ struct XDATA { uint8 id[4]; /* queue id */ uint8 status[4]; /* &1 no station allowed */ @@ -2473,6 +2541,19 @@ static void handle_fxx(int gelen, int func) } break; case 0x81 : { /* Get Queue Job List */ + /* + * SDK 23/129 / wire 0x81 Get Queue Job List. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * long QueueStartPosition + * Reply: + * long TotalQueueJobs + * long ReplyQueueJobNumbers + * long JobNumberList[ReplyQueueJobNumbers] + * Parser comparison matches the documented request header + * and delegates the paged long-list reply to the queue backend + * helper. + */ uint32 q_id = GET_BE32(rdata); uint32 offset = GET_BE32(rdata+4); #if 0 @@ -2491,6 +2572,18 @@ static void handle_fxx(int gelen, int func) case 0x72: /* finish servicing queue job (old)*/ case 0x83: { /* finish servicing queue job */ + /* + * SDK 23/114 / wire 0x72 Finish Servicing Queue Job (old) + * and SDK 23/131 / wire 0x83 Finish Servicing Queue Job. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * word JobNumber (Hi-Lo) for old wire 0x72 + * long JobNumber plus long ChargeInfo for newer wire 0x83 + * Reply: no data. + * Parser comparison: both variants currently consume a + * 16-bit JobNumber, and the newer ChargeInfo field is + * ignored. + */ uint32 q_id = GET_BE32(rdata); uint32 job_id = GET_BE16(rdata+4); #if 0 @@ -2506,6 +2599,19 @@ static void handle_fxx(int gelen, int func) case 0x73: /* abort servicing queue job (old) */ case 0x84: { /* abort servicing queue job */ + /* + * SDK 23/115 / wire 0x73 Abort Servicing Queue Job (old) + * and SDK 23/132 / wire 0x84 Abort Servicing Queue Job. + * Request payload after SubFunctionCode: + * long QueueID (Hi-Lo) + * word JobNumber (Hi-Lo) for old wire 0x73 + * long JobNumber for newer wire 0x84 + * Reply: no data for NCP 23; DOS-shell INT 21h wrappers + * expose a two-byte zero reply length. + * Parser/reply comparison: both variants currently consume + * a 16-bit JobNumber, and the success path emits a two-byte + * zero reply for compatibility with older clients. + */ uint32 q_id = GET_BE32(rdata); uint32 job_id = GET_BE16(rdata+4); int result = nw_finish_abort_queue_job(1,