Subversion Repositories Kolibri OS

Rev

Rev 4655 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4655 Rev 6836
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2010-2014. All rights reserved.    ;;
3
;; Copyright (C) KolibriOS team 2010-2017. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
5
;;                                                                 ;;
6
;;  tftpc.asm - TFTP client for KolibriOS                          ;;
6
;;  tftpc.asm - TFTP client for KolibriOS                          ;;
7
;;                                                                 ;;
7
;;                                                                 ;;
8
;;  Written by hidnplayr@kolibrios.org                             ;;
8
;;  Written by hidnplayr@kolibrios.org                             ;;
9
;;                                                                 ;;
9
;;                                                                 ;;
10
;;          GNU GENERAL PUBLIC LICENSE                             ;;
10
;;          GNU GENERAL PUBLIC LICENSE                             ;;
11
;;             Version 2, June 1991                                ;;
11
;;             Version 2, June 1991                                ;;
12
;;                                                                 ;;
12
;;                                                                 ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14
 
14
 
15
format binary as ""
15
format binary as ""
16
 
16
 
17
__DEBUG__       = 0
17
__DEBUG__       = 0
18
__DEBUG_LEVEL__ = 1
18
__DEBUG_LEVEL__ = 1
19
 
19
 
20
use32
20
use32
21
        org     0x0
21
        org     0x0
22
 
22
 
23
        db      'MENUET01'
23
        db      'MENUET01'
24
        dd      0x1
24
        dd      0x1
25
        dd      START
25
        dd      START
26
        dd      I_END
26
        dd      I_END
27
        dd      IM_END+0x1000
27
        dd      IM_END+0x1000
28
        dd      IM_END+0x1000
28
        dd      IM_END+0x1000
29
        dd      0, 0
29
        dd      0, 0
30
 
30
 
31
include '../../proc32.inc'
31
include '../../proc32.inc'
32
include '../../macros.inc'
32
include '../../macros.inc'
33
include '../../libio.inc'
33
include '../../develop/libraries/libs-dev/libio/libio.inc'
34
include '../../dll.inc'
34
include '../../dll.inc'
35
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
35
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
36
 
36
 
37
include '../../network.inc'
37
include '../../network.inc'
38
include '../../debug-fdo.inc'
38
include '../../debug-fdo.inc'
39
 
39
 
40
TIMEOUT         = 100
40
TIMEOUT         = 100
41
buffer_len      = 4096
41
buffer_len      = 4096
42
 
42
 
43
opcode_rrq      = 1 shl 8
43
opcode_rrq      = 1 shl 8
44
opcode_wrq      = 2 shl 8
44
opcode_wrq      = 2 shl 8
45
opcode_data     = 3 shl 8
45
opcode_data     = 3 shl 8
46
opcode_ack      = 4 shl 8
46
opcode_ack      = 4 shl 8
47
opcode_error    = 5 shl 8
47
opcode_error    = 5 shl 8
48
 
48
 
49
; read/write request packet
49
; read/write request packet
50
;
50
;
51
;  2 bytes     string    1 byte     string   1 byte
51
;  2 bytes     string    1 byte     string   1 byte
52
;  ------------------------------------------------
52
;  ------------------------------------------------
53
; | Opcode |  Filename  |   0  |    Mode    |   0  |
53
; | Opcode |  Filename  |   0  |    Mode    |   0  |
54
;  ------------------------------------------------
54
;  ------------------------------------------------
55
 
55
 
56
; data packet
56
; data packet
57
;
57
;
58
;  2 bytes     2 bytes      n bytes
58
;  2 bytes     2 bytes      n bytes
59
;  ----------------------------------
59
;  ----------------------------------
60
; | Opcode |   Block #  |   Data     |
60
; | Opcode |   Block #  |   Data     |
61
;  ----------------------------------
61
;  ----------------------------------
62
 
62
 
63
; acknowledgement packet
63
; acknowledgement packet
64
;
64
;
65
;  2 bytes     2 bytes
65
;  2 bytes     2 bytes
66
;  ---------------------
66
;  ---------------------
67
; | Opcode |   Block #  |
67
; | Opcode |   Block #  |
68
;  ---------------------
68
;  ---------------------
69
 
69
 
70
; error packet
70
; error packet
71
;
71
;
72
;  2 bytes  2 bytes        string    1 byte
72
;  2 bytes  2 bytes        string    1 byte
73
;  ----------------------------------------
73
;  ----------------------------------------
74
; | Opcode |  ErrorCode |   ErrMsg   |   0  |
74
; | Opcode |  ErrorCode |   ErrMsg   |   0  |
75
;  ----------------------------------------
75
;  ----------------------------------------
76
 
76
 
77
 
77
 
78
START:
78
START:
79
 
79
 
80
        mcall   68, 11
80
        mcall   68, 11
81
 
81
 
82
        stdcall dll.Load, @IMPORT
82
        stdcall dll.Load, @IMPORT
83
        or      eax, eax
83
        or      eax, eax
84
        jnz     exit
84
        jnz     exit
85
 
85
 
86
home:
86
home:
87
        mcall   40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + EVM_STACK
87
        mcall   40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + EVM_STACK
88
 
88
 
89
redraw:
89
redraw:
90
        call    draw_window
90
        call    draw_window
91
 
91
 
92
mainloop:
92
mainloop:
93
        mcall   10
93
        mcall   10
94
        dec     eax
94
        dec     eax
95
        jz      redraw
95
        jz      redraw
96
        dec     eax
96
        dec     eax
97
        jz      key
97
        jz      key
98
        dec     eax
98
        dec     eax
99
        jz      button
99
        jz      button
100
 
100
 
101
        invoke  edit_box_mouse, edit1
101
        invoke  edit_box_mouse, edit1
102
        invoke  edit_box_mouse, edit2
102
        invoke  edit_box_mouse, edit2
103
        invoke  edit_box_mouse, edit3
103
        invoke  edit_box_mouse, edit3
104
        invoke  edit_box_mouse, edit4
104
        invoke  edit_box_mouse, edit4
105
 
105
 
106
        invoke  option_box_mouse, Option_boxs1
106
        invoke  option_box_mouse, Option_boxs1
107
        invoke  option_box_mouse, Option_boxs2
107
        invoke  option_box_mouse, Option_boxs2
108
 
108
 
109
        jmp     mainloop
109
        jmp     mainloop
110
 
110
 
111
button:
111
button:
112
        mcall   17
112
        mcall   17
113
 
113
 
114
        cmp     ah, 0x10        ; connect button
114
        cmp     ah, 0x10        ; connect button
115
        je      start_transfer
115
        je      start_transfer
116
 
116
 
117
        test    ah , ah
117
        test    ah , ah
118
        jz      mainloop
118
        jz      mainloop
119
 
119
 
120
exit:
120
exit:
121
        mcall   -1
121
        mcall   -1
122
key:
122
key:
123
        mcall   2
123
        mcall   2
124
 
124
 
125
        invoke  edit_box_key, edit1
125
        invoke  edit_box_key, edit1
126
        invoke  edit_box_key, edit2
126
        invoke  edit_box_key, edit2
127
        invoke  edit_box_key, edit3
127
        invoke  edit_box_key, edit3
128
        invoke  edit_box_key, edit4
128
        invoke  edit_box_key, edit4
129
 
129
 
130
        jmp     mainloop
130
        jmp     mainloop
131
 
131
 
132
 
132
 
133
draw_window:
133
draw_window:
134
; get system colors
134
; get system colors
135
        mcall   48, 3, sc, 40
135
        mcall   48, 3, sc, 40
136
 
136
 
137
        mcall   12, 1
137
        mcall   12, 1
138
 
138
 
139
        mov     edx, [sc.work]
139
        mov     edx, [sc.work]
140
        or      edx, 0x34000000
140
        or      edx, 0x34000000
141
        xor     esi, esi
141
        xor     esi, esi
142
        mov     edi, str_title
142
        mov     edi, str_title
143
        mcall   0, 50 shl 16 + 400, 30 shl 16 + 180
143
        mcall   0, 50 shl 16 + 400, 30 shl 16 + 180
144
 
144
 
145
        mov     ebx, 35 shl 16 + 10
145
        mov     ebx, 35 shl 16 + 10
146
        mov     ecx, 0x80000000
146
        mov     ecx, 0x80000000
147
        or      ecx, [sc.work_text]
147
        or      ecx, [sc.work_text]
148
        mov     edx, str_server
148
        mov     edx, str_server
149
        mcall   4
149
        mcall   4
150
        mov     ebx, 5 shl 16 + 30
150
        mov     ebx, 5 shl 16 + 30
151
        mov     edx, str_source
151
        mov     edx, str_source
152
        mcall
152
        mcall
153
        mov     ebx, 11 shl 16 + 50
153
        mov     ebx, 11 shl 16 + 50
154
        mov     edx, str_destination
154
        mov     edx, str_destination
155
        mcall
155
        mcall
156
        mov     ebx, 47 shl 16 + 72
156
        mov     ebx, 47 shl 16 + 72
157
        mov     edx, str_mode
157
        mov     edx, str_mode
158
        mcall
158
        mcall
159
        mov     ebx, 160 shl 16 + 72
159
        mov     ebx, 160 shl 16 + 72
160
        mov     edx, str_method
160
        mov     edx, str_method
161
        mcall
161
        mcall
162
        mov     ebx, 270 shl 16 + 72
162
        mov     ebx, 270 shl 16 + 72
163
        mov     edx, str_blocksize
163
        mov     edx, str_blocksize
164
        mcall
164
        mcall
165
 
165
 
166
        invoke  edit_box_draw, edit1
166
        invoke  edit_box_draw, edit1
167
        invoke  edit_box_draw, edit2
167
        invoke  edit_box_draw, edit2
168
        invoke  edit_box_draw, edit3
168
        invoke  edit_box_draw, edit3
169
        invoke  edit_box_draw, edit4
169
        invoke  edit_box_draw, edit4
170
 
170
 
171
        invoke  option_box_draw, Option_boxs1
171
        invoke  option_box_draw, Option_boxs1
172
        invoke  option_box_draw, Option_boxs2
172
        invoke  option_box_draw, Option_boxs2
173
 
173
 
174
        mov     esi, [sc.work_button]
174
        mov     esi, [sc.work_button]
175
        mcall   8, 210 shl 16 + 170, 105 shl 16 + 16, 0x10
175
        mcall   8, 210 shl 16 + 170, 105 shl 16 + 16, 0x10
176
 
176
 
177
        mcall   38, 10 shl 16 + 380, 130 shl 16 + 130, [sc.work_graph]
177
        mcall   38, 10 shl 16 + 380, 130 shl 16 + 130, [sc.work_graph]
178
 
178
 
179
        cmp     [errormsg], 0
179
        cmp     [errormsg], 0
180
        je      .no_error
180
        je      .no_error
181
 
181
 
182
        mov     ecx, 0x80000000
182
        mov     ecx, 0x80000000
183
        or      ecx, [sc.work_text]
183
        or      ecx, [sc.work_text]
184
        mcall   4, 20 shl 16 + 137, , [errormsg]
184
        mcall   4, 20 shl 16 + 137, , [errormsg]
185
        mcall   12, 2
185
        mcall   12, 2
186
        jmp     .draw_btn
186
        jmp     .draw_btn
187
 
187
 
188
  .no_error:
188
  .no_error:
189
        mov     ecx, 0x80000000
189
        mov     ecx, 0x80000000
190
        or      ecx, [sc.work_text]
190
        or      ecx, [sc.work_text]
191
        mcall   4, 350 shl 16 + 137, , str_kb_s
191
        mcall   4, 350 shl 16 + 137, , str_kb_s
192
        mcall   4, 50 shl 16 + 137, , str_complete
192
        mcall   4, 50 shl 16 + 137, , str_complete
193
        mcall   47, 1 shl 31 + 7 shl 16 + 1, kbps, 305 shl 16 + 137, [sc.work_text]
193
        mcall   47, 1 shl 31 + 7 shl 16 + 1, kbps, 305 shl 16 + 137, [sc.work_text]
194
        mcall   47, 1 shl 31 + 3 shl 16 + 1, done, 25 shl 16 + 137
194
        mcall   47, 1 shl 31 + 3 shl 16 + 1, done, 25 shl 16 + 137
195
 
195
 
196
  .draw_btn:
196
  .draw_btn:
197
        cmp     [socketnum], 0
197
        cmp     [socketnum], 0
198
        je      .no_transfer
198
        je      .no_transfer
199
 
199
 
200
        mov     ecx, 0x80000000
200
        mov     ecx, 0x80000000
201
        or      ecx, [sc.work_button_text]
201
        or      ecx, [sc.work_button_text]
202
        mcall   4, 270 shl 16 + 110, , str_stop
202
        mcall   4, 270 shl 16 + 110, , str_stop
203
 
203
 
204
        mcall   12, 2
204
        mcall   12, 2
205
        ret
205
        ret
206
 
206
 
207
  .no_transfer:
207
  .no_transfer:
208
        mov     ecx, 0x80000000
208
        mov     ecx, 0x80000000
209
        or      ecx, [sc.work_button_text]
209
        or      ecx, [sc.work_button_text]
210
        mcall   4, 260 shl 16 + 110, , str_transfer
210
        mcall   4, 260 shl 16 + 110, , str_transfer
211
 
211
 
212
        mcall   12, 2
212
        mcall   12, 2
213
        ret
213
        ret
214
 
214
 
215
 
215
 
216
 
216
 
217
start_transfer:
217
start_transfer:
218
 
218
 
219
; resolve the hostname
219
; resolve the hostname
220
        mov     [errormsg], str_err_resolve
220
        mov     [errormsg], str_err_resolve
221
 
221
 
222
        push    esp     ; reserve stack place
222
        push    esp     ; reserve stack place
223
 
223
 
224
        push    esp     ; fourth parameter
224
        push    esp     ; fourth parameter
225
        push    0       ; third parameter
225
        push    0       ; third parameter
226
        push    0       ; second parameter
226
        push    0       ; second parameter
227
        push    dword SRV     ; first parameter
227
        push    dword SRV     ; first parameter
228
        call    [getaddrinfo]
228
        call    [getaddrinfo]
229
 
229
 
230
        pop     esi
230
        pop     esi
231
 
231
 
232
        ; test for error
232
        ; test for error
233
        test    eax, eax
233
        test    eax, eax
234
        jnz     home
234
        jnz     home
235
 
235
 
236
        mov     eax, [esi + addrinfo.ai_addr]
236
        mov     eax, [esi + addrinfo.ai_addr]
237
        mov     eax, [eax + sockaddr_in.sin_addr]
237
        mov     eax, [eax + sockaddr_in.sin_addr]
238
        mov     [sockaddr.ip], eax
238
        mov     [sockaddr.ip], eax
239
 
239
 
240
        ; free allocated memory
240
        ; free allocated memory
241
        push    esi
241
        push    esi
242
        call    [freeaddrinfo]
242
        call    [freeaddrinfo]
243
 
243
 
244
; Open a socket & connect to server
244
; Open a socket & connect to server
245
        mov     [errormsg], str_err_socket
245
        mov     [errormsg], str_err_socket
246
 
246
 
247
        mcall   socket, AF_INET4, SOCK_DGRAM, 0
247
        mcall   socket, AF_INET4, SOCK_DGRAM, 0
248
        cmp     eax, -1
248
        cmp     eax, -1
249
        je      home
249
        je      home
250
        mov     [socketnum], eax
250
        mov     [socketnum], eax
251
 
251
 
252
        mcall   connect, [socketnum], sockaddr, sockaddr_len
252
        mcall   connect, [socketnum], sockaddr, sockaddr_len
253
        cmp     eax, -1
253
        cmp     eax, -1
254
        je      home
254
        je      home
255
 
255
 
256
; Create the read/write request packet
256
; Create the read/write request packet
257
        mov     word[buffer], opcode_rrq
257
        mov     word[buffer], opcode_rrq
258
        cmp     [option_group2], op3
258
        cmp     [option_group2], op3
259
        je      @f
259
        je      @f
260
        mov     word[buffer], opcode_wrq
260
        mov     word[buffer], opcode_wrq
261
      @@:
261
      @@:
262
 
262
 
263
; Copy in the remote filename (asciiz)
263
; Copy in the remote filename (asciiz)
264
        xor     al, al
264
        xor     al, al
265
        mov     edi, remote_addr
265
        mov     edi, remote_addr
266
        mov     ecx, 255
266
        mov     ecx, 255
267
        repnz   scasb
267
        repnz   scasb
268
        lea     ecx, [edi - remote_addr - 1]
268
        lea     ecx, [edi - remote_addr - 1]
269
        mov     esi, remote_addr
269
        mov     esi, remote_addr
270
        mov     edi, buffer+2
270
        mov     edi, buffer+2
271
        rep     movsb
271
        rep     movsb
272
        stosb
272
        stosb
273
 
273
 
274
; Append the data type (asciiz)
274
; Append the data type (asciiz)
275
        cmp     [option_group1], op1
275
        cmp     [option_group1], op1
276
        je      .ascii
276
        je      .ascii
277
        mov     esi, octet
277
        mov     esi, octet
278
        movsd
278
        movsd
279
        movsb
279
        movsb
280
        jmp     .send_request
280
        jmp     .send_request
281
 
281
 
282
      .ascii:
282
      .ascii:
283
        mov     esi, netascii
283
        mov     esi, netascii
284
        movsd
284
        movsd
285
        movsd
285
        movsd
286
 
286
 
287
; Send the request to the server
287
; Send the request to the server
288
      .send_request:
288
      .send_request:
289
        xor     al, al
289
        xor     al, al
290
        stosb
290
        stosb
291
        lea     esi, [edi - buffer]
291
        lea     esi, [edi - buffer]
292
        xor     edi, edi
292
        xor     edi, edi
293
        mcall   send, [socketnum], buffer
293
        mcall   send, [socketnum], buffer
294
        cmp     eax, -1
294
        cmp     eax, -1
295
        je      home
295
        je      home
296
 
296
 
297
; Jump to send/receive code
297
; Jump to send/receive code
298
        cmp     word[buffer], opcode_wrq
298
        cmp     word[buffer], opcode_wrq
299
        je      tftp_send
299
        je      tftp_send
300
 
300
 
301
 
301
 
302
tftp_receive:
302
tftp_receive:
303
 
303
 
304
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
304
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
305
        mov     [last_ack], 0
305
        mov     [last_ack], 0
306
        mov     [errormsg], 0
306
        mov     [errormsg], 0
307
 
307
 
308
        call    draw_window
308
        call    draw_window
309
 
309
 
310
; Open/create local file
310
; Open/create local file
311
        mov     [file_struct.subfn], 2
311
        mov     [file_struct.subfn], 2
312
        mov     [file_struct.offset], 0
312
        mov     [file_struct.offset], 0
313
        mov     [file_struct.size], 0
313
        mov     [file_struct.size], 0
314
        mcall   70, file_struct
314
        mcall   70, file_struct
315
 
315
 
316
; Truncate it to 0 bytes
316
; Truncate it to 0 bytes
317
        mov     [file_struct.subfn], 4
317
        mov     [file_struct.subfn], 4
318
        mcall   70, file_struct
318
        mcall   70, file_struct
319
 
319
 
320
; Set parameters for writing to file
320
; Set parameters for writing to file
321
        mov     [file_struct.subfn], 3
321
        mov     [file_struct.subfn], 3
322
        mov     [file_struct.data], buffer + 4
322
        mov     [file_struct.data], buffer + 4
323
 
323
 
324
  .loop:
324
  .loop:
325
        mcall   23, TIMEOUT
325
        mcall   23, TIMEOUT
326
        dec     eax
326
        dec     eax
327
        jz      .red
327
        jz      .red
328
        dec     eax
328
        dec     eax
329
        dec     eax
329
        dec     eax
330
        jz      .button
330
        jz      .button
331
 
331
 
332
        mcall   recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT     ; receive data
332
        mcall   recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT     ; receive data
333
        cmp     eax, -1
333
        cmp     eax, -1
334
        je      .loop
334
        je      .loop
335
 
335
 
336
        DEBUGF  1, "Got %u bytes\n", eax
336
        DEBUGF  1, "Got %u bytes\n", eax
337
        cmp     word[buffer], opcode_error
337
        cmp     word[buffer], opcode_error
338
        je      tftp_error
338
        je      tftp_error
339
        cmp     word[buffer], opcode_data
339
        cmp     word[buffer], opcode_data
340
        jne     .error
340
        jne     .error
341
 
341
 
342
; Verify ACK number
342
; Verify ACK number
343
        mov     bx, word[buffer + 2]
343
        mov     bx, word[buffer + 2]
344
        rol     bx, 8
344
        rol     bx, 8
345
        cmp     [last_ack], 0
345
        cmp     [last_ack], 0
346
        je      @f
346
        je      @f
347
        cmp     [last_ack], bx
347
        cmp     [last_ack], bx
348
        jne     .packet_got_lost
348
        jne     .packet_got_lost
349
        inc     bx
349
        inc     bx
350
      @@:
350
      @@:
351
        mov     [last_ack], bx
351
        mov     [last_ack], bx
352
 
352
 
353
; Write to the file
353
; Write to the file
354
        lea     ecx, [eax - 4]
354
        lea     ecx, [eax - 4]
355
        mov     [file_struct.size], ecx
355
        mov     [file_struct.size], ecx
356
        mcall   70, file_struct
356
        mcall   70, file_struct
357
        add     [file_struct.offset], ecx
357
        add     [file_struct.offset], ecx
358
 
358
 
359
; Send ACK
359
; Send ACK
360
        mov     word[buffer], opcode_ack
360
        mov     word[buffer], opcode_ack
361
        mcall   send, [socketnum], buffer, 4, 0
361
        mcall   send, [socketnum], buffer, 4, 0
362
        jmp     .loop
362
        jmp     .loop
363
 
363
 
364
  .packet_got_lost:
364
  .packet_got_lost:
365
        ;TODO
365
        ;TODO
366
        jmp     .loop
366
        jmp     .loop
367
 
367
 
368
  .red:
368
  .red:
369
        call    draw_window
369
        call    draw_window
370
        jmp     .loop
370
        jmp     .loop
371
 
371
 
372
  .button:
372
  .button:
373
        mcall   17
373
        mcall   17
374
        cmp     ah, 1
374
        cmp     ah, 1
375
        jne     .abort
375
        jne     .abort
376
 
376
 
377
        mcall   close, [socketnum]
377
        mcall   close, [socketnum]
378
        mcall   -1
378
        mcall   -1
379
 
379
 
380
  .abort:
380
  .abort:
381
        mcall   close, [socketnum]
381
        mcall   close, [socketnum]
382
        xor     eax, eax
382
        xor     eax, eax
383
        mov     [socketnum], eax
383
        mov     [socketnum], eax
384
        mov     [errormsg], str_abort
384
        mov     [errormsg], str_abort
385
        jmp     home
385
        jmp     home
386
 
386
 
387
  .error:
387
  .error:
388
        mcall   close, [socketnum]
388
        mcall   close, [socketnum]
389
        xor     eax, eax
389
        xor     eax, eax
390
        mov     [socketnum], eax
390
        mov     [socketnum], eax
391
        mov     [errormsg], str_err_unexp
391
        mov     [errormsg], str_err_unexp
392
        jmp     home
392
        jmp     home
393
 
393
 
394
  .done:
394
  .done:
395
        mcall   close, [socketnum]
395
        mcall   close, [socketnum]
396
        xor     eax, eax
396
        xor     eax, eax
397
        mov     [socketnum], eax
397
        mov     [socketnum], eax
398
        mov     [errormsg], str_success
398
        mov     [errormsg], str_success
399
        jmp     home
399
        jmp     home
400
 
400
 
401
 
401
 
402
 
402
 
403
tftp_send:
403
tftp_send:
404
 
404
 
405
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
405
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
406
        mov     [last_ack], 0
406
        mov     [last_ack], 0
407
        mov     [errormsg], 0
407
        mov     [errormsg], 0
408
 
408
 
409
        call    draw_window
409
        call    draw_window
410
 
410
 
411
        mov     [file_struct.subfn], 0
411
        mov     [file_struct.subfn], 0
412
        mov     [file_struct.offset], 0
412
        mov     [file_struct.offset], 0
413
        mov     [file_struct.size], buffer_len
413
        mov     [file_struct.size], buffer_len
414
        mov     [file_struct.data], buffer + 4
414
        mov     [file_struct.data], buffer + 4
415
 
415
 
416
  .next:
416
  .next:
417
        mov     edi, buffer
417
        mov     edi, buffer
418
        mov     ax, opcode_data
418
        mov     ax, opcode_data
419
        stosw
419
        stosw
420
        mov     ax, [last_ack]
420
        mov     ax, [last_ack]
421
        stosw
421
        stosw
422
 
422
 
423
        mcall   70, file_struct
423
        mcall   70, file_struct
424
        test    eax, eax
424
        test    eax, eax
425
;        jnz     .done
425
;        jnz     .done
426
        mov     [size], ebx
426
        mov     [size], ebx
427
 
427
 
428
  .resend:
428
  .resend:
429
        mov     ebx, [size]
429
        mov     ebx, [size]
430
        lea     esi, [ebx + 4]
430
        lea     esi, [ebx + 4]
431
        xor     edi, edi
431
        xor     edi, edi
432
        mcall   send, [socketnum], buffer
432
        mcall   send, [socketnum], buffer
433
 
433
 
434
  .loop:
434
  .loop:
435
        mcall   23, TIMEOUT
435
        mcall   23, TIMEOUT
436
        dec     eax
436
        dec     eax
437
        jz      .red
437
        jz      .red
438
        dec     eax
438
        dec     eax
439
        dec     eax
439
        dec     eax
440
        jz      .button
440
        jz      .button
441
 
441
 
442
        mcall   recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT
442
        mcall   recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT
443
        cmp     eax, -1
443
        cmp     eax, -1
444
        je      .loop
444
        je      .loop
445
 
445
 
446
        cmp     word[buffer], opcode_error
446
        cmp     word[buffer], opcode_error
447
        je      tftp_error
447
        je      tftp_error
448
        cmp     word[buffer], opcode_ack
448
        cmp     word[buffer], opcode_ack
449
        jne     .error
449
        jne     .error
450
 
450
 
451
        mov     ax, [last_ack]
451
        mov     ax, [last_ack]
452
        cmp     word[buffer+2], ax
452
        cmp     word[buffer+2], ax
453
        jne     .resend
453
        jne     .resend
454
 
454
 
455
        mov     eax, [size]
455
        mov     eax, [size]
456
        cmp     eax, buffer_len
456
        cmp     eax, buffer_len
457
        jb      .done
457
        jb      .done
458
        add     [file_struct.offset], eax
458
        add     [file_struct.offset], eax
459
 
459
 
460
        inc     [last_ack]
460
        inc     [last_ack]
461
        jmp     .next
461
        jmp     .next
462
 
462
 
463
  .red:
463
  .red:
464
        call    draw_window
464
        call    draw_window
465
        jmp     .loop
465
        jmp     .loop
466
 
466
 
467
  .button:
467
  .button:
468
        mcall   17
468
        mcall   17
469
        cmp     ah, 1
469
        cmp     ah, 1
470
        jne     .abort
470
        jne     .abort
471
 
471
 
472
        mcall   close, [socketnum]
472
        mcall   close, [socketnum]
473
        mcall   -1
473
        mcall   -1
474
 
474
 
475
  .abort:
475
  .abort:
476
        mcall   close, [socketnum]
476
        mcall   close, [socketnum]
477
        xor     eax, eax
477
        xor     eax, eax
478
        mov     [socketnum], eax
478
        mov     [socketnum], eax
479
        mov     [errormsg], str_abort
479
        mov     [errormsg], str_abort
480
        jmp     home
480
        jmp     home
481
 
481
 
482
  .error:
482
  .error:
483
        mcall   close, [socketnum]
483
        mcall   close, [socketnum]
484
        xor     eax, eax
484
        xor     eax, eax
485
        mov     [socketnum], eax
485
        mov     [socketnum], eax
486
        mov     [errormsg], str_err_unexp
486
        mov     [errormsg], str_err_unexp
487
        jmp     home
487
        jmp     home
488
 
488
 
489
  .done:
489
  .done:
490
        mcall   close, [socketnum]
490
        mcall   close, [socketnum]
491
        xor     eax, eax
491
        xor     eax, eax
492
        mov     [socketnum], eax
492
        mov     [socketnum], eax
493
        mov     [errormsg], str_success
493
        mov     [errormsg], str_success
494
        jmp     home
494
        jmp     home
495
 
495
 
496
 
496
 
497
 
497
 
498
tftp_error:
498
tftp_error:
499
        mcall   close, [socketnum]
499
        mcall   close, [socketnum]
500
        xor     eax, eax
500
        xor     eax, eax
501
        mov     [socketnum], eax
501
        mov     [socketnum], eax
502
 
502
 
503
        mov     ax, word[buffer+2]
503
        mov     ax, word[buffer+2]
504
        xchg    al, ah
504
        xchg    al, ah
505
 
505
 
506
        test    ax, ax
506
        test    ax, ax
507
        jz      .0
507
        jz      .0
508
        dec     ax
508
        dec     ax
509
        jz      .1
509
        jz      .1
510
        dec     ax
510
        dec     ax
511
        jz      .2
511
        jz      .2
512
        dec     ax
512
        dec     ax
513
        jz      .3
513
        jz      .3
514
        dec     ax
514
        dec     ax
515
        jz      .4
515
        jz      .4
516
        dec     ax
516
        dec     ax
517
        jz      .5
517
        jz      .5
518
        dec     ax
518
        dec     ax
519
        jz      .6
519
        jz      .6
520
        dec     ax
520
        dec     ax
521
        jz      .7
521
        jz      .7
522
 
522
 
523
  .0:
523
  .0:
524
        mov     [errormsg], str_error.0
524
        mov     [errormsg], str_error.0
525
        jmp     home
525
        jmp     home
526
  .1:
526
  .1:
527
        mov     [errormsg], str_error.1
527
        mov     [errormsg], str_error.1
528
        jmp     redraw
528
        jmp     redraw
529
  .2:
529
  .2:
530
        mov     [errormsg], str_error.2
530
        mov     [errormsg], str_error.2
531
        jmp     home
531
        jmp     home
532
  .3:
532
  .3:
533
        mov     [errormsg], str_error.3
533
        mov     [errormsg], str_error.3
534
        jmp     home
534
        jmp     home
535
  .4:
535
  .4:
536
        mov     [errormsg], str_error.4
536
        mov     [errormsg], str_error.4
537
        jmp     home
537
        jmp     home
538
  .5:
538
  .5:
539
        mov     [errormsg], str_error.5
539
        mov     [errormsg], str_error.5
540
        jmp     home
540
        jmp     home
541
  .6:
541
  .6:
542
        mov     [errormsg], str_error.6
542
        mov     [errormsg], str_error.6
543
        jmp     home
543
        jmp     home
544
  .7:
544
  .7:
545
        mov     [errormsg], str_error.7
545
        mov     [errormsg], str_error.7
546
        jmp     home
546
        jmp     home
547
 
547
 
548
;-------------------------
548
;-------------------------
549
; DATA
549
; DATA
550
 
550
 
551
socketnum       dd 0
551
socketnum       dd 0
552
kbps            dd 0
552
kbps            dd 0
553
done            dd 0
553
done            dd 0
554
errormsg        dd str_welcome
554
errormsg        dd str_welcome
555
 
555
 
556
sockaddr:
556
sockaddr:
557
                dw AF_INET4
557
                dw AF_INET4
558
                dw 0x4500       ; 69
558
                dw 0x4500       ; 69
559
  .ip           dd ?
559
  .ip           dd ?
560
sockaddr_len = $ - sockaddr
560
sockaddr_len = $ - sockaddr
561
 
561
 
562
file_struct:
562
file_struct:
563
  .subfn        dd ?
563
  .subfn        dd ?
564
  .offset       dd ?
564
  .offset       dd ?
565
                dd 0
565
                dd 0
566
  .size         dd ?
566
  .size         dd ?
567
  .data         dd ?
567
  .data         dd ?
568
                db 0
568
                db 0
569
  .filename     dd local_addr
569
  .filename     dd local_addr
570
 
570
 
571
align 16
571
align 16
572
@IMPORT:
572
@IMPORT:
573
 
573
 
574
library box_lib         , 'box_lib.obj'         ,\
574
library box_lib         , 'box_lib.obj'         ,\
575
        network         , 'network.obj'
575
        network         , 'network.obj'
576
 
576
 
577
import  box_lib                                 ,\
577
import  box_lib                                 ,\
578
        edit_box_draw   , 'edit_box'            ,\
578
        edit_box_draw   , 'edit_box'            ,\
579
        edit_box_key    , 'edit_box_key'        ,\
579
        edit_box_key    , 'edit_box_key'        ,\
580
        edit_box_mouse  , 'edit_box_mouse'      ,\
580
        edit_box_mouse  , 'edit_box_mouse'      ,\
581
        version_ed      , 'version_ed'          ,\
581
        version_ed      , 'version_ed'          ,\
582
        init_checkbox   , 'init_checkbox2'      ,\
582
        init_checkbox   , 'init_checkbox2'      ,\
583
        check_box_draw  , 'check_box_draw2'     ,\
583
        check_box_draw  , 'check_box_draw2'     ,\
584
        check_box_mouse , 'check_box_mouse2'    ,\
584
        check_box_mouse , 'check_box_mouse2'    ,\
585
        version_ch      , 'version_ch2'         ,\
585
        version_ch      , 'version_ch2'         ,\
586
        option_box_draw , 'option_box_draw'     ,\
586
        option_box_draw , 'option_box_draw'     ,\
587
        option_box_mouse, 'option_box_mouse'    ,\
587
        option_box_mouse, 'option_box_mouse'    ,\
588
        version_op      , 'version_op'
588
        version_op      , 'version_op'
589
 
589
 
590
import  network                                 ,\
590
import  network                                 ,\
591
        inet_ntoa       , 'inet_ntoa'           ,\
591
        inet_ntoa       , 'inet_ntoa'           ,\
592
        getaddrinfo     , 'getaddrinfo'         ,\
592
        getaddrinfo     , 'getaddrinfo'         ,\
593
        freeaddrinfo    , 'freeaddrinfo'
593
        freeaddrinfo    , 'freeaddrinfo'
594
 
594
 
595
 
595
 
596
edit1 edit_box 300, 80, 5, 0xffffff, 0x6f9480, 0, 0, 0, 255, SRV, mouse_dd, ed_focus, 13, 13
596
edit1 edit_box 300, 80, 5, 0xffffff, 0x6f9480, 0, 0, 0, 255, SRV, mouse_dd, ed_focus, 13, 13
597
edit2 edit_box 300, 80, 25, 0xffffff, 0x6f9480, 0, 0, 0, 255, remote_addr, mouse_dd, 0, 4, 4
597
edit2 edit_box 300, 80, 25, 0xffffff, 0x6f9480, 0, 0, 0, 255, remote_addr, mouse_dd, 0, 4, 4
598
edit3 edit_box 300, 80, 45, 0xffffff, 0x6f9480, 0, 0, 0, 255, local_addr, mouse_dd, 0, 12, 12
598
edit3 edit_box 300, 80, 45, 0xffffff, 0x6f9480, 0, 0, 0, 255, local_addr, mouse_dd, 0, 12, 12
599
edit4 edit_box 40, 340, 68, 0xffffff, 0x6f9480, 0, 0, 0, 5, BLK, mouse_dd, ed_figure_only, 3, 3
599
edit4 edit_box 40, 340, 68, 0xffffff, 0x6f9480, 0, 0, 0, 5, BLK, mouse_dd, ed_figure_only, 3, 3
600
 
600
 
601
op1 option_box option_group1, 80, 68, 6, 12, 0xffffff, 0, 0, netascii, octet-netascii
601
op1 option_box option_group1, 80, 68, 6, 12, 0xffffff, 0, 0, netascii, octet-netascii
602
op2 option_box option_group1, 80, 85, 6, 12, 0xFFFFFF, 0, 0, octet, get-octet
602
op2 option_box option_group1, 80, 85, 6, 12, 0xFFFFFF, 0, 0, octet, get-octet
603
 
603
 
604
op3 option_box option_group2, 210, 68, 6, 12, 0xffffff, 0, 0, get, put-get
604
op3 option_box option_group2, 210, 68, 6, 12, 0xffffff, 0, 0, get, put-get
605
op4 option_box option_group2, 210, 85, 6, 12, 0xFFFFFF, 0, 0, put, BLK-put
605
op4 option_box option_group2, 210, 85, 6, 12, 0xFFFFFF, 0, 0, put, BLK-put
606
 
606
 
607
option_group1   dd op1
607
option_group1   dd op1
608
option_group2   dd op3
608
option_group2   dd op3
609
Option_boxs1    dd op1, op2, 0
609
Option_boxs1    dd op1, op2, 0
610
Option_boxs2    dd op3, op4, 0
610
Option_boxs2    dd op3, op4, 0
611
 
611
 
612
str_title       db 'TFTP client', 0
612
str_title       db 'TFTP client', 0
613
str_server      db 'Server:', 0
613
str_server      db 'Server:', 0
614
str_source      db 'Remote file:', 0
614
str_source      db 'Remote file:', 0
615
str_destination db 'Local file:', 0
615
str_destination db 'Local file:', 0
616
str_mode        db 'Mode:', 0
616
str_mode        db 'Mode:', 0
617
str_method      db 'Method:', 0
617
str_method      db 'Method:', 0
618
str_blocksize   db 'Blocksize:', 0
618
str_blocksize   db 'Blocksize:', 0
619
str_kb_s        db 'kB/s', 0
619
str_kb_s        db 'kB/s', 0
620
str_complete    db '% complete', 0
620
str_complete    db '% complete', 0
621
str_transfer    db 'Transfer', 0
621
str_transfer    db 'Transfer', 0
622
str_stop        db 'Stop', 0
622
str_stop        db 'Stop', 0
623
 
623
 
624
str_error:
624
str_error:
625
.0              db 'Error.', 0                      ; not further defined error
625
.0              db 'Error.', 0                      ; not further defined error
626
.1              db 'File not found.', 0
626
.1              db 'File not found.', 0
627
.2              db 'Access violation.', 0
627
.2              db 'Access violation.', 0
628
.3              db 'Disk full or allocation exceeded.', 0
628
.3              db 'Disk full or allocation exceeded.', 0
629
.4              db 'Illegal TFTP operation.', 0
629
.4              db 'Illegal TFTP operation.', 0
630
.5              db 'Unknown transfer ID.', 0
630
.5              db 'Unknown transfer ID.', 0
631
.6              db 'File already exists.', 0
631
.6              db 'File already exists.', 0
632
.7              db 'No such user.', 0
632
.7              db 'No such user.', 0
633
 
633
 
634
str_welcome     db 'Welcome.', 0
634
str_welcome     db 'Welcome.', 0
635
str_err_resolve db 'Unable to resolve server address.', 0
635
str_err_resolve db 'Unable to resolve server address.', 0
636
str_err_socket  db 'Socket error.', 0
636
str_err_socket  db 'Socket error.', 0
637
str_err_unexp   db 'Unexpected command from server.', 0
637
str_err_unexp   db 'Unexpected command from server.', 0
638
str_success     db 'Operation completed successfully.', 0
638
str_success     db 'Operation completed successfully.', 0
639
str_abort       db 'Operation aborted by user.', 0
639
str_abort       db 'Operation aborted by user.', 0
640
 
640
 
641
netascii        db 'NetASCII'
641
netascii        db 'NetASCII'
642
octet           db 'Octet'
642
octet           db 'Octet'
643
get             db 'GET'
643
get             db 'GET'
644
put             db 'PUT'
644
put             db 'PUT'
645
 
645
 
646
BLK             db "512", 0, 0, 0
646
BLK             db "512", 0, 0, 0
647
 
647
 
648
SRV             db "192.168.1.115", 0
648
SRV             db "192.168.1.115", 0
649
                rb (SRV + 256 - $)
649
                rb (SRV + 256 - $)
650
 
650
 
651
remote_addr     db "file", 0
651
remote_addr     db "file", 0
652
                rb (remote_addr + 256 - $)
652
                rb (remote_addr + 256 - $)
653
 
653
 
654
local_addr      db "/tmp0/1/file", 0
654
local_addr      db "/tmp0/1/file", 0
655
                rb (local_addr + 256 - $)
655
                rb (local_addr + 256 - $)
656
 
656
 
657
include_debug_strings
657
include_debug_strings
658
 
658
 
659
I_END:
659
I_END:
660
 
660
 
661
last_ack        dw ?
661
last_ack        dw ?
662
size            dd ?
662
size            dd ?
663
mouse_dd        dd ?
663
mouse_dd        dd ?
664
 
664
 
665
sc              system_colors
665
sc              system_colors
666
 
666
 
667
buffer          rb buffer_len
667
buffer          rb buffer_len
668
 
668
 
669
IM_END:
669
IM_END: