docs: split old direct create file cases

This commit is contained in:
Mario Fetka
2026-06-02 19:32:38 +00:00
parent 27aae30e70
commit 5f8b3b11b2
3 changed files with 104 additions and 16 deletions

23
AI.md
View File

@@ -1067,4 +1067,25 @@ Latest endpoint audit checkpoint from patch 0249:
planned 4.x endpoint after the NCP Extension family, skipping 5.x-only NDS
unless explicitly brought into scope.
Next patch number should be `0251`.
## 2026-06-02 - Patch 0251 old direct create-file selector split 67/77
- Continued NDK-first after the NCP Extension checkpoint by returning to the
in-scope old direct file-I/O calls in `src/nwconn.c`. The NDK lists both
`0x2222/67` Create File and `0x2222/77` Create New File for NetWare
2.x/3.x/4.x, so they remain relevant even though the same pages also mention
5.x.
- Split the old grouped `case 0x43` / `case 0x4d` implementation into two
explicit case bodies. Each case now has its own adjacent `Request:` and
`Response:` notes:
- `67` / wire `0x43` Create File: replace-if-existing semantics when the
caller has sufficient create/delete rights.
- `77` / wire `0x4d` Create New File: no-replace semantics; fail if the
target already exists.
- Runtime behavior is intentionally unchanged. Both cases still use the
existing `nw_creat_open_file()` path and return the old six-byte file-handle
plus `NW_FILE_INFO` reply layout, but they no longer rely on a grouped case
label or a `function == 0x43` mode selector inside a shared block.
- Do not regroup these two direct create-file cases in a later cleanup; keep the
per-case Request/Response audit rule intact.
Next patch number should be `0252`.

19
TODO.md
View File

@@ -1717,3 +1717,22 @@ Follow-up:
- Continue NDK-first with the next documented NetWare 1.x/2.x/3.x endpoint or
planned 4.x endpoint after NCP Extension. Skip 5.x-only NDS endpoints unless
the project scope changes.
### Old direct create-file selector split 67/77
Current status:
- Patch `0251` audits the NDK-listed NetWare-2.x/3.x/4.x-relevant old direct
create-file calls in `src/nwconn.c`:
- `67` / wire `0x43` Create File
- `77` / wire `0x4d` Create New File
- The previous grouped `case 0x43` / `case 0x4d` implementation has been split
into two explicit case bodies, each with its own Request/Response notes.
- Runtime behavior is unchanged; both cases still call `nw_creat_open_file()`
and return the old file-handle plus `NW_FILE_INFO` response layout.
Follow-up:
- Continue NDK-first with the next documented NetWare 1.x/2.x/3.x endpoint or
planned 4.x endpoint that still has grouped or missing case-local
Request/Response audit notes. Skip 5.x-only endpoints.

View File

@@ -6817,20 +6817,16 @@ static int handle_ncp_serv(void)
}
break;
case 0x43 : /* 67 Create File / wire 0x43.
* Coverage: implemented by the shared 67/77 parser.
* Request: DirHandle, FileAttributes, PathLen, Path.
* Reply: six-byte old FileHandle slot, Reserved,
* NW_FILE_INFO. Current code writes zero extended handle
* bytes and a local four-byte handle.
* Mode: 67 uses create mode 1, overwrite if the file exists.
*/
case 0x4D : /* 77 Create New File / wire 0x4d.
* Coverage: implemented by the shared 67/77 parser.
* Request/reply: same old create/open layout as 67.
* Mode: 77 uses create mode 2, fail if the file exists.
*/
{
case 0x43 : { /* 67 Create File / wire 0x43.
* Coverage: implemented by the old direct create parser.
* Request: DirectoryHandle, FileAttributes,
* FileNameLen, FileName.
* Response: six-byte old FileHandle slot, Reserved,
* NW_FILE_INFO. Current code writes zero extended handle
* bytes and a local four-byte handle.
* Mode: Create File replaces an existing file when the
* caller has sufficient create/delete rights.
*/
struct INPUT {
uint8 header[7]; /* Requestheader */
uint8 dirhandle;
@@ -6852,7 +6848,59 @@ static int handle_ncp_serv(void)
(int)input->attribute,
/* 0, 0x2, mst: 26-Sep-99 */
0x13, /* pcz: 14-Nov-99 */
(function==0x43) ? 1 : 2,
1,
(int)(ncprequest->task));
if (fhandle > -1){
data_len = sizeof(struct XDATA);
U32_TO_32 (fhandle, xdata->fhandle);
xdata->ext_fhandle[0]=0;
xdata->ext_fhandle[1]=0;
xdata->reserved[0]=0;
xdata->reserved[1]=0;
#ifdef TEST_FNAME
input->data[input->len] = '\0';
if (strstr(input->data, TEST_FNAME)){
test_handle = fhandle;
do_druck++;
}
#endif
} else completition = (uint8) (-fhandle);
}
break;
case 0x4D : { /* 77 Create New File / wire 0x4d.
* Coverage: implemented by the old direct create parser.
* Request: DirectoryHandle, FileAttributes,
* FileNameLen, FileName.
* Response: six-byte old FileHandle slot, Reserved,
* NW_FILE_INFO. Current code writes zero extended handle
* bytes and a local four-byte handle.
* Mode: Create New File is the no-replace variant and
* must fail when the target already exists.
*/
struct INPUT {
uint8 header[7]; /* Requestheader */
uint8 dirhandle;
uint8 attribute; /* creat Attribute */
uint8 len;
uint8 data[1]; /* Name */
} *input = (struct INPUT *)ncprequest;
struct XDATA {
uint8 ext_fhandle[2];
uint8 fhandle[4]; /* Filehandle */
uint8 reserved[2]; /* reserved by NOVELL */
NW_FILE_INFO fileinfo;
} *xdata= (struct XDATA*)responsedata;
int fhandle=nw_creat_open_file(
(int)input->dirhandle,
input->data,
(int)input->len,
&(xdata->fileinfo),
(int)input->attribute,
/* 0, 0x2, mst: 26-Sep-99 */
0x13, /* pcz: 14-Nov-99 */
2,
(int)(ncprequest->task));
if (fhandle > -1){
data_len = sizeof(struct XDATA);