forked from KolibriOS/kolibrios
Updates and bugfixes for FTPd (net branch)
git-svn-id: svn://kolibrios.org@2598 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
03998632b5
commit
5dd08c56bf
File diff suppressed because it is too large
Load Diff
@ -8,10 +8,11 @@
|
|||||||
|
|
||||||
BUFFERSIZE = 8192
|
BUFFERSIZE = 8192
|
||||||
|
|
||||||
STATE_DISCONNECTED = 0
|
; using multiple's of 4
|
||||||
STATE_CONNECTED = 1
|
STATE_CONNECTED = 4*0
|
||||||
STATE_LOGIN = 2
|
STATE_LOGIN = 4*1
|
||||||
STATE_ACTIVE = 3
|
STATE_LOGIN_FAIL = 4*2 ; When an invalid username was given
|
||||||
|
STATE_ACTIVE = 4*3
|
||||||
|
|
||||||
TYPE_UNDEF = 0
|
TYPE_UNDEF = 0
|
||||||
|
|
||||||
@ -25,11 +26,19 @@ TYPE_ASA = 00000011b
|
|||||||
TYPE_IMAGE = 01000000b ; binary data
|
TYPE_IMAGE = 01000000b ; binary data
|
||||||
TYPE_LOCAL = 10000000b ; bits per byte must be specified
|
TYPE_LOCAL = 10000000b ; bits per byte must be specified
|
||||||
; lower 4 bits will hold this value
|
; lower 4 bits will hold this value
|
||||||
|
|
||||||
MODE_NOTREADY = 0
|
MODE_NOTREADY = 0
|
||||||
MODE_ACTIVE = 1
|
MODE_ACTIVE = 1
|
||||||
MODE_PASSIVE_WAIT = 2
|
MODE_PASSIVE_WAIT = 2
|
||||||
MODE_PASSIVE_OK = 3
|
MODE_PASSIVE_OK = 3
|
||||||
|
MODE_PASSIVE_FAILED = 4
|
||||||
|
|
||||||
|
PERMISSION_EXEC = 1b ; LIST
|
||||||
|
PERMISSION_READ = 10b
|
||||||
|
PERMISSION_WRITE = 100b
|
||||||
|
PERMISSION_DELETE = 1000b
|
||||||
|
PERMISSION_CD = 10000b ; Change Directory
|
||||||
|
|
||||||
|
ABORT = 1 shl 31
|
||||||
|
|
||||||
format binary as ""
|
format binary as ""
|
||||||
|
|
||||||
@ -62,16 +71,30 @@ start:
|
|||||||
|
|
||||||
mcall 68, 11 ; init heap
|
mcall 68, 11 ; init heap
|
||||||
|
|
||||||
; find path to main settings file
|
; find path to main settings file (ftpd.ini)
|
||||||
mov edi, path ; Calculate the length of zero-terminated string
|
mov edi, path ; Calculate the length of zero-terminated string
|
||||||
xor al, al
|
xor al, al
|
||||||
mov ecx, 1024
|
mov ecx, 1024
|
||||||
repne scasb
|
repne scasb
|
||||||
dec edi
|
dec edi
|
||||||
mov esi, filename ; append it with '.ini'
|
mov esi, str_ini ; append it with '.ini', 0
|
||||||
movsd
|
movsd
|
||||||
movsb
|
movsb
|
||||||
|
|
||||||
|
; now create the second path (users.ini)
|
||||||
|
std
|
||||||
|
mov al, '/'
|
||||||
|
repne scasb
|
||||||
|
lea ecx, [edi - path + 2]
|
||||||
|
cld
|
||||||
|
mov esi, path
|
||||||
|
mov edi, path2
|
||||||
|
rep movsb
|
||||||
|
mov esi, str_users
|
||||||
|
movsd
|
||||||
|
movsd
|
||||||
|
movsw
|
||||||
|
|
||||||
; initialize console
|
; initialize console
|
||||||
push 1
|
push 1
|
||||||
call [con_start]
|
call [con_start]
|
||||||
@ -85,6 +108,11 @@ start:
|
|||||||
|
|
||||||
mcall 40, 1 shl 7 ; we only want network events
|
mcall 40, 1 shl 7 ; we only want network events
|
||||||
|
|
||||||
|
invoke ini.get_str, path, str_ftpd, str_ip, ini_buf, 16, 0
|
||||||
|
mov esi, ini_buf
|
||||||
|
call ip_to_dword
|
||||||
|
mov [serverip], ebx
|
||||||
|
|
||||||
invoke ini.get_int, path, str_ftpd, str_port, 21
|
invoke ini.get_int, path, str_ftpd, str_port, 21
|
||||||
mov [sockaddr1.port], ax
|
mov [sockaddr1.port], ax
|
||||||
|
|
||||||
@ -140,6 +168,7 @@ threadstart:
|
|||||||
|
|
||||||
lea esp, [eax + thread_data.stack] ; init stack
|
lea esp, [eax + thread_data.stack] ; init stack
|
||||||
push eax ; save pointer to thread_data on stack
|
push eax ; save pointer to thread_data on stack
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
mcall 40, 1 shl 7 ; we only want network events for this thread
|
mcall 40, 1 shl 7 ; we only want network events for this thread
|
||||||
|
|
||||||
@ -153,55 +182,75 @@ threadstart:
|
|||||||
mcall accept, [socketnum], sockaddr1, sockaddr1.length ; time to accept the awaiting connection..
|
mcall accept, [socketnum], sockaddr1, sockaddr1.length ; time to accept the awaiting connection..
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je thread_exit
|
je thread_exit
|
||||||
mov edx, [esp] ; pointer to thread_data
|
mov edx, [ebp] ; pointer to thread_data
|
||||||
mov [edx + thread_data.socketnum], eax
|
mov [edx + thread_data.socketnum], eax
|
||||||
|
|
||||||
mcall send, [edx + thread_data.socketnum], str220, str220.length, 0 ; send welcome string to the FTP client
|
mov [edx + thread_data.state], STATE_CONNECTED
|
||||||
|
mov [edx + thread_data.permissions], 0
|
||||||
|
mov [edx + thread_data.mode], MODE_NOTREADY
|
||||||
|
lea eax, [edx + thread_data.buffer]
|
||||||
|
mov [edx + thread_data.buffer_ptr], eax
|
||||||
|
|
||||||
|
sendFTP "220 Welcome to KolibriOS FTP daemon"
|
||||||
|
|
||||||
threadloop:
|
threadloop:
|
||||||
mcall 10
|
mcall 10
|
||||||
|
|
||||||
mov edx, [esp] ; pointer to thread_data
|
mov edx, [ebp] ; pointer to thread_data
|
||||||
|
|
||||||
cmp [edx + thread_data.mode], MODE_PASSIVE_WAIT
|
cmp [edx + thread_data.mode], MODE_PASSIVE_WAIT
|
||||||
jne @f
|
jne .not_passive
|
||||||
mov ecx, [edx + thread_data.passivesocknum]
|
mov ecx, [edx + thread_data.passivesocknum]
|
||||||
lea edx, [edx + thread_data.datasock]
|
lea edx, [edx + thread_data.datasock]
|
||||||
mov esi, sizeof.thread_data.datasock
|
mov esi, sizeof.thread_data.datasock
|
||||||
mcall accept
|
mcall accept
|
||||||
mov edx, [esp] ; pointer to thread_data
|
mov edx, [ebp] ; pointer to thread_data
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je @f
|
je .not_passive
|
||||||
mov [edx + thread_data.datasocketnum], eax
|
mov [edx + thread_data.datasocketnum], eax
|
||||||
mov [edx + thread_data.mode], MODE_PASSIVE_OK
|
mov [edx + thread_data.mode], MODE_PASSIVE_FAILED
|
||||||
|
|
||||||
push str_datasock
|
push str_datasock
|
||||||
call [con_write_asciiz] ; print on the console that the datasock is now ready
|
call [con_write_asciiz] ; print on the console that the datasock is now ready
|
||||||
@@:
|
.not_passive:
|
||||||
|
|
||||||
mov ecx, [edx + thread_data.socketnum]
|
mov ecx, [edx + thread_data.socketnum]
|
||||||
lea edx, [edx + thread_data.buffer]
|
mov edx, [edx + thread_data.buffer_ptr]
|
||||||
mov esi, sizeof.thread_data.buffer
|
mov esi, sizeof.thread_data.buffer ;;; FIXME
|
||||||
mcall recv
|
mcall recv
|
||||||
cmp eax, -1 ; error?
|
inc eax ; error? (-1)
|
||||||
je threadloop
|
jz threadloop
|
||||||
or eax, eax ; 0 bytes read?
|
dec eax ; 0 bytes read?
|
||||||
jz threadloop
|
jz threadloop
|
||||||
push eax ; save number of bytes read on stack
|
|
||||||
|
|
||||||
mov edx, [esp+4] ; pointer to thread_data
|
mov edx, [ebp] ; pointer to thread_data
|
||||||
mov byte [edx + thread_data.buffer + eax], 0 ; append received data with a 0 byte
|
mov edi, [edx + thread_data.buffer_ptr]
|
||||||
|
add [edx + thread_data.buffer_ptr], eax
|
||||||
|
|
||||||
|
; Check if we received a newline character, if not, wait for more data
|
||||||
|
mov ecx, eax
|
||||||
|
mov al, 13
|
||||||
|
repne scasb
|
||||||
|
jne threadloop
|
||||||
|
|
||||||
|
; We got a command!
|
||||||
|
lea eax, [edx + thread_data.buffer]
|
||||||
|
mov ecx, [edx + thread_data.buffer_ptr]
|
||||||
|
sub ecx, eax
|
||||||
|
push ecx ; push full data size on stack
|
||||||
|
mov [edx + thread_data.buffer_ptr], eax ; reset buffer ptr
|
||||||
|
|
||||||
|
push eax;;;;
|
||||||
pushd 0x02 ; print received data to console (in green color)
|
pushd 0x02 ; print received data to console (in green color)
|
||||||
call [con_set_flags]
|
call [con_set_flags]
|
||||||
push str_newline
|
push str_newline
|
||||||
call [con_write_asciiz]
|
call [con_write_asciiz]
|
||||||
lea eax, [edx + thread_data.buffer]
|
;;;; push eax
|
||||||
push eax
|
|
||||||
call [con_write_asciiz]
|
call [con_write_asciiz]
|
||||||
pushd 0x07
|
pushd 0x07
|
||||||
call [con_set_flags]
|
call [con_set_flags]
|
||||||
|
|
||||||
|
mov edx, [ebp]
|
||||||
pop ecx ; number of bytes read
|
pop ecx ; number of bytes read
|
||||||
lea esi, [edx + thread_data.buffer]
|
lea esi, [edx + thread_data.buffer]
|
||||||
call parse_cmd
|
call parse_cmd
|
||||||
@ -268,6 +317,8 @@ str_datasock db 'Passive data socket connected!',10,0
|
|||||||
str_notfound db 'ERROR: file not found',10,0
|
str_notfound db 'ERROR: file not found',10,0
|
||||||
str_sockerr db 'ERROR: socket error',10,0
|
str_sockerr db 'ERROR: socket error',10,0
|
||||||
|
|
||||||
|
str_login_invalid db 'Login invalid',10,0
|
||||||
|
|
||||||
str_newline db 10, 0
|
str_newline db 10, 0
|
||||||
str_mask db '*', 0
|
str_mask db '*', 0
|
||||||
|
|
||||||
@ -284,10 +335,16 @@ months dd 'Jan '
|
|||||||
dd 'Nov '
|
dd 'Nov '
|
||||||
dd 'Dec '
|
dd 'Dec '
|
||||||
|
|
||||||
filename db '.ini', 0
|
str_users db 'users'
|
||||||
|
str_ini db '.ini', 0
|
||||||
str_port db 'port', 0
|
str_port db 'port', 0
|
||||||
str_ftpd db 'ftpd', 0
|
str_ftpd db 'ftpd', 0
|
||||||
str_conn db 'conn', 0
|
str_conn db 'conn', 0
|
||||||
|
str_ip db 'ip', 0
|
||||||
|
str_pass db 'pass', 0
|
||||||
|
str_home db 'home', 0
|
||||||
|
str_mode db 'mode', 0
|
||||||
|
|
||||||
|
|
||||||
sockaddr1:
|
sockaddr1:
|
||||||
dw AF_INET4
|
dw AF_INET4
|
||||||
@ -338,7 +395,11 @@ i_end:
|
|||||||
|
|
||||||
socketnum dd ?
|
socketnum dd ?
|
||||||
path rb 1024
|
path rb 1024
|
||||||
|
path2 rb 1024
|
||||||
params rb 1024
|
params rb 1024
|
||||||
|
serverip dd ?
|
||||||
|
|
||||||
|
ini_buf rb 3*4+3+1
|
||||||
|
|
||||||
mem:
|
mem:
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
[ftpd]
|
[ftpd]
|
||||||
port=21
|
port=21
|
||||||
conn=10
|
conn=10
|
||||||
|
ip=127.0.0.1
|
@ -1,14 +1,19 @@
|
|||||||
|
; Access modes
|
||||||
|
;
|
||||||
|
; List = 1
|
||||||
|
; Read = 2
|
||||||
|
; Write = 4
|
||||||
|
; Delete = 8
|
||||||
|
; Change directory = 16
|
||||||
|
|
||||||
|
|
||||||
[anonymous]
|
[anonymous]
|
||||||
pass= ; leavy empty for none
|
pass= ; leavy empty for none
|
||||||
home=/rd/1/
|
home=/rd/1/
|
||||||
mode=5
|
mode=3
|
||||||
|
|
||||||
|
[test]
|
||||||
|
pass=1234
|
||||||
|
home=/rd/1/
|
||||||
|
mode=31
|
||||||
|
|
||||||
; Access modes
|
|
||||||
; 7 full
|
|
||||||
; 6 read and write
|
|
||||||
; 5 read and execute
|
|
||||||
; 4 read only
|
|
||||||
; 3 write and execute
|
|
||||||
; 2 write only
|
|
||||||
; 1 execute only (open folder)
|
|
||||||
; 0 none
|
|
Loading…
Reference in New Issue
Block a user