diff --git a/kernel/branches/net/applications/ftpd/commands.inc b/kernel/branches/net/applications/ftpd/commands.inc index b4a1193ab4..73308b36a0 100644 --- a/kernel/branches/net/applications/ftpd/commands.inc +++ b/kernel/branches/net/applications/ftpd/commands.inc @@ -81,10 +81,10 @@ commands: ; all commands must be in uppercase dd cmdPASS db 'PASV' dd cmdPASV - db 'PWD', 0 - dd cmdPWD db 'PORT' dd cmdPORT + db 'PWD', 0 + dd cmdPWD db 'QUIT' dd cmdQUIT db 'RETR' @@ -97,8 +97,6 @@ commands: ; all commands must be in uppercase dd cmdTYPE db 'USER' dd cmdUSER - db 'XPWD' - dd cmdPWD db 0 ; end marker @@ -112,24 +110,34 @@ cmdABOR: align 4 cmdCDUP: - cmp byte [edx + thread_data.work_dir+1], 0 + cmp byte [edx + thread_data.work_dir+1], 0 ; are we in "/" ? je .done mov ecx, 1024 xor al, al - lea edi, [edx + thread_data.work_dir+1024] + lea edi, [edx + thread_data.work_dir] repne scasb std dec edi + dec edi + dec edi mov al,'/' - scasb + repne scasb cld - mov byte[edi], 0 + mov byte[edi+1], 0 .done: - mcall send, [edx + thread_data.socketnum], str250, str250.length, 0 ; command successful +; Print the new working dir on the console + lea eax, [edx + thread_data.work_dir] + push eax + call [con_write_asciiz] + push str_newline + call [con_write_asciiz] + + mcall send, [edx + thread_data.socketnum], str250, str250.length, 0 ; command successful ret + align 4 cmdCWD: ; Change Working Directory @@ -174,6 +182,13 @@ cmdCWD: ; Change Working Directory @@: mov byte [edi], 0 +; Print the new working dir on the console + lea eax, [edx + thread_data.work_dir] + push eax + call [con_write_asciiz] + push str_newline + call [con_write_asciiz] + mcall send, [edx + thread_data.socketnum], str250, str250.length, 0 ret @@ -198,6 +213,7 @@ cmdDELE: ret + align 4 cmdLIST: @@ -344,11 +360,7 @@ cmdLIST: ; close the data socket.. mov edx, [esp+4] ; thread_data pointer mcall close, [edx + thread_data.datasocketnum] - - cmp [edx + thread_data.mode], MODE_PASSIVE_OK - jne @f mov [edx + thread_data.mode], MODE_NOTREADY - @@: ; And send "transfer ok" on the base connection mcall send, [edx + thread_data.socketnum], str226, str226.length, 0 @@ -448,6 +460,7 @@ cmdPASV: ret + align 4 cmdPWD: ; Print Working Directory @@ -471,14 +484,20 @@ cmdPWD: ; Print Working Directory sub esi, edx mov ecx, [edx + thread_data.socketnum] lea edx, [edx + thread_data.buffer] - mcall send, , , , 0 + xor edi, edi + mcall send -; push work_dir -; push str_pwd -; call [con_printf] + mov edx, [esp+4] +; Print the new working dir on the console + lea eax, [edx + thread_data.work_dir] + push eax + call [con_write_asciiz] + push str_newline + call [con_write_asciiz] ret + align 4 cmdPORT: @@ -620,11 +639,7 @@ cmdRETR: je .read_more mcall close, [edx + thread_data.datasocketnum] - - cmp [edx + thread_data.mode], MODE_PASSIVE_OK - jne @f - mov [edx + thread_data.mode], MODE_PASSIVE_WAIT - @@: + mov [edx + thread_data.mode], MODE_NOTREADY mcall send, [edx + thread_data.socketnum], str226, str226.length, 0 ; transfer ok @@ -684,7 +699,6 @@ cmdTYPE: mov [edx + thread_data.type], TYPE_EBDIC .subtype: - cmp ecx, 8 jb .non_print @@ -733,21 +747,21 @@ cmdTYPE: ret + align 4 cmdUSER: ; TODO: check user and set home directory (and permissions) - mcall send, [edx + thread_data.socketnum], str331, str331.length, 0 - mov edx, [esp+4] ; thread_data pointer mov [edx + thread_data.state], STATE_LOGIN - - mov byte [edx + thread_data.work_dir], "/" - mov byte [edx + thread_data.work_dir+1], 0 + mov word [edx + thread_data.home_dir], "/" ; "/", 0 + mov word [edx + thread_data.work_dir], "/" ; "/", 0 push str_logged_in call [con_write_asciiz] + mcall send, [edx + thread_data.socketnum], str331, str331.length, 0 ; Now send me the password! + ret diff --git a/kernel/branches/net/applications/ftpd/ftpd.asm b/kernel/branches/net/applications/ftpd/ftpd.asm index e7dd8fe7f7..22b6ede020 100644 --- a/kernel/branches/net/applications/ftpd/ftpd.asm +++ b/kernel/branches/net/applications/ftpd/ftpd.asm @@ -64,7 +64,7 @@ start: ; find path to main settings file mov edi, path ; Calculate the length of zero-terminated string - xor al , al + xor al, al mov ecx, 1024 repne scasb dec edi @@ -101,9 +101,9 @@ start: push str2 call [con_write_asciiz] -;; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes, -;; cmp eax, -1 -;; je opt_err +; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes, +; cmp eax, -1 +; je opt_err mcall bind, [socketnum], sockaddr1, sockaddr1.length cmp eax, -1 @@ -132,6 +132,7 @@ mainloop: ; NOTE: upon initialisation of the thread, stack will not be available! jmp mainloop + diff16 "threadstart", 0, $ threadstart: mcall 68, 12, sizeof.thread_data ; allocate the thread data struct cmp eax, -1 @@ -142,8 +143,12 @@ threadstart: mcall 40, 1 shl 7 ; we only want network events for this thread + pushd 0x03 + call [con_set_flags] push str8 call [con_write_asciiz] ; print on the console that we have created the new thread successfully + pushd 0x07 + call [con_set_flags] mcall accept, [socketnum], sockaddr1, sockaddr1.length ; time to accept the awaiting connection.. cmp eax, -1 @@ -187,8 +192,10 @@ threadloop: mov edx, [esp+4] ; pointer to thread_data mov byte [edx + thread_data.buffer + eax], 0 ; append received data with a 0 byte - pushd 0x0a ; print received data to console (in green color) + pushd 0x02 ; print received data to console (in green color) call [con_set_flags] + push str_newline + call [con_write_asciiz] lea eax, [edx + thread_data.buffer] push eax call [con_write_asciiz] @@ -244,22 +251,22 @@ thread_exit: title db 'KolibriOS FTP daemon 0.1', 0 str1 db 'Starting FTP daemon on port %u', 0 str2 db '.', 0 -str2b db ' OK!',10,10,0 -str3 db 'Listen error',10,10,0 -str4 db 'Bind error',10,10,0 +str2b db ' OK!',10,0 +str3 db 'Listen error',10,0 +str4 db 'Bind error',10,0 ;str5 db 'Setsockopt error.',10,10,0 -str6 db 'Could not open socket',10,10,0 +str6 db 'Could not open socket',10,0 str7 db 'Got data!',10,10,0 -str8 db 10,'New thread created!',10,10,0 -str_bye db 10,'Closing thread!',10,10,0 +str8 db 10,'New thread created!',10,0 +str_bye db 10,'Closing thread!',10,0 -str_logged_in db 'Login ok',10,10,0 -str_pass_ok db 'Password ok - Logged in',10,10,0 +str_logged_in db 'Login ok',10,0 +str_pass_ok db 'Password ok - Logged in',10,0 str_pwd db 'Current directory is "%s"\n',0 -str_err2 db 'ERROR: cannot open directory',10,10,0 -str_datasock db 'Passive data socket connected!',10,10,0 -str_notfound db 'ERROR: file not found',10,10,0 -str_sockerr db 'ERROR: socket error',10,10,0 +str_err2 db 'ERROR: cannot open directory',10,0 +str_datasock db 'Passive data socket connected!',10,0 +str_notfound db 'ERROR: file not found',10,0 +str_sockerr db 'ERROR: socket error',10,0 str_newline db 10, 0 str_mask db '*', 0