kolibrios/kernel/branches/net/applications/ftpd/ftpd.asm
hidnplayr a3b3514e59 Further development of the new FTP daemon (net branch)
git-svn-id: svn://kolibrios.org@2557 a494cfbc-eb01-0410-851d-a64ba20cac60
2012-04-03 20:28:26 +00:00

217 lines
4.9 KiB
NASM

;
; Kolibrios FTP Daemon
;
; hidnplayr@gmail.com
;
; GPLv2
;
BUFFERSIZE = 4096
STATE_DISCONNECTED = 0
STATE_CONNECTED = 1
STATE_LOGIN = 2
STATE_ACTIVE = 3
use32
db 'MENUET01' ; signature
dd 1 ; header version
dd start ; entry point
dd i_end ; initialized size
dd mem+0x1000 ; required memory
dd mem+0x1000 ; stack pointer
dd 0 ; parameters
dd path ; path
include '../macros.inc'
purge mov,add,sub
include '../proc32.inc'
include '../dll.inc'
include '../network.inc'
include 'commands.inc'
align 4
start:
; load libraries
stdcall dll.Load, @IMPORT
test eax, eax
jnz exit
; find path to main settings file
mov edi, path ; Calculate the length of zero-terminated string
xor al , al
mov ecx, 1024
repne scasb
dec edi
mov esi, filename
movsd
movsb
; initialize console
push 1
call [con_start]
push title
push 25
push 80
push 25
push 80
call [con_init]
mcall 40, 1 shl 7 ; we only want network events
push str1
call [con_write_asciiz]
mcall socket, AF_INET4, SOCK_STREAM, 0
cmp eax, -1
je sock_err
mov [socketnum], eax
;; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes,
;; cmp eax, -1
;; je opt_err
invoke ini.get_int, path, str_ftpd, str_port, 21
mov [sockaddr1.port], ax
mcall bind, [socketnum], sockaddr1, sockaddr1.length
cmp eax, -1
je bind_err
invoke ini.get_int, path, str_ftpd, str_conn, 1 ; Backlog (max connections)
mov edx, eax
mcall listen, [socketnum]
cmp eax, -1
je listen_err
push str2
call [con_write_asciiz]
mcall 10
mcall accept, [socketnum], sockaddr1, sockaddr1.length
cmp eax, -1
je acpt_err
mov [socketnum2], eax
mcall send, [socketnum2], str220, str220.length, 0 ; send welcome string
.loop:
mcall 10
mcall recv, [socketnum2], buffer, buffer.length
cmp eax, -1
je .loop
push eax
push buffer
call [con_write_asciiz]
pop ecx
mov esi, buffer
call parse_cmd
jmp .loop
acpt_err:
push str8
call [con_write_asciiz]
jmp done
listen_err:
push str3
call [con_write_asciiz]
jmp done
bind_err:
push str4
call [con_write_asciiz]
jmp done
sock_err:
push str6
call [con_write_asciiz]
jmp done
done:
call [con_getch2]
push 1
call [con_exit]
exit:
mcall -1
; data
title db 'KolibriOS FTP daemon 0.1',0
str1 db 'Opening socket',10, 0
str2 db 'Listening for incoming connections...',10,0
str3 db 'Listen error',10,10,0
str4 db 'Bind error',10,10,0
str5 db 'Setsockopt error.',10,10,0
str6 db 'Could not open socket',10,10,0
str7 db 'Got data!',10,10,0
str8 db 'Error accepting connection',10,10,0
filename db '.ini', 0
str_port db 'port', 0
str_ftpd db 'ftpd', 0
str_conn db 'conn', 0
sockaddr1:
dw AF_INET4
.port dw 21
.ip dd 0
rb 10
.length = $ - sockaddr1
; import
align 4
@IMPORT:
library console, 'console.obj', \
libini, 'libini.obj', \
libio, 'libio.obj'
import console, \
con_start, 'START', \
con_init, 'con_init', \
con_write_asciiz, 'con_write_asciiz', \
con_exit, 'con_exit', \
con_gets, 'con_gets',\
con_cls, 'con_cls',\
con_printf, 'con_printf',\
con_getch2, 'con_getch2',\
con_set_cursor_pos, 'con_set_cursor_pos'
import libini, \
ini.get_str, 'ini_get_str',\
ini.get_int, 'ini_get_int'
import libio, \
libio.init , 'lib_init' , \
file.size , 'file_size' , \
file.open , 'file_open' , \
file.read , 'file_read' , \
file.close , 'file_close'
i_end:
socketnum dd ?
; thread specific data
socketnum2 dd ?
state dd ?
buffer rb BUFFERSIZE
.length = BUFFERSIZE
path rb 1024
mem: