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 |