Subversion Repositories Kolibri OS

Rev

Rev 3701 | Rev 3789 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3701 hidnplayr 1
server_parser:
2
 
3
; Commands are always 3 numbers and followed by a space
4
; If a server decides it needs multiline output,
5
; first lines will have a dash instead of space after numbers,
6
; thus they are simply ignored.
7
 
8
        cmp     dword[s], "150 "
9
        je      data_ok
10
 
11
        cmp     dword[s], "220 "
12
        je      welcome
13
 
14
        cmp     dword[s], "227 "
15
        je      pasv_ok
16
 
17
        cmp     dword[s], "230 "
18
        je      login_ok
19
 
20
        cmp     dword[s], "331 "
21
        je      pass
22
 
23
        ret
24
 
25
 
26
welcome:
27
 
28
        mov     [status], STATUS_CONNECTED
29
        ret
30
 
31
 
32
pass:
33
 
34
        mov     [status], STATUS_NEEDPASSWORD
35
        ret
36
 
37
 
38
login_ok:
39
 
40
        mov     [status], STATUS_LOGGED_IN
41
        ret
42
 
43
 
44
pasv_ok:
45
 
46
        sub     ecx, 5
47
        jb      .fail
48
        mov     al, "("
49
        mov     edi, s + 5
50
        repne   scasb
51
 
52
        mcall   socket, AF_INET4, SOCK_STREAM, 0
53
        cmp     eax, -1
54
        je      fail
55
        mov     [datasocket], eax
56
 
57
        mov     esi, edi
58
        call    ascii_dec
59
        mov     byte[sockaddr2.ip+0], bl
60
        call    ascii_dec
61
        mov     byte[sockaddr2.ip+1], bl
62
        call    ascii_dec
63
        mov     byte[sockaddr2.ip+2], bl
64
        call    ascii_dec
65
        mov     byte[sockaddr2.ip+3], bl
66
 
67
        call    ascii_dec
68
        mov     byte[sockaddr2.port+1], bl
69
        call    ascii_dec
70
        mov     byte[sockaddr2.port+0], bl
71
 
72
        push    str_open
73
        call    [con_write_asciiz]
74
 
75
        mcall   connect, [datasocket], sockaddr2, 18
76
 
77
  .fail:
78
        ret
79
 
80
 
81
data_ok:
82
 
3704 hidnplayr 83
        mcall   recv, [datasocket], buffer_ptr, BUFFERSIZE, MSG_DONTWAIT   ; fixme: use other buffer
3701 hidnplayr 84
        inc     eax
85
        jz      .fail
86
        dec     eax
87
        jz      .fail
88
 
89
        mov     byte[buffer_ptr + eax], 0
90
        pushd   buffer_ptr
91
        call    [con_write_asciiz]
92
 
93
  .fail:
94
        ret
95
 
96
 
97
ascii_dec:
98
 
99
        xor     ebx, ebx
100
        mov     cl, 3
101
  .loop:
102
        lodsb
103
        sub     al, '0'
104
        jb      .done
105
        cmp     al, 9
106
        ja      .done
107
        lea     ebx, [ebx*4+ebx]
108
        shl     ebx, 1
109
        add     bl, al
110
        dec     cl
111
        jnz     .loop
112
 
113
  .done:
114
        ret