Subversion Repositories Kolibri OS

Rev

Rev 3618 | Rev 3703 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3618 hidnplayr 3
;; Copyright (C) KolibriOS team 2010-2013. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  telnet.asm - Telnet client for KolibriOS                       ;;
7
;;                                                                 ;;
8
;;  Written by hidnplayr@kolibrios.org                             ;;
9
;;                                                                 ;;
10
;;          GNU GENERAL PUBLIC LICENSE                             ;;
11
;;             Version 2, June 1991                                ;;
12
;;                                                                 ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14
 
15
format binary as ""
16
 
3618 hidnplayr 17
__DEBUG__       = 0
18
__DEBUG_LEVEL__ = 1
19
BUFFERSIZE      = 4096
3545 hidnplayr 20
 
21
use32
22
; standard header
23
        db      'MENUET01'      ; signature
24
        dd      1               ; header version
25
        dd      start           ; entry point
26
        dd      i_end           ; initialized size
3574 hidnplayr 27
        dd      mem+4096        ; required memory
28
        dd      mem+4096        ; stack pointer
29
        dd      hostname        ; parameters
3545 hidnplayr 30
        dd      0               ; path
31
 
3618 hidnplayr 32
include '../../macros.inc'
3545 hidnplayr 33
purge mov,add,sub
3618 hidnplayr 34
include '../../proc32.inc'
35
include '../../dll.inc'
36
include '../../debug-fdo.inc'
37
include '../../network.inc'
3545 hidnplayr 38
 
39
; entry point
40
start:
41
; load libraries
42
        stdcall dll.Load, @IMPORT
43
        test    eax, eax
44
        jnz     exit
45
; initialize console
46
        push    1
47
        call    [con_start]
48
        push    title
49
        push    25
50
        push    80
51
        push    25
52
        push    80
53
        call    [con_init]
54
 
55
; Check for parameters
3574 hidnplayr 56
        cmp     byte [hostname], 0
3545 hidnplayr 57
        jne     resolve
58
 
59
main:
60
        call    [con_cls]
61
; Welcome user
62
        push    str1
63
        call    [con_write_asciiz]
64
 
3574 hidnplayr 65
prompt:
3545 hidnplayr 66
; write prompt
67
        push    str2
68
        call    [con_write_asciiz]
69
; read string
3574 hidnplayr 70
        mov     esi, hostname
3545 hidnplayr 71
        push    256
72
        push    esi
73
        call    [con_gets]
74
; check for exit
75
        test    eax, eax
76
        jz      done
77
        cmp     byte [esi], 10
78
        jz      done
79
 
80
resolve:
81
 
3574 hidnplayr 82
        mov     [sockaddr1.port], 23 shl 8
83
 
3545 hidnplayr 84
; delete terminating '\n'
3574 hidnplayr 85
        mov     esi, hostname
3545 hidnplayr 86
  @@:
87
        lodsb
3574 hidnplayr 88
        cmp     al, ':'
89
        je      .do_port
3545 hidnplayr 90
        cmp     al, 0x20
91
        ja      @r
92
        mov     byte [esi-1], 0
3574 hidnplayr 93
        jmp     .done
3545 hidnplayr 94
 
3574 hidnplayr 95
  .do_port:
96
        xor     eax, eax
97
        xor     ebx, ebx
98
        mov     byte [esi-1], 0
99
  .portloop:
100
        lodsb
101
        cmp     al, 0x20
102
        jbe     .port_done
103
        sub     al, '0'
104
        jb      hostname_error
105
        cmp     al, 9
106
        ja      hostname_error
107
        lea     ebx, [ebx*4 + ebx]
108
        shl     ebx, 1
109
        add     ebx, eax
110
        jmp     .portloop
3545 hidnplayr 111
 
3574 hidnplayr 112
  .port_done:
113
        xchg    bl, bh
114
        mov     [sockaddr1.port], bx
115
 
116
  .done:
117
 
3545 hidnplayr 118
; resolve name
119
        push    esp     ; reserve stack place
3574 hidnplayr 120
        push    esp     ; ptr to result
121
        push    0       ; addrinfo hints
122
        push    0       ; servname
123
        push    hostname; hostname
3545 hidnplayr 124
        call    [getaddrinfo]
125
        pop     esi
126
; test for error
127
        test    eax, eax
3687 hidnplayr 128
        jnz     dns_error
3545 hidnplayr 129
 
3574 hidnplayr 130
        call    [con_cls]
131
        push    str3
132
        call    [con_write_asciiz]
133
        push    hostname
134
        call    [con_write_asciiz]
135
 
3545 hidnplayr 136
; write results
137
        push    str8
138
        call    [con_write_asciiz]
139
;        mov     edi, esi
140
 
141
; convert IP address to decimal notation
142
        mov     eax, [esi+addrinfo.ai_addr]
143
        mov     eax, [eax+sockaddr_in.sin_addr]
144
        mov     [sockaddr1.ip], eax
145
        push    eax
146
        call    [inet_ntoa]
147
; write result
148
        push    eax
149
        call    [con_write_asciiz]
150
; free allocated memory
151
        push    esi
152
        call    [freeaddrinfo]
153
 
154
        push    str9
155
        call    [con_write_asciiz]
156
 
157
        mcall   socket, AF_INET4, SOCK_STREAM, 0
158
        cmp     eax, -1
3687 hidnplayr 159
        jz      socket_err
3545 hidnplayr 160
        mov     [socketnum], eax
161
 
162
        mcall   connect, [socketnum], sockaddr1, 18
163
 
164
        mcall   40, 1 shl 7 ; + 7
165
        call    [con_cls]
166
 
167
        mcall   18, 7
168
        push    eax
169
        mcall   51, 1, thread, mem - 2048
170
        pop     ecx
171
        mcall   18, 3
172
 
173
mainloop:
174
    DEBUGF  1, 'TELNET: Waiting for events\n'
175
        mcall   10
176
    DEBUGF  1, 'TELNET: EVENT %x !\n', eax
177
 
178
        call    [con_get_flags]
179
        test    eax, 0x200                      ; con window closed?
180
        jnz     exit
181
 
182
        mcall   recv, [socketnum], buffer_ptr, BUFFERSIZE, 0
183
        cmp     eax, -1
184
        je      mainloop
185
 
186
    DEBUGF  1, 'TELNET: got %u bytes of data !\n', eax
187
 
188
        mov     esi, buffer_ptr
189
        lea     edi, [esi + eax]
190
        mov     byte [edi], 0
191
 
192
  .scan_cmd:
193
        cmp     byte [esi], 0xff        ; Interpret As Command
194
        jne     .no_cmd
195
        ; TODO: parse options, for now, we will reply with 'WONT' to everything
196
        mov     byte [esi + 1], 252     ; WONT
197
        add     esi, 3                  ; a command is always 3 bytes
198
        jmp     .scan_cmd
199
  .no_cmd:
200
 
201
        cmp     esi, buffer_ptr
3687 hidnplayr 202
        je      .print
3545 hidnplayr 203
 
204
    DEBUGF  1, 'TELNET: sending data\n'
205
 
206
        push    esi edi
207
        sub     esi, buffer_ptr
208
        mcall   send, [socketnum], buffer_ptr, , 0
209
        pop     edi esi
210
 
3687 hidnplayr 211
  .print:
3545 hidnplayr 212
        cmp     esi, edi
213
        jae     mainloop
214
 
3687 hidnplayr 215
        push    esi
216
        call    [con_write_asciiz]
3545 hidnplayr 217
 
3687 hidnplayr 218
  .loop:
219
        lodsb
220
        test    al, al
221
        jz      .print
222
        jmp     .loop
3545 hidnplayr 223
 
224
 
3687 hidnplayr 225
socket_err:
226
        DEBUGF  1, "TELNET: socket error %d", ebx
3545 hidnplayr 227
        push    str6
228
        call    [con_write_asciiz]
229
 
3574 hidnplayr 230
        jmp     prompt
3545 hidnplayr 231
 
3687 hidnplayr 232
dns_error:
233
        DEBUGF  1, "TELNET: DNS error %d", eax
3545 hidnplayr 234
        push    str5
235
        call    [con_write_asciiz]
3574 hidnplayr 236
 
237
        jmp     prompt
238
 
239
hostname_error:
240
        push    str11
3545 hidnplayr 241
        call    [con_write_asciiz]
3574 hidnplayr 242
        jmp     prompt
3545 hidnplayr 243
 
244
done:
245
        push    1
246
        call    [con_exit]
247
exit:
248
 
249
        mcall   close, [socketnum]
250
        mcall   -1
251
 
252
 
253
 
254
thread:
255
        mcall   40, 0
256
  .loop:
257
        call    [con_getch2]
258
        mov     byte [send_data], al
259
        mcall   send, [socketnum], send_data, 1
260
 
261
        call    [con_get_flags]
262
        test    eax, 0x200                      ; con window closed?
263
        jz      .loop
264
        mcall   -1
265
 
266
; data
267
title   db      'Telnet',0
3574 hidnplayr 268
str1    db      'Telnet for KolibriOS',10,10,\
269
                'Please enter URL of telnet server (for example: towel.blinkenlights.nl:23)',10,10,0
3545 hidnplayr 270
str2    db      '> ',0
3574 hidnplayr 271
str3    db      'Connecting to ',0
3545 hidnplayr 272
str4    db      10,0
273
str8    db      ' (',0
274
str9    db      ')',10,0
275
 
3574 hidnplayr 276
str5    db      'Name resolution failed.',10,10,0
277
str6    db      'Could not open socket.',10,10,0
278
str11   db      'Invalid hostname.',10,10,0
279
 
3545 hidnplayr 280
sockaddr1:
281
        dw AF_INET4
3574 hidnplayr 282
.port   dw 0
3545 hidnplayr 283
.ip     dd 0
284
        rb 10
285
 
286
include_debug_strings    ; ALWAYS present in data section
287
 
288
 
289
 
290
; import
291
align 4
292
@IMPORT:
293
 
294
library network, 'network.obj', console, 'console.obj'
295
import  network,        \
296
        getaddrinfo,    'getaddrinfo',  \
297
        freeaddrinfo,   'freeaddrinfo', \
298
        inet_ntoa,      'inet_ntoa'
299
import  console,        \
300
        con_start,      'START',        \
301
        con_init,       'con_init',     \
302
        con_write_asciiz,       'con_write_asciiz',     \
303
        con_exit,       'con_exit',     \
304
        con_gets,       'con_gets',\
305
        con_cls,        'con_cls',\
306
        con_getch2,     'con_getch2',\
307
        con_set_cursor_pos, 'con_set_cursor_pos',\
308
        con_write_string, 'con_write_string',\
309
        con_get_flags,  'con_get_flags'
310
 
311
 
312
i_end:
313
 
314
socketnum       dd ?
315
buffer_ptr      rb BUFFERSIZE+1
3574 hidnplayr 316
send_data       rb 1
3545 hidnplayr 317
 
3574 hidnplayr 318
hostname        rb 1024
319
 
3545 hidnplayr 320
mem: