Rev 4918 | Rev 5011 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4918 | Rev 4922 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | 25 | ||
26 | OPERATION_NONE = 0 |
26 | OPERATION_NONE = 0 |
27 | OPERATION_LIST = 1 |
27 | OPERATION_LIST = 1 |
28 | OPERATION_RETR = 2 |
28 | OPERATION_RETR = 2 |
- | 29 | OPERATION_STOR = 3 |
|
Line 29... | Line 30... | ||
29 | OPERATION_STOR = 3 |
30 | OPERATION_RDIR = 4 |
30 | 31 | ||
31 | use32 |
32 | use32 |
32 | ; standard header |
33 | ; standard header |
33 | db 'MENUET01' ; signature |
34 | db 'MENUET01' ; signature |
34 | dd 1 ; header version |
35 | dd 1 ; header version |
35 | dd start ; entry point |
36 | dd start ; entry point |
36 | dd i_end ; initialized size |
37 | dd i_end ; initialized size |
37 | dd mem+0x1000 ; required memory |
38 | dd mem+0x1000 ; required memory |
38 | dd mem+0x1000 ; stack pointer |
39 | dd mem+0x1000 ; stack pointer |
Line 39... | Line 40... | ||
39 | dd s ; parameters |
40 | dd buf_cmd ; parameters |
40 | dd 0 ; path |
41 | dd 0 ; path |
41 | 42 | ||
Line 47... | Line 48... | ||
47 | 48 | ||
48 | include 'usercommands.inc' |
49 | include 'usercommands.inc' |
Line 49... | Line 50... | ||
49 | include 'servercommands.inc' |
50 | include 'servercommands.inc' |
- | 51 | ||
- | 52 | start: |
|
- | 53 | ; initialize heap for using dynamic blocks |
|
- | 54 | mcall 68,11 |
|
- | 55 | test eax,eax |
|
50 | 56 | je exit2 |
|
51 | start: |
57 | |
52 | ; disable all events except network event |
58 | ; disable all events except network event |
53 | mcall 40, EV_STACK |
59 | mcall 40, EV_STACK |
54 | ; load libraries |
60 | ; load libraries |
55 | stdcall dll.Load, @IMPORT |
61 | stdcall dll.Load, @IMPORT |
56 | test eax, eax |
62 | test eax, eax |
57 | jnz exit |
63 | jnz exit |
58 | ; initialize console |
64 | ; initialize console |
59 | invoke con_start, 1 |
65 | invoke con_start, 1 |
60 | invoke con_init, 80, 25, 80, 250, str_title |
66 | invoke con_init, 80, 25, 80, 250, str_title |
61 | ; Check for parameters, if there are some, resolve the address right away |
67 | ; Check for parameters, if there are some, resolve the address right away |
Line 62... | Line 68... | ||
62 | cmp byte [s], 0 |
68 | cmp byte [buf_cmd], 0 |
63 | jne resolve |
69 | jne resolve |
64 | 70 | ||
Line 69... | Line 75... | ||
69 | invoke con_write_asciiz, str_welcome |
75 | invoke con_write_asciiz, str_welcome |
70 | ; write prompt (in green color) |
76 | ; write prompt (in green color) |
71 | invoke con_set_flags, 0x0a |
77 | invoke con_set_flags, 0x0a |
72 | invoke con_write_asciiz, str_prompt |
78 | invoke con_write_asciiz, str_prompt |
73 | ; read string |
79 | ; read string |
74 | invoke con_gets, s, 256 |
80 | invoke con_gets, buf_cmd, 256 |
75 | ; check for exit |
81 | ; check for exit |
76 | test eax, eax |
82 | test eax, eax |
77 | jz done |
83 | jz done |
78 | cmp byte [s], 10 |
84 | cmp byte [buf_cmd], 10 |
79 | jz done |
85 | jz done |
80 | ; reset color back to grey and print newline |
86 | ; reset color back to grey and print newline |
81 | invoke con_set_flags, 0x07 |
87 | invoke con_set_flags, 0x07 |
82 | invoke con_write_asciiz, str_newline |
88 | invoke con_write_asciiz, str_newline |
Line 83... | Line 89... | ||
83 | 89 | ||
84 | resolve: |
90 | resolve: |
85 | ; delete terminating '\n' |
91 | ; delete terminating '\n' |
86 | mov esi, s |
92 | mov esi, buf_cmd |
87 | @@: |
93 | @@: |
88 | lodsb |
94 | lodsb |
89 | cmp al, 0x20 |
95 | cmp al, 0x20 |
90 | ja @r |
96 | ja @r |
91 | mov byte [esi-1], 0 |
97 | mov byte [esi-1], 0 |
92 | ; Say to the user that we're resolving |
98 | ; Say to the user that we're resolving |
93 | invoke con_write_asciiz, str_resolve |
99 | invoke con_write_asciiz, str_resolve |
94 | invoke con_write_asciiz, s |
100 | invoke con_write_asciiz, buf_cmd |
95 | ; resolve name |
101 | ; resolve name |
96 | push esp ; reserve stack place |
102 | push esp ; reserve stack place |
97 | invoke getaddrinfo, s, 0, 0, esp |
103 | invoke getaddrinfo, buf_cmd, 0, 0, esp |
98 | pop esi |
104 | pop esi |
99 | ; test for error |
105 | ; test for error |
100 | test eax, eax |
106 | test eax, eax |
101 | jnz error_resolve |
107 | jnz error_resolve |
Line 128... | Line 134... | ||
128 | wait_for_servercommand: |
134 | wait_for_servercommand: |
129 | ; Any commands still in our buffer? |
135 | ; Any commands still in our buffer? |
130 | cmp [offset], 0 |
136 | cmp [offset], 0 |
131 | je .receive ; nope, receive some more |
137 | je .receive ; nope, receive some more |
132 | mov esi, [offset] |
138 | mov esi, [offset] |
133 | mov edi, s |
139 | mov edi, buf_cmd |
134 | mov ecx, [size] |
140 | mov ecx, [size] |
135 | add ecx, esi |
141 | add ecx, esi |
136 | jmp .byteloop |
142 | jmp .byteloop |
Line 137... | Line 143... | ||
137 | 143 | ||
Line 143... | Line 149... | ||
143 | .receive_loop: |
149 | .receive_loop: |
144 | mcall 23, 50 ; Wait for event with timeout |
150 | mcall 23, 50 ; Wait for event with timeout |
145 | mcall 26, 9 |
151 | mcall 26, 9 |
146 | cmp eax, [timeout] |
152 | cmp eax, [timeout] |
147 | jge error_timeout |
153 | jge error_timeout |
148 | mcall recv, [socketnum], buffer_ptr, BUFFERSIZE, MSG_DONTWAIT |
154 | mcall recv, [socketnum], buf_buffer1, BUFFERSIZE, MSG_DONTWAIT |
149 | test eax, eax |
155 | test eax, eax |
150 | jnz .got_data |
156 | jnz .got_data |
151 | cmp ebx, EWOULDBLOCK |
157 | cmp ebx, EWOULDBLOCK |
152 | jne error_socket |
158 | jne error_socket |
153 | jmp .receive_loop |
159 | jmp .receive_loop |
Line 154... | Line 160... | ||
154 | 160 | ||
155 | .got_data: |
161 | .got_data: |
Line 156... | Line 162... | ||
156 | mov [offset], 0 |
162 | mov [offset], 0 |
157 | 163 | ||
158 | ; extract commands, copy them to "s" buffer |
164 | ; extract commands, copy them to "buf_cmd" buffer |
159 | lea ecx, [eax + buffer_ptr] ; ecx = end pointer |
165 | lea ecx, [eax + buf_buffer1] ; ecx = end pointer |
160 | mov esi, buffer_ptr ; esi = current pointer |
166 | mov esi, buf_buffer1 ; esi = current pointer |
161 | mov edi, s |
167 | mov edi, buf_cmd |
162 | .byteloop: |
168 | .byteloop: |
163 | cmp esi, ecx |
169 | cmp esi, ecx |
164 | jae wait_for_servercommand |
170 | jae wait_for_servercommand |
Line 177... | Line 183... | ||
177 | mov [size], ecx |
183 | mov [size], ecx |
178 | jmp .go_cmd |
184 | jmp .go_cmd |
179 | .no_more_data: |
185 | .no_more_data: |
180 | mov [offset], 0 |
186 | mov [offset], 0 |
181 | .go_cmd: |
187 | .go_cmd: |
182 | lea ecx, [edi - s] ; length of command |
188 | lea ecx, [edi - buf_cmd] ; length of command |
183 | xor al, al |
189 | xor al, al |
184 | stosb |
190 | stosb |
Line 185... | Line 191... | ||
185 | 191 | ||
186 | invoke con_set_flags, 0x03 ; change color |
192 | invoke con_set_flags, 0x03 ; change color |
187 | invoke con_write_asciiz, s ; print servercommand |
193 | invoke con_write_asciiz, buf_cmd ; print servercommand |
188 | invoke con_write_asciiz, str_newline |
194 | invoke con_write_asciiz, str_newline |
Line 189... | Line 195... | ||
189 | invoke con_set_flags, 0x07 ; reset color |
195 | invoke con_set_flags, 0x07 ; reset color |
Line 190... | Line 196... | ||
190 | 196 | ||
Line -... | Line 197... | ||
- | 197 | jmp server_parser ; parse command |
|
- | 198 | ||
- | 199 | ||
- | 200 | ||
- | 201 | wait_for_usercommand: |
|
191 | jmp server_parser ; parse command |
202 | |
192 | 203 | ; Are there any files in the transfer queue? |
|
Line 193... | Line 204... | ||
193 | 204 | ||
194 | 205 | cmp [queued], 0 |
|
Line 205... | Line 216... | ||
205 | je .needpass |
216 | je .needpass |
Line 206... | Line 217... | ||
206 | 217 | ||
207 | ; write prompt |
218 | ; write prompt |
208 | invoke con_write_asciiz, str_prompt |
219 | invoke con_write_asciiz, str_prompt |
209 | ; read string |
220 | ; read string |
Line 210... | Line 221... | ||
210 | invoke con_gets, s, 256 |
221 | invoke con_gets, buf_cmd, 256 |
211 | 222 | ||
212 | ; print a newline and reset the color back to grey |
223 | ; print a newline and reset the color back to grey |
Line 213... | Line 224... | ||
213 | invoke con_write_asciiz, str_newline |
224 | invoke con_write_asciiz, str_newline |
214 | invoke con_set_flags, 0x07 |
225 | invoke con_set_flags, 0x07 |
Line 215... | Line 226... | ||
215 | 226 | ||
216 | cmp dword[s], "cwd " |
227 | cmp dword[buf_cmd], "cwd " |
Line 217... | Line 228... | ||
217 | je cmd_cwd |
228 | je cmd_cwd |
218 | 229 | ||
Line 219... | Line 230... | ||
219 | cmp dword[s], "mkd " |
230 | cmp dword[buf_cmd], "mkd " |
220 | je cmd_mkd |
231 | je cmd_mkd |
Line 221... | Line 232... | ||
221 | 232 | ||
222 | cmp dword[s], "rmd " |
233 | cmp dword[buf_cmd], "rmd " |
Line -... | Line 234... | ||
- | 234 | je cmd_rmd |
|
- | 235 | ||
- | 236 | cmp dword[buf_cmd], "pwd" + 10 shl 24 |
|
223 | je cmd_rmd |
237 | je cmd_pwd |
224 | 238 | ||
Line 225... | Line 239... | ||
225 | cmp dword[s], "pwd" + 10 shl 24 |
239 | cmp dword[buf_cmd], "bye" + 10 shl 24 |
226 | je cmd_pwd |
240 | je cmd_bye |
Line 227... | Line 241... | ||
227 | 241 | ||
228 | cmp dword[s], "bye" + 10 shl 24 |
242 | cmp dword[buf_cmd], "rdir" |
Line 229... | Line 243... | ||
229 | je cmd_bye |
243 | je cmd_rdir |
230 | 244 | ||
Line 231... | Line 245... | ||
231 | cmp byte[s+4], " " |
245 | cmp byte[buf_cmd+4], " " |
232 | jne @f |
246 | jne @f |
Line 233... | Line 247... | ||
233 | 247 | ||
234 | cmp dword[s], "lcwd" |
248 | cmp dword[buf_cmd], "lcwd" |
235 | je cmd_lcwd |
249 | je cmd_lcwd |
Line 236... | Line 250... | ||
236 | 250 | ||
237 | cmp dword[s], "retr" |
251 | cmp dword[buf_cmd], "retr" |
Line 238... | Line 252... | ||
238 | je cmd_retr |
252 | je cmd_retr |
239 | 253 | ||
Line 240... | Line 254... | ||
240 | cmp dword[s], "stor" |
254 | cmp dword[buf_cmd], "stor" |
241 | je cmd_stor |
255 | je cmd_stor |
Line 242... | Line 256... | ||
242 | 256 | ||
243 | cmp dword[s], "dele" |
257 | cmp dword[buf_cmd], "dele" |
244 | je cmd_dele |
258 | je cmd_dele |
Line 263... | Line 277... | ||
263 | 277 | ||
264 | 278 | ||
265 | .connected: |
279 | .connected: |
266 | ; request username |
280 | ; request username |
267 | invoke con_write_asciiz, str_user |
281 | invoke con_write_asciiz, str_user |
268 | mov dword[s], "USER" |
282 | mov dword[buf_cmd], "USER" |
Line 269... | Line 283... | ||
269 | mov byte[s+4], " " |
283 | mov byte[buf_cmd+4], " " |
270 | jmp .send |
284 | jmp .send |
271 | 285 | ||
272 | 286 | ||
273 | .needpass: |
287 | .needpass: |
274 | ; request password |
288 | ; request password |
Line 275... | Line 289... | ||
275 | invoke con_write_asciiz, str_pass |
289 | invoke con_write_asciiz, str_pass |
276 | mov dword[s], "PASS" |
290 | mov dword[buf_cmd], "PASS" |
277 | mov byte[s+4], " " |
291 | mov byte[buf_cmd+4], " " |
278 | invoke con_set_flags, 0x00 ; black text on black background for password |
292 | invoke con_set_flags, 0x00 ; black text on black background for password |
Line 279... | Line 293... | ||
279 | 293 | ||
280 | .send: |
294 | .send: |
281 | ; read string |
295 | ; read string |
282 | mov esi, s+5 |
296 | mov esi, buf_cmd+5 |
283 | invoke con_gets, esi, 256 |
297 | invoke con_gets, esi, 256 |
284 | 298 | ||
285 | ; find end of string |
299 | ; find end of string |
286 | mov edi, s+5 |
300 | mov edi, buf_cmd+5 |
287 | mov ecx, 256 |
301 | mov ecx, 256 |
Line 288... | Line 302... | ||
288 | xor al, al |
302 | xor al, al |
289 | repne scasb |
303 | repne scasb |
290 | lea esi, [edi-s] |
304 | lea esi, [edi-buf_cmd] |
Line 330... | Line 344... | ||
330 | 344 | ||
331 | error_resolve: |
345 | error_resolve: |
332 | invoke con_set_flags, 0x0c ; print errors in red |
346 | invoke con_set_flags, 0x0c ; print errors in red |
Line -... | Line 347... | ||
- | 347 | invoke con_write_asciiz, str_err_resolve |
|
- | 348 | ||
- | 349 | error_heap: |
|
- | 350 | invoke con_set_flags, 0x0c ; print errors in red |
|
333 | invoke con_write_asciiz, str_err_resolve |
351 | invoke con_write_asciiz, str_err_heap |
334 | 352 | ||
335 | wait_for_keypress: |
353 | wait_for_keypress: |
336 | invoke con_set_flags, 0x07 ; reset color to grey |
354 | invoke con_set_flags, 0x07 ; reset color to grey |
337 | invoke con_write_asciiz, str_push |
355 | invoke con_write_asciiz, str_push |
Line 342... | Line 360... | ||
342 | done: |
360 | done: |
343 | invoke con_exit, 1 |
361 | invoke con_exit, 1 |
Line 344... | Line 362... | ||
344 | 362 | ||
345 | exit: |
363 | exit: |
- | 364 | mcall close, [socketnum] |
|
346 | mcall close, [socketnum] |
365 | exit2: |
Line 347... | Line 366... | ||
347 | mcall -1 |
366 | mcall -1 |
Line 357... | Line 376... | ||
357 | str_prompt db '> ',0 |
376 | str_prompt db '> ',0 |
358 | str_resolve db 'Resolving ',0 |
377 | str_resolve db 'Resolving ',0 |
359 | str_newline db 10,0 |
378 | str_newline db 10,0 |
360 | str_err_resolve db 10,'Name resolution failed.',10,0 |
379 | str_err_resolve db 10,'Name resolution failed.',10,0 |
361 | str_err_socket db 10,'Socket error.',10,0 |
380 | str_err_socket db 10,'Socket error.',10,0 |
- | 381 | str_err_heap db 10,'Cannot allocate memory from heap.',10,0 |
|
362 | str_err_timeout db 10,'Timeout - no response from server.',10,0 |
382 | str_err_timeout db 10,'Timeout - no response from server.',10,0 |
363 | str_err_connect db 10,'Cannot connect to the server.',10,0 |
383 | str_err_connect db 10,'Cannot connect to the server.',10,0 |
364 | str8 db ' (',0 |
384 | str8 db ' (',0 |
365 | str9 db ')',10,0 |
385 | str9 db ')',10,0 |
366 | str_push db 'Push any key to continue.',0 |
386 | str_push db 'Push any key to continue.',0 |
Line 370... | Line 390... | ||
370 | str_pass db "password: ",0 |
390 | str_pass db "password: ",0 |
371 | str_unknown db "Unknown command or insufficient parameters - type help for more information.",10,0 |
391 | str_unknown db "Unknown command or insufficient parameters - type help for more information.",10,0 |
372 | str_lcwd db "Local working directory is now: ",0 |
392 | str_lcwd db "Local working directory is now: ",0 |
Line 373... | Line 393... | ||
373 | 393 | ||
374 | str_open db "opening data socket",10,0 |
394 | str_open db "opening data socket",10,0 |
375 | str_close db "closing data socket",10,0 |
395 | str_close db 10,"closing data socket",10,0 |
Line 376... | Line 396... | ||
376 | str2b db '.',0 |
396 | str_dot db '.',0 |
377 | 397 | ||
378 | str_help db "available commands:",10 |
398 | str_help db "available commands:",10 |
379 | db 10 |
399 | db 10 |
Line 386... | Line 406... | ||
386 | db "mkd |
406 | db "mkd |
387 | db "pwd - print server working directory",10 |
407 | db "pwd - print server working directory",10 |
388 | db "retr |
408 | db "retr |
389 | db "rmd |
409 | db "rmd |
390 | db "stor |
410 | db "stor |
- | 411 | db "rdir - retreive all files from current server dir",10 |
|
391 | db 10,0 |
412 | db 10,0 |
Line -... | Line 413... | ||
- | 413 | ||
Line 392... | Line 414... | ||
392 | 414 | queued dd 0 |
|
Line 393... | Line 415... | ||
393 | 415 | ||
394 | ; FTP strings |
416 | ; FTP strings |
Line 444... | Line 466... | ||
444 | datasocket dd ? |
466 | datasocket dd ? |
445 | offset dd ? |
467 | offset dd ? |
446 | size dd ? |
468 | size dd ? |
447 | operation dd ? |
469 | operation dd ? |
Line -... | Line 470... | ||
- | 470 | ||
- | 471 | size_fname dd ? |
|
448 | 472 | ptr_queue dd ? |
|
- | 473 | timeout dd ? |
|
Line 449... | Line 474... | ||
449 | timeout dd ? |
474 | ptr_fname_start dd ? |
450 | 475 | ||
451 | filestruct: |
476 | filestruct: |
452 | .subfn dd ? |
477 | .subfn dd ? |
453 | .offset dd ? |
478 | .offset dd ? |
454 | dd ? |
479 | dd ? |
455 | .size dd ? |
480 | .size dd ? |
Line 456... | Line 481... | ||
456 | .ptr dd ? |
481 | .ptr dd ? |
457 | .name rb 1024 |
482 | .name rb 1024 |
458 | - | ||
459 | buffer_ptr rb BUFFERSIZE+1 |
483 | |
Line 460... | Line 484... | ||
460 | buffer_ptr2 rb BUFFERSIZE+1 |
484 | buf_buffer1 rb BUFFERSIZE+1 |