Subversion Repositories Kolibri OS

Rev

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  - make directory on the server",10
406
                db "mkd  - make directory on the server",10
387
                db "pwd             - print server working directory",10
407
                db "pwd             - print server working directory",10
388
                db "retr      - retreive file from the server",10
408
                db "retr      - retreive file from the server",10
389
                db "rmd  - remove directory from the server",10
409
                db "rmd  - remove directory from the server",10
390
                db "stor      - store file on the server",10
410
                db "stor      - store file on the server",10
-
 
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