diff --git a/programs/network/ftpd/commands.inc b/programs/network/ftpd/commands.inc index 3b7d04a89..13f51b865 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,35 @@ open_datasock: ret +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 + 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: + mov edx, 4 ; Unknown filesystem 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 ;------------------------------------------------ ; "ABOR" @@ -1248,6 +1277,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..07ed7ba3d 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,18 @@ 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 +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