Added RDIR command to FTPC

git-svn-id: svn://kolibrios.org@4922 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
ashmew2 2014-05-11 23:42:10 +00:00
parent 7315bb05c0
commit 5386a3ea58
3 changed files with 258 additions and 113 deletions

View File

@ -27,6 +27,7 @@ OPERATION_NONE = 0
OPERATION_LIST = 1 OPERATION_LIST = 1
OPERATION_RETR = 2 OPERATION_RETR = 2
OPERATION_STOR = 3 OPERATION_STOR = 3
OPERATION_RDIR = 4
use32 use32
; standard header ; standard header
@ -36,7 +37,7 @@ use32
dd i_end ; initialized size dd i_end ; initialized size
dd mem+0x1000 ; required memory dd mem+0x1000 ; required memory
dd mem+0x1000 ; stack pointer dd mem+0x1000 ; stack pointer
dd s ; parameters dd buf_cmd ; parameters
dd 0 ; path dd 0 ; path
include '../../macros.inc' include '../../macros.inc'
@ -49,6 +50,11 @@ include 'usercommands.inc'
include 'servercommands.inc' include 'servercommands.inc'
start: start:
; initialize heap for using dynamic blocks
mcall 68,11
test eax,eax
je exit2
; disable all events except network event ; disable all events except network event
mcall 40, EV_STACK mcall 40, EV_STACK
; load libraries ; load libraries
@ -59,7 +65,7 @@ start:
invoke con_start, 1 invoke con_start, 1
invoke con_init, 80, 25, 80, 250, str_title invoke con_init, 80, 25, 80, 250, str_title
; Check for parameters, if there are some, resolve the address right away ; Check for parameters, if there are some, resolve the address right away
cmp byte [s], 0 cmp byte [buf_cmd], 0
jne resolve jne resolve
main: main:
@ -71,11 +77,11 @@ main:
invoke con_set_flags, 0x0a invoke con_set_flags, 0x0a
invoke con_write_asciiz, str_prompt invoke con_write_asciiz, str_prompt
; read string ; read string
invoke con_gets, s, 256 invoke con_gets, buf_cmd, 256
; check for exit ; check for exit
test eax, eax test eax, eax
jz done jz done
cmp byte [s], 10 cmp byte [buf_cmd], 10
jz done jz done
; reset color back to grey and print newline ; reset color back to grey and print newline
invoke con_set_flags, 0x07 invoke con_set_flags, 0x07
@ -83,7 +89,7 @@ main:
resolve: resolve:
; delete terminating '\n' ; delete terminating '\n'
mov esi, s mov esi, buf_cmd
@@: @@:
lodsb lodsb
cmp al, 0x20 cmp al, 0x20
@ -91,10 +97,10 @@ resolve:
mov byte [esi-1], 0 mov byte [esi-1], 0
; Say to the user that we're resolving ; Say to the user that we're resolving
invoke con_write_asciiz, str_resolve invoke con_write_asciiz, str_resolve
invoke con_write_asciiz, s invoke con_write_asciiz, buf_cmd
; resolve name ; resolve name
push esp ; reserve stack place push esp ; reserve stack place
invoke getaddrinfo, s, 0, 0, esp invoke getaddrinfo, buf_cmd, 0, 0, esp
pop esi pop esi
; test for error ; test for error
test eax, eax test eax, eax
@ -130,7 +136,7 @@ wait_for_servercommand:
cmp [offset], 0 cmp [offset], 0
je .receive ; nope, receive some more je .receive ; nope, receive some more
mov esi, [offset] mov esi, [offset]
mov edi, s mov edi, buf_cmd
mov ecx, [size] mov ecx, [size]
add ecx, esi add ecx, esi
jmp .byteloop jmp .byteloop
@ -145,7 +151,7 @@ wait_for_servercommand:
mcall 26, 9 mcall 26, 9
cmp eax, [timeout] cmp eax, [timeout]
jge error_timeout jge error_timeout
mcall recv, [socketnum], buffer_ptr, BUFFERSIZE, MSG_DONTWAIT mcall recv, [socketnum], buf_buffer1, BUFFERSIZE, MSG_DONTWAIT
test eax, eax test eax, eax
jnz .got_data jnz .got_data
cmp ebx, EWOULDBLOCK cmp ebx, EWOULDBLOCK
@ -155,10 +161,10 @@ wait_for_servercommand:
.got_data: .got_data:
mov [offset], 0 mov [offset], 0
; extract commands, copy them to "s" buffer ; extract commands, copy them to "buf_cmd" buffer
lea ecx, [eax + buffer_ptr] ; ecx = end pointer lea ecx, [eax + buf_buffer1] ; ecx = end pointer
mov esi, buffer_ptr ; esi = current pointer mov esi, buf_buffer1 ; esi = current pointer
mov edi, s mov edi, buf_cmd
.byteloop: .byteloop:
cmp esi, ecx cmp esi, ecx
jae wait_for_servercommand jae wait_for_servercommand
@ -179,12 +185,12 @@ wait_for_servercommand:
.no_more_data: .no_more_data:
mov [offset], 0 mov [offset], 0
.go_cmd: .go_cmd:
lea ecx, [edi - s] ; length of command lea ecx, [edi - buf_cmd] ; length of command
xor al, al xor al, al
stosb stosb
invoke con_set_flags, 0x03 ; change color invoke con_set_flags, 0x03 ; change color
invoke con_write_asciiz, s ; print servercommand invoke con_write_asciiz, buf_cmd ; print servercommand
invoke con_write_asciiz, str_newline invoke con_write_asciiz, str_newline
invoke con_set_flags, 0x07 ; reset color invoke con_set_flags, 0x07 ; reset color
@ -194,6 +200,11 @@ wait_for_servercommand:
wait_for_usercommand: wait_for_usercommand:
; Are there any files in the transfer queue?
cmp [queued], 0
ja transfer_queued ; Yes, transfer those first.
; change color to green for user input ; change color to green for user input
invoke con_set_flags, 0x0a invoke con_set_flags, 0x0a
@ -207,53 +218,56 @@ wait_for_usercommand:
; write prompt ; write prompt
invoke con_write_asciiz, str_prompt invoke con_write_asciiz, str_prompt
; read string ; read string
invoke con_gets, s, 256 invoke con_gets, buf_cmd, 256
; print a newline and reset the color back to grey ; print a newline and reset the color back to grey
invoke con_write_asciiz, str_newline invoke con_write_asciiz, str_newline
invoke con_set_flags, 0x07 invoke con_set_flags, 0x07
cmp dword[s], "cwd " cmp dword[buf_cmd], "cwd "
je cmd_cwd je cmd_cwd
cmp dword[s], "mkd " cmp dword[buf_cmd], "mkd "
je cmd_mkd je cmd_mkd
cmp dword[s], "rmd " cmp dword[buf_cmd], "rmd "
je cmd_rmd je cmd_rmd
cmp dword[s], "pwd" + 10 shl 24 cmp dword[buf_cmd], "pwd" + 10 shl 24
je cmd_pwd je cmd_pwd
cmp dword[s], "bye" + 10 shl 24 cmp dword[buf_cmd], "bye" + 10 shl 24
je cmd_bye je cmd_bye
cmp byte[s+4], " " cmp dword[buf_cmd], "rdir"
je cmd_rdir
cmp byte[buf_cmd+4], " "
jne @f jne @f
cmp dword[s], "lcwd" cmp dword[buf_cmd], "lcwd"
je cmd_lcwd je cmd_lcwd
cmp dword[s], "retr" cmp dword[buf_cmd], "retr"
je cmd_retr je cmd_retr
cmp dword[s], "stor" cmp dword[buf_cmd], "stor"
je cmd_stor je cmd_stor
cmp dword[s], "dele" cmp dword[buf_cmd], "dele"
je cmd_dele je cmd_dele
@@: @@:
cmp byte[s+4], 10 cmp byte[buf_cmd+4], 10
jne @f jne @f
cmp dword[s], "list" cmp dword[buf_cmd], "list"
je cmd_list je cmd_list
cmp dword[s], "help" cmp dword[buf_cmd], "help"
je cmd_help je cmd_help
cmp dword[s], "cdup" cmp dword[buf_cmd], "cdup"
je cmd_cdup je cmd_cdup
@@: @@:
@ -265,32 +279,32 @@ wait_for_usercommand:
.connected: .connected:
; request username ; request username
invoke con_write_asciiz, str_user invoke con_write_asciiz, str_user
mov dword[s], "USER" mov dword[buf_cmd], "USER"
mov byte[s+4], " " mov byte[buf_cmd+4], " "
jmp .send jmp .send
.needpass: .needpass:
; request password ; request password
invoke con_write_asciiz, str_pass invoke con_write_asciiz, str_pass
mov dword[s], "PASS" mov dword[buf_cmd], "PASS"
mov byte[s+4], " " mov byte[buf_cmd+4], " "
invoke con_set_flags, 0x00 ; black text on black background for password invoke con_set_flags, 0x00 ; black text on black background for password
.send: .send:
; read string ; read string
mov esi, s+5 mov esi, buf_cmd+5
invoke con_gets, esi, 256 invoke con_gets, esi, 256
; find end of string ; find end of string
mov edi, s+5 mov edi, buf_cmd+5
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
repne scasb repne scasb
lea esi, [edi-s] lea esi, [edi-buf_cmd]
mov word[edi-2], 0x0a0d mov word[edi-2], 0x0a0d
; and send it to the server ; and send it to the server
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
invoke con_write_asciiz, str_newline invoke con_write_asciiz, str_newline
invoke con_set_flags, 0x07 ; reset color invoke con_set_flags, 0x07 ; reset color
@ -332,6 +346,10 @@ error_resolve:
invoke con_set_flags, 0x0c ; print errors in red invoke con_set_flags, 0x0c ; print errors in red
invoke con_write_asciiz, str_err_resolve invoke con_write_asciiz, str_err_resolve
error_heap:
invoke con_set_flags, 0x0c ; print errors in red
invoke con_write_asciiz, str_err_heap
wait_for_keypress: wait_for_keypress:
invoke con_set_flags, 0x07 ; reset color to grey invoke con_set_flags, 0x07 ; reset color to grey
invoke con_write_asciiz, str_push invoke con_write_asciiz, str_push
@ -344,6 +362,7 @@ done:
exit: exit:
mcall close, [socketnum] mcall close, [socketnum]
exit2:
mcall -1 mcall -1
@ -359,6 +378,7 @@ str_resolve db 'Resolving ',0
str_newline db 10,0 str_newline db 10,0
str_err_resolve db 10,'Name resolution failed.',10,0 str_err_resolve db 10,'Name resolution failed.',10,0
str_err_socket db 10,'Socket error.',10,0 str_err_socket db 10,'Socket error.',10,0
str_err_heap db 10,'Cannot allocate memory from heap.',10,0
str_err_timeout db 10,'Timeout - no response from server.',10,0 str_err_timeout db 10,'Timeout - no response from server.',10,0
str_err_connect db 10,'Cannot connect to the server.',10,0 str_err_connect db 10,'Cannot connect to the server.',10,0
str8 db ' (',0 str8 db ' (',0
@ -372,8 +392,8 @@ str_unknown db "Unknown command or insufficient parameters - type help for m
str_lcwd db "Local working directory is now: ",0 str_lcwd db "Local working directory is now: ",0
str_open db "opening data socket",10,0 str_open db "opening data socket",10,0
str_close db "closing data socket",10,0 str_close db 10,"closing data socket",10,0
str2b db '.',0 str_dot db '.',0
str_help db "available commands:",10 str_help db "available commands:",10
db 10 db 10
@ -388,8 +408,10 @@ str_help db "available commands:",10
db "retr <file> - retreive file from the server",10 db "retr <file> - retreive file from the server",10
db "rmd <directory> - remove directory from the server",10 db "rmd <directory> - remove directory from the server",10
db "stor <file> - store file on the server",10 db "stor <file> - store file on the server",10
db "rdir - retreive all files from current server dir",10
db 10,0 db 10,0
queued dd 0
; FTP strings ; FTP strings
@ -446,7 +468,10 @@ offset dd ?
size dd ? size dd ?
operation dd ? operation dd ?
size_fname dd ?
ptr_queue dd ?
timeout dd ? timeout dd ?
ptr_fname_start dd ?
filestruct: filestruct:
.subfn dd ? .subfn dd ?
@ -456,9 +481,8 @@ filestruct:
.ptr dd ? .ptr dd ?
.name rb 1024 .name rb 1024
buffer_ptr rb BUFFERSIZE+1 buf_buffer1 rb BUFFERSIZE+1
buffer_ptr2 rb BUFFERSIZE+1 buf_buffer2 rb BUFFERSIZE+1
buf_cmd rb 1024 ; buffer for holding command string
s rb 1024
mem: mem:

View File

@ -5,40 +5,40 @@ server_parser:
; first lines will have a dash instead of space after numbers, ; first lines will have a dash instead of space after numbers,
; thus they are simply ignored in this simple command parser. ; thus they are simply ignored in this simple command parser.
cmp dword[s], "150 " cmp dword[buf_cmd], "150 "
je data_loop je data_loop
cmp dword[s], "220 " cmp dword[buf_cmd], "220 "
je welcome je welcome
; cmp dword[s], "226 " ; cmp dword[buf_cmd], "226 "
; je transfer_ok ; je transfer_ok
cmp dword[s], "227 " cmp dword[buf_cmd], "227 "
je pasv_ok je pasv_ok
cmp dword[s], "230 " cmp dword[buf_cmd], "230 "
je login_ok je login_ok
; cmp dword[s], "250" ; cmp dword[buf_cmd], "250"
; je op_ok ; je op_ok
cmp dword[s], "331 " cmp dword[buf_cmd], "331 "
je pass je pass
; cmp dword[s], "421 " ; cmp dword[buf_cmd], "421 "
; je timeout ; je timeout
cmp dword[s], "503 " ; login first cmp dword[buf_cmd], "503 " ; login first
je welcome je welcome
cmp dword[s], "530 " ; password incorrect cmp dword[buf_cmd], "530 " ; password incorrect
je welcome je welcome
cmp dword[s], "550 " cmp dword[buf_cmd], "550 "
je close_datacon je close_datacon
cmp byte[s+3], "-" cmp byte[buf_cmd+3], "-"
je wait_for_servercommand je wait_for_servercommand
jmp wait_for_usercommand jmp wait_for_usercommand
@ -66,7 +66,7 @@ pasv_ok:
sub ecx, 4 sub ecx, 4
jb .fail jb .fail
mov al, "(" mov al, "("
mov edi, s + 4 mov edi, buf_cmd + 4
repne scasb repne scasb
mcall socket, AF_INET4, SOCK_STREAM, 0 mcall socket, AF_INET4, SOCK_STREAM, 0
@ -102,27 +102,30 @@ pasv_ok:
data_loop: data_loop:
invoke con_write_asciiz, str2b invoke con_write_asciiz, str_dot
cmp [operation], OPERATION_STOR cmp [operation], OPERATION_STOR
je .stor je .stor
; we are receiving data ; we are receiving data
mcall recv, [datasocket], buffer_ptr2, BUFFERSIZE, 0 mcall recv, [datasocket], buf_buffer2, BUFFERSIZE, 0
test ebx, ebx test ebx, ebx
jnz .done jnz .done
mov byte[buffer_ptr2 + eax], 0 mov byte[buf_buffer2 + eax], 0
cmp [operation], OPERATION_RETR cmp [operation], OPERATION_RETR
je .retr je .retr
cmp [operation], OPERATION_RDIR
je .rdir
; not retreiving, just print to console ; not retreiving, just print to console
invoke con_write_asciiz, buffer_ptr2 invoke con_write_asciiz, buf_buffer2
jmp data_loop jmp data_loop
; retreiving, save to file ; retreiving, save to file
.retr: .retr:
mov [filestruct.ptr], buffer_ptr2 mov [filestruct.ptr], buf_buffer2
mov [filestruct.size], eax mov [filestruct.size], eax
push eax push eax
mcall 70, filestruct mcall 70, filestruct
@ -139,12 +142,12 @@ data_loop:
; jne .fileerror ; jne .fileerror
add [filestruct.offset], ebx add [filestruct.offset], ebx
mov esi, ebx mov esi, ebx
mcall send, [datasocket], buffer_ptr2, , 0 mcall send, [datasocket], buf_buffer2, , 0
jmp .stor jmp .stor
.last_call: .last_call:
mov esi, ebx mov esi, ebx
mcall send, [datasocket], buffer_ptr2, , 0 mcall send, [datasocket], buf_buffer2, , 0
.done: .done:
invoke con_write_asciiz, str_close invoke con_write_asciiz, str_close
@ -153,6 +156,108 @@ data_loop:
jmp wait_for_servercommand jmp wait_for_servercommand
.rdir:
cmp [size_fname], 0
jne .realloc
.malloc: ; create a new dynamic block
mov ecx, eax
inc ecx
mcall 68,12 ; eax now points to new buffer
test eax,eax
je error_heap
mov [ptr_fname_start], eax
jmp .rdir_init
.realloc: ; expand block created with .malloc
mov ecx, eax ; eax is size of buffer received
inc ecx
add ecx, [size_fname] ; added old size to form new required size
mcall 68,20,,[ptr_fname_start]
test eax, eax
je error_heap
mov [ptr_fname_start], eax ; eax contains the new block now
add eax, [size_fname]
.rdir_init: ; copies filenames into our buffer
mov esi, buf_buffer2
mov edi, eax
.copy_buf:
lodsb
cmp al,13 ; ignore any \r character
je .copy_buf
stosb
cmp al, 10
jne .not_end
inc [queued]
.not_end:
test al,al
jne .copy_buf
dec edi
dec edi
mov eax, [ptr_fname_start]
mov [ptr_queue], eax
sub edi, eax ; edi contains the current size now
mov [size_fname], edi
jmp data_loop
; files for rdir operation are queued
transfer_queued:
mov esi, [ptr_queue] ; always pointing to current part of ptr_fname_start
mov edi, buf_cmd+5 ; always point to filename for retr command
.build_filename:
lodsb
stosb
cmp al,10
je .get_file ; filename ends with character 10
test al,al
jz .null_found ; this should be end of buffer
jmp .build_filename
.null_found:
mov [queued],0
jmp .free
.get_file:
dec [queued]
jnz .after_free
.free:
mcall 68,13,[ptr_fname_start] ; freeing the buffer
test eax,eax
jz error_heap
jmp wait_for_usercommand
.after_free:
xor al,al ; appending 0 after retr command
stosb
mov eax, esi
mov [ptr_queue], eax
jmp cmd_retr
close_datacon: close_datacon:
cmp [operation], OPERATION_NONE cmp [operation], OPERATION_NONE
je wait_for_usercommand je wait_for_usercommand

View File

@ -9,9 +9,9 @@ cmd_help:
cmd_bye: cmd_bye:
; Send BYE message to the server ; Send BYE message to the server
mov dword[s], "BYE" + 13 shl 24 mov dword[buf_cmd], "BYE" + 13 shl 24
mov byte[s+4], 10 mov byte[buf_cmd+4], 10
mcall send, [socketnum], s, 5, 0 mcall send, [socketnum], buf_cmd, 5, 0
; Close the control connection ; Close the control connection
mcall close, [socketnum] mcall close, [socketnum]
@ -20,42 +20,42 @@ cmd_bye:
cmd_pwd: cmd_pwd:
mov dword[s], "PWD" + 13 shl 24 mov dword[buf_cmd], "PWD" + 13 shl 24
mov byte[s+4], 10 mov byte[buf_cmd+4], 10
mcall send, [socketnum], s, 5, 0 mcall send, [socketnum], buf_cmd, 5, 0
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_cwd: cmd_cwd:
mov dword[s], "CWD " mov dword[buf_cmd], "CWD "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov word [edi - 2], 0x0a0d mov word [edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_dele: cmd_dele:
mov dword[s], "DELE" mov dword[buf_cmd], "DELE"
mov byte[s], " " mov byte[buf_cmd], " "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov word [edi - 2], 0x0a0d mov word [edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
jmp wait_for_servercommand jmp wait_for_servercommand
@ -65,9 +65,9 @@ cmd_list:
mov [operation], OPERATION_LIST mov [operation], OPERATION_LIST
mov dword[s], "LIST" mov dword[buf_cmd], "LIST"
mov word[s+4], 0x0a0d mov word[buf_cmd+4], 0x0a0d
mcall send, [socketnum], s, 6, 0 mcall send, [socketnum], buf_cmd, 6, 0
jmp wait_for_servercommand jmp wait_for_servercommand
@ -77,7 +77,9 @@ cmd_retr:
; Create/open the file ; Create/open the file
mov esi, s+5 ; Create/open the file
mov esi, buf_cmd+5
mov ecx, 256-5 mov ecx, 256-5
call set_filename call set_filename
@ -98,20 +100,34 @@ cmd_retr:
; Request the file from server ; Request the file from server
mov dword[s], "RETR" mov dword[buf_cmd], "RETR"
mov byte[s+4], " " mov byte[buf_cmd+4], " "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov dword[edi - 2], 0x0a0d mov dword[edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
invoke con_write_asciiz, s ; print command invoke con_write_asciiz, buf_cmd ; print command
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_rdir:
mov [operation], OPERATION_RDIR
; Request filename list from the server
call open_dataconnection
mov [size_fname], 0
mov dword[buf_cmd], "NLST"
mov word[buf_cmd+4], 0x0a0d
mcall send, [socketnum], buf_cmd, 6, 0
jmp wait_for_servercommand
cmd_stor: cmd_stor:
@ -123,29 +139,29 @@ cmd_stor:
mov [filestruct.offset], 0 mov [filestruct.offset], 0
mov [filestruct.offset+4], 0 mov [filestruct.offset+4], 0
mov [filestruct.size], BUFFERSIZE mov [filestruct.size], BUFFERSIZE
mov [filestruct.ptr], buffer_ptr2 mov [filestruct.ptr], buf_buffer2
mov esi, s+5 mov esi, buf_cmd+5
mov ecx, 256-5 mov ecx, 256-5
call set_filename call set_filename
mov dword[s], "STOR" mov dword[buf_cmd], "STOR"
mov byte[s+4], " " mov byte[buf_cmd+4], " "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov word [edi - 2], 0x0a0d mov word [edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_lcwd: cmd_lcwd:
mov esi, s+5 mov esi, buf_cmd+5
mov ecx, 256-5 mov ecx, 256-5
.loop: .loop:
lodsb lodsb
@ -156,11 +172,11 @@ cmd_lcwd:
loop .loop loop .loop
.done: .done:
mov byte[esi-1], 0 mov byte[esi-1], 0
mcall 30, 1, s+5 ; set working directory mcall 30, 1, buf_cmd+5 ; set working directory
mcall 30, 2, s, 256 ; and read it again mcall 30, 2, buf_cmd, 256 ; and read it again
invoke con_write_asciiz, str_lcwd invoke con_write_asciiz, str_lcwd
invoke con_write_asciiz, s invoke con_write_asciiz, buf_cmd
invoke con_write_asciiz, str_newline invoke con_write_asciiz, str_newline
jmp wait_for_usercommand jmp wait_for_usercommand
@ -168,41 +184,41 @@ cmd_lcwd:
cmd_cdup: cmd_cdup:
mov dword[s], "CDUP" mov dword[buf_cmd], "CDUP"
mov word[s+4], 0x0d0a mov word[buf_cmd+4], 0x0d0a
mcall send, [socketnum], s, 6, 0 mcall send, [socketnum], buf_cmd, 6, 0
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_rmd: cmd_rmd:
mov dword[s], "RMD " mov dword[buf_cmd], "RMD "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov word [edi - 2], 0x0a0d mov word [edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
jmp wait_for_servercommand jmp wait_for_servercommand
cmd_mkd: cmd_mkd:
mov dword[s], "MKD " mov dword[buf_cmd], "MKD "
mov ecx, 256 mov ecx, 256
xor al, al xor al, al
mov edi, s mov edi, buf_cmd
repne scasb repne scasb
lea esi, [edi - s] lea esi, [edi - buf_cmd]
mov word [edi - 2], 0x0a0d mov word [edi - 2], 0x0a0d
mcall send, [socketnum], s, , 0 mcall send, [socketnum], buf_cmd, , 0
jmp wait_for_servercommand jmp wait_for_servercommand