Subversion Repositories Kolibri OS

Rev

Rev 2560 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2560 Rev 2562
Line 33... Line 33...
33
        db 'ABOR'
33
        db 'ABOR'
34
        dd cmdABOR
34
        dd cmdABOR
Line 35... Line 35...
35
 
35
        db 'CWD', 0
36
        db 'CWD', 0
36
        dd cmdCWD
37
        dd cmdCWD
-
 
38
 
37
        db 'DELE'
39
        db 'DELE'
38
        dd cmdDELE
40
        dd cmdDELE
-
 
41
 
39
        db 'LIST'
42
        db 'LIST'
40
        dd cmdLIST
43
        dd cmdLIST
-
 
44
 
41
        db 'NLST'
45
        db 'NLST'
42
        dd cmdNLST
46
        dd cmdNLST
-
 
47
 
43
        db 'NOOP'
48
        db 'NOOP'
44
        dd cmdNOOP
49
        dd cmdNOOP
-
 
50
 
45
        db 'PASS'
51
        db 'PASS'
46
        dd cmdPASS
52
        dd cmdPASS
-
 
53
 
47
        db 'PASV'
54
        db 'PWD', 0     ; Print Working Directory
48
        dd cmdPASV
55
        dd cmdPWD
-
 
-
 
49
        db 'PWD', 0     ; Print Working Directory
-
 
50
        dd cmdPWD
56
 
51
        db 'PORT'
57
        db 'PORT'
52
        dd cmdPORT
58
        dd cmdPORT
-
 
59
 
53
        db 'QUIT'
60
        db 'QUIT'
54
        dd cmdQUIT
61
        dd cmdQUIT
-
 
62
 
55
        db 'RETR'
63
        db 'RETR'
56
        dd cmdRETR
64
        dd cmdRETR
-
 
65
 
57
        db 'STOR'
66
        db 'STOR'
58
        dd cmdSTOR
67
        dd cmdSTOR
-
 
68
 
59
        db 'SYST'
69
        db 'SYST'
60
        dd cmdSYST
70
        dd cmdSYST
-
 
71
 
61
        db 'TYPE'
72
        db 'TYPE'
62
        dd cmdTYPE
73
        dd cmdTYPE
-
 
74
 
63
        db 'USER'
75
        db 'USER'
64
        dd cmdUSER
76
        dd cmdUSER
-
 
77
 
65
        db 'XPWD'
78
        db 'XPWD'
66
        dd cmdPWD
79
        dd cmdPWD
-
 
80
 
67
        db 0            ; end marker
81
        db 0                    ; end marker
68
 
82
 
-
 
83
 
69
 
Line 84... Line 70...
84
align 4
70
align 4
85
cmdABOR:
71
cmdABOR:
Line 100... Line 86...
100
cmdLIST:
86
cmdLIST:
Line 101... Line 87...
101
 
87
 
102
        ret
88
        cmp     [mode], MODE_ACTIVE
Line -... Line 89...
-
 
89
        jne     @f
-
 
90
        mcall   connect, [datasocketnum], datasock, datasock.length
-
 
91
        cmp     eax, -1
-
 
92
        je      .err
-
 
93
  @@:
-
 
94
 
-
 
95
        mcall   send, [socketnum2], str150, str150.length, 0    ; here it comes..
-
 
96
 
-
 
97
        push    FA_READONLY + FA_FOLDER
-
 
98
        push    str_mask
-
 
99
        push    home_dir
-
 
100
        call    [file.find.first]
-
 
101
 
-
 
102
        mov     edi, buffer
-
 
103
        jmp     .parse_file
-
 
104
 
-
 
105
  .checknextfile:
-
 
106
        push    edx
-
 
107
        call    [file.find.next]
-
 
108
 
-
 
109
  .parse_file:
-
 
110
        test    eax, eax
-
 
111
        jz      .done
-
 
112
 
-
 
113
        mov     edx, eax
-
 
114
 
-
 
115
; first, convert the attributes
-
 
116
        test    [eax + FileInfoA.Attributes], FA_FOLDER
-
 
117
        jnz     .folder
-
 
118
 
-
 
119
        test    [eax + FileInfoA.Attributes], FA_READONLY
-
 
120
        jnz     .readonly
-
 
121
 
-
 
122
        mov     eax, '-rw-'
-
 
123
        stosd
-
 
124
        jmp     .attr
-
 
125
 
-
 
126
  .folder:
-
 
127
        mov     eax, 'drwx'
-
 
128
        stosb
-
 
129
        jmp     .attr
-
 
130
 
-
 
131
  .readonly:
-
 
132
        mov     eax, '-r--'
-
 
133
        stosd
-
 
134
 
-
 
135
  .attr:
-
 
136
        mov     eax, 'rw-r'
-
 
137
        stosd
-
 
138
        mov     ax, 'w-'
-
 
139
        stosw
-
 
140
        mov     al, ' '
-
 
141
        stosb
-
 
142
 
-
 
143
; now..
-
 
144
        mov     ax, '1 '
-
 
145
        stosw
-
 
146
 
-
 
147
; now write owner, everything is owned by FTP, woohoo!
-
 
148
        mov     eax, 'FTP '
-
 
149
        stosd
-
 
150
        stosd
-
 
151
 
-
 
152
; now the filesize in ascii
-
 
153
        mov     ebx, dword [edx + FileInfoA.FileSize]
-
 
154
        call    dword_to_ascii
-
 
155
 
-
 
156
        mov     al, ' '
-
 
157
        stosb
-
 
158
 
-
 
159
; then date (month/day/year)
-
 
160
        movzx   ebx, [edx + FileInfoA.DateModify + FileDateTime.month]
-
 
161
        mov     eax, [months + 4*ebx]
-
 
162
        stosd
-
 
163
 
-
 
164
        movzx   ebx, [edx + FileInfoA.DateModify + FileDateTime.day]
-
 
165
        call    dword_to_ascii
-
 
166
 
-
 
167
        mov     al, ' '
-
 
168
        stosb
-
 
169
 
-
 
170
        movzx   ebx, [edx + FileInfoA.DateModify + FileDateTime.year]
-
 
171
        call    dword_to_ascii
-
 
172
 
-
 
173
        mov     al, ' '
-
 
174
        stosb
-
 
175
 
-
 
176
; and last but not least, filename
-
 
177
        lea     esi, [edx + FileInfoA.FileName]
-
 
178
        mov     ecx, 250
-
 
179
  .nameloop:
-
 
180
        lodsb
-
 
181
        test    al, al
-
 
182
        jz      .namedone
-
 
183
        stosb
-
 
184
        loop    .nameloop
-
 
185
 
-
 
186
  .namedone:
-
 
187
        mov     ax, 0x0d0a
-
 
188
        stosw
-
 
189
        jmp     .checknextfile
-
 
190
 
-
 
191
  .done:
-
 
192
        push    edx
-
 
193
        call    [file.find.close]
-
 
194
 
-
 
195
        xor     al, al
-
 
196
        stosb
-
 
197
 
-
 
198
        push    buffer
-
 
199
        call    [con_write_asciiz]
-
 
200
 
-
 
201
        lea     esi, [edi - buffer]
-
 
202
        mcall   send, [datasocketnum], buffer, , 0
-
 
203
 
-
 
204
        mcall   close, [datasocketnum]
-
 
205
 
-
 
206
        cmp     [mode], MODE_PASSIVE_OK
-
 
207
        jne     @f
-
 
208
        mov     [mode], MODE_PASSIVE_WAIT
-
 
209
      @@:
-
 
210
 
-
 
211
        mcall   send, [socketnum2], str226, str226.length, 0    ; transfer ok
-
 
212
 
-
 
213
        ret
-
 
214
 
-
 
215
  .err:
-
 
216
        pushd   0x0c
-
 
217
        call    [con_set_flags]
-
 
218
 
-
 
219
        push    str_err1
-
 
220
        call    [con_write_asciiz]
-
 
221
 
-
 
222
        pushd   0x07
-
 
223
        call    [con_set_flags]
-
 
224
 
-
 
225
        ret
103
 
226
 
Line 104... Line 227...
104
align 4
227
align 4
105
cmdNLST:
228
cmdNLST:
Line 127... Line 250...
127
cmdPASV:
250
cmdPASV:
Line 128... Line 251...
128
 
251
 
129
        mov     [mode], MODE_PASSIVE
252
; 227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)
Line 130... Line -...
130
 
-
 
131
; TODO: open the UDP socket and return our IP + port
-
 
132
 
-
 
133
; 227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)
-
 
134
; where a1.a2.a3.a4 is the IP address and p1*256+p2 is the port number.
253
; where a1.a2.a3.a4 is the IP address and p1*256+p2 is the port number.
135
 
254
 
Line -... Line 255...
-
 
255
        mcall   socket, AF_INET4, SOCK_STREAM, 0
-
 
256
        cmp     eax, -1
-
 
257
;        je      .err
-
 
258
        mov     [passivesocknum], eax
-
 
259
 
-
 
260
        mov     [datasock.port], 2000
-
 
261
        mov     [datasock.ip], 0
-
 
262
 
-
 
263
        mcall   bind, [passivesocknum], datasock, datasock.length
-
 
264
        cmp     eax, -1
-
 
265
        je      bind_err
-
 
266
 
-
 
267
        mcall   listen, [passivesocknum], 1
-
 
268
 
-
 
269
        mov     [mode], MODE_PASSIVE_WAIT
-
 
270
 
-
 
271
        mov     edi, buffer
-
 
272
        mov     eax, '227 '     ; FIXME (now hardcoded to 127.0.0.1:2000)
-
 
273
        stosd
-
 
274
        mov     eax, '(127'
-
 
275
        stosd
-
 
276
        mov     eax, ',0,0'
-
 
277
        stosd
-
 
278
        mov     eax, ',1,7'
-
 
279
        stosd
-
 
280
        mov     eax, ',208'
-
 
281
        stosd
-
 
282
        mov     al, ')'
-
 
283
        stosb
-
 
284
        mov     ax, 0x0d0a
-
 
285
        stosw
-
 
286
        xor     al, al
-
 
287
        stosb
-
 
288
 
-
 
289
        lea     esi, [edi - buffer]
-
 
290
 
-
 
291
        mcall   send, [socketnum2], buffer, ,0
-
 
292
 
136
        ret
293
        ret
Line 137... Line 294...
137
 
294
 
138
align 4
295
align 4
Line 159... Line 316...
159
        mcall   send, [socketnum2], buffer, , 0
316
        mcall   send, [socketnum2], buffer, , 0
160
 
317
 
Line 161... Line 318...
161
        ret
318
;        push    work_dir
Line -... Line 319...
-
 
319
;        push    str_pwd
-
 
320
;        call    [con_printf]
-
 
321
 
-
 
322
        ret
162
 
323
 
Line 163... Line 324...
163
align 4
324
align 4
164
cmdPORT:
325
cmdPORT:
Line 196... Line 357...
196
        mov     [datasock.port], dx
357
        mov     [datasock.port], dx
197
 
358
 
Line 198... Line 359...
198
        mcall   socket, AF_INET4, SOCK_DGRAM, 0
359
        mcall   socket, AF_INET4, SOCK_STREAM, 0
Line 199... Line 360...
199
        cmp     eax, -1
360
        cmp     eax, -1
200
        je      .err
361
        je      .err
201
        mov     [datasocketnum], eax
362
        mov     [datasocketnum], eax
202
 
363
 
Line 203... Line -...
203
        mcall   connect, [datasocketnum], datasock, datasock.length
-
 
204
        cmp     eax, -1
-
 
205
        je      .err
-
 
206
 
-
 
207
        mcall   send, [socketnum2], str225, str225.length, 0
364
        mcall   send, [socketnum2], str225, str225.length, 0
208
        ret
365
        ret
Line 209... Line 366...
209
 
366
 
Line 224... Line 381...
224
cmdRETR:
381
cmdRETR:
Line 225... Line 382...
225
 
382
 
226
        ret
383
;        mcall   connect, [datasocketnum], datasock, datasock.length
Line -... Line 384...
-
 
384
;        cmp     eax, -1
-
 
385
;        je      .err
-
 
386
 
-
 
387
;        push    O_READ
-
 
388
;        push    home_dir
-
 
389
;        call    [file.open]
-
 
390
;        test    eax, eax
-
 
391
;        jz      .cannot_open
-
 
392
;
-
 
393
;        push    BUFFERSIZE
-
 
394
;        push    buffer
-
 
395
;        push    eax
-
 
396
;        call    [file.read]
-
 
397
;        cmp     eax, -1
-
 
398
;        jz      .cannot_open
-
 
399
 
-
 
400
        ret
227
 
401
 
Line 228... Line 402...
228
align 4
402
align 4
229
cmdSTOR:
403
cmdSTOR:
Line 358... Line 532...
358
        ret
532
        ret
Line 359... Line 533...
359
 
533
 
360
 
534
align 4
Line -... Line 535...
-
 
535
dword_to_ascii: ; edi = ptr where to write, ebx is number
-
 
536
 
-
 
537
        mov     eax, '1'
-
 
538
        stosb
-
 
539
 
-
 
540
        ret
-
 
541
 
-
 
542
 
Line 361... Line 543...
361
 
543
 
-
 
544
 
362
 
545
 
363
 
546
str150  db '150 Here it comes...', 13, 10
364
str150  db '150 Here it comes...', 13, 10
547
.length = $ - str150
365
str200  db '200 Command OK.', 13, 10
548
str200  db '200 Command OK.', 13, 10
366
.length = $ - str200
549
.length = $ - str200
Line 374... Line 557...
374
.length = $ - str225
557
.length = $ - str225
375
str226  db '226 Transfer OK, Closing connection', 13, 10
558
str226  db '226 Transfer OK, Closing connection', 13, 10
376
str230  db '230 You are now logged in.', 13, 10
559
.length = $ - str226
377
.length = $ - str230
560
str230  db '230 You are now logged in.', 13, 10
378
str250  db '250 command successful', 13, 10
561
.length = $ - str230
-
 
562
str250  db '250 command successful', 13, 10
379
;str257  db '257 "'
563
;str257  db '257 "'
380
;.length = $ - str257
564
;.length = $ - str257
381
;str257b db '"', 13, 10
565
;str257b db '"', 13, 10
382
;.length = $ - str257b
566
;.length = $ - str257b
383
str331  db '331 Please specify the password.', 13, 10
567
str331  db '331 Please specify the password.', 13, 10