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 |