1,126 → 1,88 |
resolve: |
;;================================================================================================;; |
parse_args: ;/////////////////////////////////////////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
;? parses command line arguments of type ;; |
;? ftp://user:password@server:port/folder/subfolder type urls and attempts to connect ;; |
;? automatically ;; |
;;------------------------------------------------------------------------------------------------;; |
;> buf_cmd = pointer to command line arguments ;; |
;;------------------------------------------------------------------------------------------------;; |
;< none ;; |
;;================================================================================================;; |
|
; parse command line parameters of type |
; ftp://user:password@server.com:port/folder/subfolder type urls |
|
; check ftp:// |
xor edx, edx |
cmp dword[buf_cmd], 'ftp:' |
jne @f |
mov esi, buf_cmd |
mov edi, str_ftp |
xor ecx, ecx |
jmp .start |
@@: |
mov al, byte [esi+edx] |
mov bl, byte [edi+edx] |
inc edx |
cmp al, bl |
jne main |
cmp byte [edi+edx], '/' |
jne @b |
inc ecx |
cmp ecx, 2 |
jne @b |
mov esi, buf_cmd+5 |
|
.start: |
; check ftp:// |
cmp dword[esi], 'ftp:' |
jne .error |
cmp word[esi+4], '//' |
jne .error |
|
; parse user |
mov dword[param_user], "USER" |
mov byte[param_user+4], " " |
inc edx |
add esi, edx |
lea edi, [param_user+5] |
.user: |
lea edi, [param_user] |
@@: |
lodsb |
cmp al, 0 |
jne @f |
mov eax, str_err_params |
jmp error |
@@: stosb |
test al, al |
jz .error |
stosb |
cmp byte [esi], ':' |
jne .user |
mov word [edi], 0x0a0d |
mov byte [edi+2], 0 |
jne @b |
mov byte [edi], 0 |
|
; parse password |
inc esi |
mov dword[param_password], "PASS" |
mov byte[param_password+4], " " |
lea edi, [param_password+5] |
.pass: |
lea edi, [param_password] |
@@: |
lodsb |
cmp al, 0 |
jne @f |
mov eax, str_err_params |
jmp error |
@@: stosb |
test al, al |
jz .error |
stosb |
cmp byte [esi], '@' |
jne .pass |
mov word [edi], 0x0a0d |
mov byte [edi+2], 0 |
jne @b |
mov byte [edi], 0 |
|
; parse server address |
inc esi |
mov edi, param_server_addr |
.addr: |
@@: |
lodsb |
cmp al, 0 |
jne @f |
mov eax, str_err_params |
jmp error |
@@: stosb |
test al, al |
jz .error |
stosb |
cmp byte [esi], ':' |
jne .addr |
jne @b |
mov byte [edi], 0 |
|
; parse port |
inc esi |
xor eax, eax |
xor ebx, ebx |
mov [sockaddr1.port], 21 shl 8 |
.port: |
lea edi, [param_port] |
@@: |
lodsb |
cmp al, 0 |
jne @f |
mov eax, str_err_params |
jmp error |
@@: cmp al, '/' |
jbe .port_done |
sub al, '0' |
jnb @f |
mov eax, str_err_host |
jmp error |
@@: cmp al, 9 |
jna @f |
mov eax, str_err_host |
jmp error |
@@: lea ebx, [ebx*4 + ebx] |
shl ebx, 1 |
add ebx, eax |
jmp .port |
.port_done: |
xchg bl, bh |
mov [sockaddr1.port], bx |
test al, al |
jz .error |
stosb |
cmp byte [esi], '/' |
jne @b |
mov byte [edi], 0 |
|
; parse path |
mov dword[param_path], "CWD " |
lea edi, [param_path+4] |
.path: |
lodsb |
stosb |
inc esi |
lea edi, [param_path] |
@@: |
movsb |
cmp byte [esi], 0 |
jne .path |
mov word [edi], 0x0a0d |
mov byte [edi+2], 0 |
jne @b |
mov byte [edi], 0 |
|
; parameters resolved successfully |
mov [use_params], 1 |
; parameters parsed successfully |
jmp arg_handler.connect |
|
; copy server address to buf_cmd |
mov esi, param_server_addr |
mov edi, buf_cmd |
.copy: |
lodsb |
stosb |
cmp byte [edi], 0 |
jne .copy |
mov byte [esi], 0 |
|
jmp no_resolve.done |
|
.error: |
mov eax, str_err_params |
jmp error |