Subversion Repositories Kolibri OS

Rev

Rev 6437 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6437 Rev 6582
1
server_parser:
1
server_parser:
2
 
2
 
3
; Commands are always 3 numbers and followed by a space
3
; Commands are always 3 numbers and followed by a space
4
; If a server decides it needs multiline output,
4
; If a server decides it needs multiline output,
5
; first lines will have a dash instead of space after numbers,
5
; first lines will have a dash instead of space after numbers,
6
; thus they are simply ignored in this simple command parser.
6
; thus they are simply ignored in this simple command parser.
-
 
7
 
-
 
8
        cmp     dword[buf_cmd+4], "Open"
-
 
9
        je      init_download_count
7
 
10
 
8
        cmp     dword[buf_cmd], "150 "
11
        cmp     dword[buf_cmd], "150 "
9
        je      data_loop
12
        je      data_loop
10
 
13
 
11
        cmp     dword[buf_cmd], "220 "
14
        cmp     dword[buf_cmd], "220 "
12
        je      welcome
15
        je      connect_ok
13
 
16
 
14
;        cmp     dword[buf_cmd], "226 "
17
;        cmp     dword[buf_cmd], "226 "
15
;        je      transfer_ok
18
;        je      transfer_ok
16
 
19
 
17
        cmp     dword[buf_cmd], "227 "
20
        cmp     dword[buf_cmd], "227 "
18
        je      pasv_ok
21
        je      pasv_ok
19
 
22
 
20
        cmp     dword[buf_cmd], "230 "
23
        cmp     dword[buf_cmd], "230 "
21
        je      login_ok
24
        je      login_ok
22
 
25
 
23
;        cmp     dword[buf_cmd], "250"
26
;        cmp     dword[buf_cmd], "250"
24
;        je      op_ok
27
;        je      op_ok
25
 
28
 
26
        cmp     dword[buf_cmd], "331 "
29
        cmp     dword[buf_cmd], "331 "
27
        je      pass
30
        je      pass
28
 
31
 
29
;        cmp     dword[buf_cmd], "421 "
32
;        cmp     dword[buf_cmd], "421 "
30
;        je      timeout
33
;        je      timeout
31
 
34
 
32
        cmp     dword[buf_cmd], "503 "         ; login first
35
        cmp     dword[buf_cmd], "503 "         ; login first
33
        je      welcome
36
        je      welcome
34
 
37
 
35
        cmp     dword[buf_cmd], "530 "         ; password incorrect
38
        cmp     dword[buf_cmd], "530 "         ; password incorrect
36
        mov     [use_params], 0
-
 
37
        je      welcome
39
        je      welcome
38
 
40
 
39
        cmp     dword[buf_cmd], "550 "
41
        cmp     dword[buf_cmd], "550 "
40
        je      close_datacon
42
        je      close_datacon
41
 
43
 
42
        cmp     byte[buf_cmd+3], "-"
44
        cmp     byte[buf_cmd+3], "-"
43
        je      wait_for_servercommand
45
        je      wait_for_servercommand
44
        jmp     wait_for_usercommand
46
        jmp     wait_for_usercommand
45
 
47
 
46
 
48
 
47
welcome:
49
welcome:
48
 
50
 
49
        mov     [status], STATUS_CONNECTED
51
        mov     [status], STATUS_CONNECTED
50
        jmp     wait_for_usercommand
52
        jmp     wait_for_usercommand
51
 
53
 
-
 
54
 
-
 
55
connect_ok:
-
 
56
 
-
 
57
        mov     [status], STATUS_CONNECTED
-
 
58
        jmp     arg_handler.copy_user
52
 
59
 
53
pass:
60
pass:
54
 
61
 
55
        mov     [status], STATUS_NEEDPASSWORD
62
        mov     [status], STATUS_NEEDPASSWORD
56
        jmp     wait_for_usercommand
63
        jmp     wait_for_usercommand
57
 
64
 
58
 
65
 
59
login_ok:
66
login_ok:
60
 
67
 
61
        mov     [status], STATUS_LOGGED_IN
68
        mov     [status], STATUS_LOGGED_IN
62
        cmp     [use_params], 0
-
 
63
        je      wait_for_usercommand
-
 
64
 
69
 
65
        cmp     [param_path+4], 0
70
        cmp     [param_path], 0x20 ; no path specified
-
 
71
        jbe     wait_for_usercommand
66
        je      wait_for_usercommand
72
        
67
        ; copy path to buf_cmd and execute CWD
-
 
68
        mov     edi, buf_cmd
73
        ; copy path to buf_cmd and execute CWD
69
        mov     esi, param_path
74
        jmp     arg_handler.get_path
70
  @@:
-
 
71
        lodsb
-
 
72
        stosb
-
 
73
        cmp     byte[esi-1], 0
-
 
74
        jne     @b
-
 
75
        jmp     cmd_cwd
75
 
76
 
76
 
77
pasv_ok:
77
pasv_ok:
78
 
78
 
79
        sub     ecx, 4
79
        sub     ecx, 4
80
        jb      .fail
80
        jb      .fail
81
        mov     al, "("
81
        mov     al, "("
82
        mov     edi, buf_cmd + 4
82
        mov     edi, buf_cmd + 4
83
        repne   scasb
83
        repne   scasb
84
 
84
 
85
        mcall   socket, AF_INET4, SOCK_STREAM, 0
85
        mcall   socket, AF_INET4, SOCK_STREAM, 0
86
        cmp     eax, -1
86
        cmp     eax, -1
87
        jne     @f
87
        jne     @f
88
        mov     eax, str_err_socket
88
        mov     eax, str_err_socket
89
        jmp     error
89
        jmp     error
90
    @@: mov     [datasocket], eax
90
    @@: mov     [datasocket], eax
91
 
91
 
92
        mov     esi, edi
92
        mov     esi, edi
93
        call    ascii_dec
93
        call    ascii_dec
94
        mov     byte[sockaddr2.ip+0], bl
94
        mov     byte[sockaddr2.ip+0], bl
95
        call    ascii_dec
95
        call    ascii_dec
96
        mov     byte[sockaddr2.ip+1], bl
96
        mov     byte[sockaddr2.ip+1], bl
97
        call    ascii_dec
97
        call    ascii_dec
98
        mov     byte[sockaddr2.ip+2], bl
98
        mov     byte[sockaddr2.ip+2], bl
99
        call    ascii_dec
99
        call    ascii_dec
100
        mov     byte[sockaddr2.ip+3], bl
100
        mov     byte[sockaddr2.ip+3], bl
101
 
101
 
102
        call    ascii_dec
102
        call    ascii_dec
103
        mov     byte[sockaddr2.port+0], bl
103
        mov     byte[sockaddr2.port+0], bl
104
        call    ascii_dec
104
        call    ascii_dec
105
        mov     byte[sockaddr2.port+1], bl
105
        mov     byte[sockaddr2.port+1], bl
106
 
106
 
107
        invoke  con_write_asciiz, str_open
107
        icall   eax, interface_addr, interface.print, str_open
108
        mcall   connect, [datasocket], sockaddr2, 18
108
        mcall   connect, [datasocket], sockaddr2, 18
109
        cmp     eax, -1
109
        cmp     eax, -1
110
        jne     @f
110
        jne     @f
111
        mov     eax, str_err_connect
111
        mov     eax, str_err_connect
112
        jmp     error
112
        jmp     error
113
    @@: jmp     wait_for_servercommand
113
    @@: jmp     wait_for_servercommand
114
 
114
 
115
  .fail:
115
  .fail:
116
        invoke  con_write_asciiz, str_unknown
116
        icall   eax, interface_addr, interface.print, str_unknown
117
        jmp     wait_for_servercommand
117
        jmp     wait_for_servercommand
118
 
118
 
-
 
119
 
-
 
120
; get file size, initialize count for number of bytes downloaded
-
 
121
init_download_count:
-
 
122
 
-
 
123
        mov     edx, 0
-
 
124
        ; search for 'Open' in buf_cmd
119
 
125
        lea     esi, [buf_cmd+3]
-
 
126
      @@:
-
 
127
        inc     esi
-
 
128
        cmp     dword[esi], 'Open'
-
 
129
        je      @f
-
 
130
        cmp     byte[esi], 0
-
 
131
        jne     @b
-
 
132
        jmp     data_loop
-
 
133
 
-
 
134
      @@:
-
 
135
        ; get file size
-
 
136
        mov     al, '('
-
 
137
        mov     ecx, -1
-
 
138
        mov     edi, buf_cmd
-
 
139
        repne   scasb
-
 
140
        xor     eax, eax
-
 
141
        mov     ebx, 10
-
 
142
        xor     ecx, ecx
-
 
143
        mov     esi, edi
-
 
144
      @@:
-
 
145
        push    eax
-
 
146
        lodsb
-
 
147
        sub     al, '0'
-
 
148
        mov     cl, al
-
 
149
        pop     eax
-
 
150
        mul     ebx
-
 
151
        add     eax, ecx
120
data_loop:
152
        cmp     byte[esi], ' '
-
 
153
        jne     @b
-
 
154
        mov     [file_size], eax
121
 
155
 
122
        invoke  con_write_asciiz, str_dot
156
data_loop:
123
 
157
 
124
        cmp     [operation], OPERATION_STOR
158
        cmp     [operation], OPERATION_STOR
125
        je      .stor
159
        je      .stor
-
 
160
 
126
 
161
        push    edx
127
; we are receiving data
162
; we are receiving data
-
 
163
        mcall   recv, [datasocket], buf_buffer2, BUFFERSIZE, 0
-
 
164
        pop     edx ; get byte count
128
        mcall   recv, [datasocket], buf_buffer2, BUFFERSIZE, 0
165
        add     edx, eax
129
        test    ebx, ebx
166
        test    ebx, ebx
130
        jnz     .done
167
        jnz     .done
131
        mov     byte[buf_buffer2 + eax], 0
168
        mov     byte[buf_buffer2 + eax], 0
132
 
169
 
133
        cmp     [operation], OPERATION_RETR
170
        cmp     [operation], OPERATION_RETR
134
        je      .retr
171
        je      .retr
135
 
172
 
136
        cmp     [operation], OPERATION_RDIR
173
        cmp     [operation], OPERATION_RDIR
137
        je      .rdir
174
        je      .rdir
-
 
175
 
-
 
176
        cmp     [operation], OPERATION_LIST
-
 
177
        je      .list
138
        
178
        
139
; not retreiving, just print to console
179
; not retreiving, just print to console
140
        invoke  con_write_asciiz, buf_buffer2
180
        icall   eax, interface_addr, interface.print, buf_buffer2
-
 
181
        jmp     data_loop
-
 
182
 
-
 
183
; for console, simply print. for gui, add name to tree list
-
 
184
  .list:
-
 
185
        ijmp    ebx, interface_addr, interface.list
141
        jmp     data_loop
186
 
142
 
187
 
143
; retreiving, save to file
188
; retreiving, save to file
144
  .retr:
189
  .retr:
145
        mov     [filestruct.ptr], buf_buffer2
190
        mov     [filestruct.ptr], buf_buffer2
146
        mov     [filestruct.size], eax
191
        mov     [filestruct.size], eax
147
        push    eax
192
        push    eax
148
        mcall   70, filestruct
193
        mcall   70, filestruct
-
 
194
        test    eax, eax
-
 
195
        jz      @f
-
 
196
        call    error_fs
-
 
197
        jmp     close_datacon
-
 
198
      @@:
149
        pop     eax
199
        pop     eax
150
        add     [filestruct.offset], eax
200
        add     [filestruct.offset], eax
-
 
201
 
-
 
202
        icall   eax, interface_addr, interface.progress
151
        jmp     data_loop
203
        jmp     data_loop
152
 
204
 
153
; storing, send all data
205
; storing, send all data
154
  .stor:
206
  .stor:
155
        mcall   70, filestruct
207
        mcall   70, filestruct
156
        cmp     eax, 6          ; end of file
208
        cmp     eax, 6          ; end of file
157
        je      .last_call
209
        je      .last_call
158
        test    eax, eax        ; error
210
        test    eax, eax        ; error
-
 
211
        jz      @f
-
 
212
        call    error_fs
159
;        jne     .fileerror
213
        jmp     close_datacon
-
 
214
      @@:
160
        add     [filestruct.offset], ebx
215
        add     [filestruct.offset], ebx
161
        mov     esi, ebx
216
        mov     esi, ebx
162
        mcall   send, [datasocket], buf_buffer2, , 0
217
        mcall   send, [datasocket], buf_buffer2, , 0
-
 
218
        mov     edx, [filestruct.offset]
-
 
219
        icall   eax, interface_addr, interface.progress
163
        jmp     .stor
220
        jmp     .stor
164
 
221
 
165
  .last_call:
222
  .last_call:
166
        mov     esi, ebx
223
        mov     esi, ebx
167
        mcall   send, [datasocket], buf_buffer2, , 0
224
        mcall   send, [datasocket], buf_buffer2, , 0
-
 
225
        mov     edx, [filestruct.offset]
-
 
226
        icall   eax, interface_addr, interface.progress
168
 
227
 
169
  .done:
228
  .done:
170
        invoke  con_write_asciiz, str_close
229
        icall   eax, interface_addr, interface.print, str_close
171
        mcall   close, [datasocket]
230
        mcall   close, [datasocket]
172
        mov     [operation], OPERATION_NONE
231
        mov     [operation], OPERATION_NONE
173
        jmp     wait_for_servercommand
232
        jmp     wait_for_servercommand
174
 
233
 
175
  .rdir:
234
  .rdir:
176
        ; alloc/realloc memory block to store filenames
235
        ; alloc/realloc memory block to store filenames
177
        mov     ecx, eax                        ; eax is size of buffer received
236
        mov     ecx, eax                        ; eax is size of buffer received
178
        inc     ecx
237
        inc     ecx
179
        add     ecx, [size_fname]               ; added old size to form new required size
238
        add     ecx, [size_fname]               ; added old size to form new required size
180
        mcall   68, 20, , [ptr_fname]           ; realloc
239
        mcall   68, 20, , [ptr_fname]           ; realloc
181
        test    eax, eax
240
        test    eax, eax
182
        je      error_heap
241
        je      error_heap
183
        mov     [ptr_fname], eax                ; eax contains the new block now
242
        mov     [ptr_fname], eax                ; eax contains the new block now
184
        mov     [ptr_queue], eax
243
        mov     [ptr_queue], eax
185
 
244
 
186
        ; copy filenames into fname buffer
245
        ; copy filenames into fname buffer
187
        mov     esi, buf_buffer2
246
        mov     esi, buf_buffer2
188
        mov     edi, eax
247
        mov     edi, eax
189
        add     edi, [size_fname]
248
        add     edi, [size_fname]
190
  .copy_buf:
249
  .copy_buf:
191
        lodsb
250
        lodsb
192
        cmp     al, 13                          ; ignore any carriage return character
251
        cmp     al, 13                          ; ignore any carriage return character
193
        je      .copy_buf
252
        je      .copy_buf
194
        stosb
253
        stosb
195
        cmp     al, 10                          ; linefeed marks end of filename
254
        cmp     al, 10                          ; linefeed marks end of filename
196
        je      @f
255
        je      @f
197
        inc     [queued]
256
        inc     [queued]
198
  @@:
257
  @@:
199
        test    al, al                          ; 0 marks end of buffer
258
        test    al, al                          ; 0 marks end of buffer
200
        jne     .copy_buf
259
        jne     .copy_buf
201
 
260
 
202
        ; All received filenames have been copied, calculate new size of fname buffer
261
        ; All received filenames have been copied, calculate new size of fname buffer
203
        dec     edi                             ; dont count the trailing 0 byte
262
        dec     edi                             ; dont count the trailing 0 byte
204
        sub     edi, [ptr_fname]
263
        sub     edi, [ptr_fname]
205
        mov     [size_fname], edi       
264
        mov     [size_fname], edi       
206
        jmp     data_loop
265
        jmp     data_loop
207
 
266
 
208
 
267
 
209
close_datacon:
268
close_datacon:
210
        cmp     [operation], OPERATION_NONE
269
        cmp     [operation], OPERATION_NONE
211
        je      wait_for_usercommand
270
        je      wait_for_usercommand
212
        invoke  con_write_asciiz, str_close
271
        icall   eax, interface_addr, interface.print, str_close
213
        mcall   close, [datasocket]
272
        mcall   close, [datasocket]
214
        jmp     wait_for_usercommand
273
        jmp     wait_for_usercommand
215
 
274
 
216
 
275
 
217
ascii_dec:
276
ascii_dec:
218
 
277
 
219
        xor     ebx, ebx
278
        xor     ebx, ebx
220
        mov     cl, 4                   ; max length is 3 digits + 1 separator
279
        mov     cl, 4                   ; max length is 3 digits + 1 separator
221
  .loop:
280
  .loop:
222
        lodsb
281
        lodsb
223
        sub     al, '0'
282
        sub     al, '0'
224
        jb      .done
283
        jb      .done
225
        cmp     al, 9
284
        cmp     al, 9
226
        ja      .done
285
        ja      .done
227
        lea     ebx, [ebx*4+ebx]        ; ebx *5
286
        lea     ebx, [ebx*4+ebx]        ; ebx *5
228
        shl     ebx, 1                  ; ebx *2
287
        shl     ebx, 1                  ; ebx *2
229
        add     bl, al
288
        add     bl, al
230
        dec     cl
289
        dec     cl
231
        jnz     .loop
290
        jnz     .loop
232
 
291
 
233
  .done:
292
  .done:
234
        ret
293
        ret