; ; 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: