From ef5b97d0caf289a8647a00d6ed7cd6dba3ed0ff4 Mon Sep 17 00:00:00 2001 From: Igor Shutrov Date: Fri, 20 Feb 2026 22:23:22 +0500 Subject: [PATCH 1/4] ftpd: Add mkd command --- programs/network/ftpd/commands.inc | 114 ++++++++++++++++++++++++++++- programs/network/ftpd/ftpd.asm | 13 +++- 2 files changed, 125 insertions(+), 2 deletions(-) diff --git a/programs/network/ftpd/commands.inc b/programs/network/ftpd/commands.inc index 3b7d04a89..d78e6effa 100644 --- a/programs/network/ftpd/commands.inc +++ b/programs/network/ftpd/commands.inc @@ -89,7 +89,7 @@ commands: ; all commands must be in uppercase ; dd 'HELP', login_first, login_first, login_first, cmd_HELP dd 'LIST', login_first, login_first, login_first, cmdLIST ; dd 'MDTM', login_first, login_first, login_first, cmd_MDTM -; dd 'MKD', login_first, login_first, login_first, cmd_MKD + dd 'MKD', login_first, login_first, login_first, cmd_MKD ; dd 'MODE', login_first, login_first, login_first, cmd_MODE ; dd 'NLST', login_first, login_first, login_first, cmdNLST dd 'NOOP', login_first, login_first, login_first, cmdNOOP @@ -333,6 +333,55 @@ open_datasock: ret +align 4 +console_fs_error: + cmp eax, 0x2 + jne .fs_error_3 + invoke con_write_asciiz, str_fs_error2 + ret + .fs_error_3: + cmp eax, 0x3 + jne .fs_error_5 + invoke con_write_asciiz, str_fs_error3 + ret + .fs_error_5: + cmp eax, 0x5 + jne .fs_error_6 + invoke con_write_asciiz, str_fs_error5 + ret + .fs_error_6: + cmp eax, 0x6 + jne .fs_error_7 + invoke con_write_asciiz, str_fs_error6 + ret + .fs_error_7: + cmp eax, 0x7 + jne .fs_error_8 + invoke con_write_asciiz, str_fs_error7 + ret + .fs_error_8: + cmp eax, 0x8 + jne .fs_error_9 + invoke con_write_asciiz, str_fs_error8 + ret + .fs_error_9: + cmp eax, 0x9 + jne .fs_error_10 + invoke con_write_asciiz, str_fs_error9 + ret + .fs_error_10: + cmp eax, 0xA + jne .fs_error_11 + invoke con_write_asciiz, str_fs_error10 + ret + .fs_error_11: + cmp eax, 0xB + jne .fs_error_12 + invoke con_write_asciiz, str_fs_error11 + ret + .fs_error_12: + invoke con_write_asciiz, str_fs_error12 + ret ;------------------------------------------------ ; "ABOR" @@ -1248,6 +1297,69 @@ cmdTYPE: ret ;------------------------------------------------ +; "MKD" +; +; Create directory +; +;------------------------------------------------ +align 4 +cmd_MKD: + + test [ebp + thread_data.permissions], PERMISSION_WRITE + jz permission_denied + + lea esi, [esi + 4] + lea edi, [ebp + thread_data.buffer] + mov ecx, 1024 + + .loop1: + lodsb + cmp al, 0x20 + jb .done + stosb + loop .loop1 + .done: + mov byte [edi], 0x00 + + call create_path + dec edi + + lea esi, [ebp + thread_data.buffer] + .loop2: + lodsb + cmp al, 0x20 + jb .new_dir_ready + stosb + loop .loop2 + .new_dir_ready: + mov byte [edi], 0x00 + + lea ebx, [ebp + thread_data.fpath] + invoke con_write_asciiz, ebx + invoke con_write_asciiz, str_newline + ; called fs function + push ebx + dec esp + mov byte[esp], 0 + push dword 0 + push dword 0 + push dword 0 + push dword 0 + push dword SSF_CREATE_FOLDER + mov ebx, esp + mcall SF_FILE + add esp, 6*4 + 1 + + test eax, eax + jnz .error + + sendFTP "257 Directory created" + ret + .error: + call console_fs_error + sendFTP "550 Create directory operation failed." + ret +;------------------------------------------------ ; "USER" ; ; Login to the server, step one of two. ;;; TODO: prevent buffer overflow! diff --git a/programs/network/ftpd/ftpd.asm b/programs/network/ftpd/ftpd.asm index f00cb4f67..998c6634d 100644 --- a/programs/network/ftpd/ftpd.asm +++ b/programs/network/ftpd/ftpd.asm @@ -63,13 +63,13 @@ use32 dd params ; parameters dd path ; path +include '../../KOSfuncs.inc' include '../../macros.inc' purge mov,add,sub include '../../proc32.inc' include '../../dll.inc' include '../../struct.inc' include '../../develop/libraries/libs-dev/libio/libio.inc' - include '../../network.inc' macro sendFTP str { @@ -363,6 +363,17 @@ str_alopen db 'Data connection already open.',10,0 str_notfound db 'ERROR: file not found.',10,0 str_sockerr db 'ERROR: socket error.',10,0 +str_fs_error2 db 'Function not supported for this filesystem',10,0 +str_fs_error3 db 'Unknown filesystem',10,0 +str_fs_error5 db 'File not found',10,0 +str_fs_error6 db 'End of file',10,0 +str_fs_error7 db 'Pointer outside application memory',10,0 +str_fs_error8 db 'Disk full',10,0 +str_fs_error9 db 'Filesystem error',10,0 +str_fs_error10 db 'Access denied',10,0 +str_fs_error11 db 'Device error',10,0 +str_fs_error12 db 'Filesystem out of memory',10,0 + str_newline db 10, 0 str_mask db '*', 0 str_infinity db 0xff, 0xff, 0xff, 0xff, 0 -- 2.49.1 From c6d82894a031631525f420bab458691af8452980 Mon Sep 17 00:00:00 2001 From: Igor Shutrov Date: Tue, 24 Feb 2026 08:51:38 +0500 Subject: [PATCH 2/4] ftpd: Fix indents --- programs/network/ftpd/commands.inc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/programs/network/ftpd/commands.inc b/programs/network/ftpd/commands.inc index d78e6effa..4ab6abbd6 100644 --- a/programs/network/ftpd/commands.inc +++ b/programs/network/ftpd/commands.inc @@ -1319,10 +1319,10 @@ cmd_MKD: stosb loop .loop1 .done: - mov byte [edi], 0x00 + mov byte [edi], 0x00 call create_path - dec edi + dec edi lea esi, [ebp + thread_data.buffer] .loop2: @@ -1332,7 +1332,7 @@ cmd_MKD: stosb loop .loop2 .new_dir_ready: - mov byte [edi], 0x00 + mov byte [edi], 0x00 lea ebx, [ebp + thread_data.fpath] invoke con_write_asciiz, ebx @@ -1347,16 +1347,16 @@ cmd_MKD: push dword 0 push dword SSF_CREATE_FOLDER mov ebx, esp - mcall SF_FILE + mcall SF_FILE add esp, 6*4 + 1 - test eax, eax - jnz .error + test eax, eax + jnz .error sendFTP "257 Directory created" ret .error: - call console_fs_error + call console_fs_error sendFTP "550 Create directory operation failed." ret ;------------------------------------------------ -- 2.49.1 From 2893749afb3b553e0e213d84f1f371948c578b1c Mon Sep 17 00:00:00 2001 From: Igor Shutrov Date: Tue, 24 Feb 2026 08:51:11 +0500 Subject: [PATCH 3/4] ftpd: Add function to access filesystem errors by index --- programs/network/ftpd/commands.inc | 73 ++++++++++++------------------ programs/network/ftpd/ftpd.asm | 1 + 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/programs/network/ftpd/commands.inc b/programs/network/ftpd/commands.inc index 4ab6abbd6..a038f619d 100644 --- a/programs/network/ftpd/commands.inc +++ b/programs/network/ftpd/commands.inc @@ -334,53 +334,36 @@ open_datasock: ret align 4 +fs_err_table: + dd str_fs_error2 ; 2 + dd str_fs_error3 ; 3 + dd str_fs_error5 ; 5 + dd str_fs_error6 ; 6 + dd str_fs_error7 ; 7 + dd str_fs_error8 ; 8 + dd str_fs_error9 ; 9 + dd str_fs_error10 ; 10 + dd str_fs_error11 ; 11 + dd str_fs_error12 ; 12 + console_fs_error: - cmp eax, 0x2 - jne .fs_error_3 - invoke con_write_asciiz, str_fs_error2 + cmp eax, 2 + jb .out_of_range + cmp eax, 12 + ja .out_of_range + cmp eax, 4 + ja .after4 + sub eax, 2 + jmp .index_ok +.after4: + sub eax, 3 +.index_ok: + mov edx, [fs_err_table + eax*4] + invoke con_write_asciiz, edx ret - .fs_error_3: - cmp eax, 0x3 - jne .fs_error_5 - invoke con_write_asciiz, str_fs_error3 - ret - .fs_error_5: - cmp eax, 0x5 - jne .fs_error_6 - invoke con_write_asciiz, str_fs_error5 - ret - .fs_error_6: - cmp eax, 0x6 - jne .fs_error_7 - invoke con_write_asciiz, str_fs_error6 - ret - .fs_error_7: - cmp eax, 0x7 - jne .fs_error_8 - invoke con_write_asciiz, str_fs_error7 - ret - .fs_error_8: - cmp eax, 0x8 - jne .fs_error_9 - invoke con_write_asciiz, str_fs_error8 - ret - .fs_error_9: - cmp eax, 0x9 - jne .fs_error_10 - invoke con_write_asciiz, str_fs_error9 - ret - .fs_error_10: - cmp eax, 0xA - jne .fs_error_11 - invoke con_write_asciiz, str_fs_error10 - ret - .fs_error_11: - cmp eax, 0xB - jne .fs_error_12 - invoke con_write_asciiz, str_fs_error11 - ret - .fs_error_12: - invoke con_write_asciiz, str_fs_error12 + +.out_of_range: + invoke con_write_asciiz, str_fs_error ret ;------------------------------------------------ diff --git a/programs/network/ftpd/ftpd.asm b/programs/network/ftpd/ftpd.asm index 998c6634d..07ed7ba3d 100644 --- a/programs/network/ftpd/ftpd.asm +++ b/programs/network/ftpd/ftpd.asm @@ -363,6 +363,7 @@ str_alopen db 'Data connection already open.',10,0 str_notfound db 'ERROR: file not found.',10,0 str_sockerr db 'ERROR: socket error.',10,0 +str_fs_error db 'Unknown filesystem error',10,0 str_fs_error2 db 'Function not supported for this filesystem',10,0 str_fs_error3 db 'Unknown filesystem',10,0 str_fs_error5 db 'File not found',10,0 -- 2.49.1 From e72e908c1a6a03cb5b96c78ab24fcf853fa5b21a Mon Sep 17 00:00:00 2001 From: Igor Shutrov Date: Tue, 3 Mar 2026 23:43:40 +0500 Subject: [PATCH 4/4] ftpd: Simplify console_fs_error logic --- programs/network/ftpd/commands.inc | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/programs/network/ftpd/commands.inc b/programs/network/ftpd/commands.inc index a038f619d..13f51b865 100644 --- a/programs/network/ftpd/commands.inc +++ b/programs/network/ftpd/commands.inc @@ -337,6 +337,7 @@ align 4 fs_err_table: dd str_fs_error2 ; 2 dd str_fs_error3 ; 3 + dd str_fs_error ; 4 dd str_fs_error5 ; 5 dd str_fs_error6 ; 6 dd str_fs_error7 ; 7 @@ -347,23 +348,19 @@ fs_err_table: dd str_fs_error12 ; 12 console_fs_error: - cmp eax, 2 - jb .out_of_range - cmp eax, 12 - ja .out_of_range - cmp eax, 4 - ja .after4 - sub eax, 2 - jmp .index_ok -.after4: - sub eax, 3 -.index_ok: - mov edx, [fs_err_table + eax*4] - invoke con_write_asciiz, edx - ret + mov edx, 4 ; Unknown filesystem error -.out_of_range: - invoke con_write_asciiz, str_fs_error + cmp eax, 2 + jb .print_err + cmp eax, 12 + ja .print_err + + mov edx, eax + +.print_err: + sub edx, 2 + mov edx, [fs_err_table + edx*4] + invoke con_write_asciiz, edx ret ;------------------------------------------------ -- 2.49.1