forked from KolibriOS/kolibrios
8a7ebf6b32
added pci ids of dec21x4x cards to netcfg bugfixes in dex21x4x driver, pcnet32 driver, rtl8139 driver and sis900 driver new network program (ICMP) to ping computers, uses new RAW socket code (experimental) git-svn-id: svn://kolibrios.org@1541 a494cfbc-eb01-0410-851d-a64ba20cac60
231 lines
3.9 KiB
NASM
231 lines
3.9 KiB
NASM
use32
|
|
; standard header
|
|
db 'MENUET01' ; signature
|
|
dd 1 ; header version
|
|
dd start ; entry point
|
|
dd i_end ; initialized size
|
|
dd mem ; required memory
|
|
dd mem ; stack pointer
|
|
dd 0 ; parameters
|
|
dd 0 ; path
|
|
|
|
|
|
BUFFERSIZE equ 1500
|
|
; useful includes
|
|
include '../macros.inc'
|
|
purge mov,add,sub
|
|
include '../proc32.inc'
|
|
include '../dll.inc'
|
|
|
|
include '../network.inc'
|
|
|
|
; entry point
|
|
start:
|
|
; load libraries
|
|
stdcall dll.Load, @IMPORT
|
|
test eax, eax
|
|
jnz exit
|
|
; initialize console
|
|
push 1
|
|
call [con_start]
|
|
push title
|
|
push 25
|
|
push 80
|
|
push 25
|
|
push 80
|
|
call [con_init]
|
|
; main loop
|
|
push str1
|
|
call [con_write_asciiz]
|
|
main:
|
|
; write prompt
|
|
push str2
|
|
call [con_write_asciiz]
|
|
; read string
|
|
mov esi, s
|
|
push 256
|
|
push esi
|
|
call [con_gets]
|
|
; check for exit
|
|
test eax, eax
|
|
jz done
|
|
cmp byte [esi], 10
|
|
jz done
|
|
; delete terminating '\n'
|
|
push esi
|
|
@@:
|
|
lodsb
|
|
test al, al
|
|
jnz @b
|
|
mov byte [esi-2], al
|
|
pop esi
|
|
; resolve name
|
|
push esp ; reserve stack place
|
|
push esp ; fourth parameter
|
|
push 0 ; third parameter
|
|
push 0 ; second parameter
|
|
push esi ; first parameter
|
|
call [getaddrinfo]
|
|
pop esi
|
|
; test for error
|
|
test eax, eax
|
|
jnz fail
|
|
|
|
; write results
|
|
push str3
|
|
call [con_write_asciiz]
|
|
; mov edi, esi
|
|
|
|
; convert IP address to decimal notation
|
|
mov eax, [esi+addrinfo.ai_addr]
|
|
mov eax, [eax+sockaddr_in.sin_addr]
|
|
mov [sockaddr1.ip], eax
|
|
push eax
|
|
call [inet_ntoa]
|
|
; write result
|
|
push eax
|
|
call [con_write_asciiz]
|
|
; free allocated memory
|
|
push esi
|
|
call [freeaddrinfo]
|
|
|
|
push str4
|
|
call [con_write_asciiz]
|
|
|
|
mcall socket, AF_INET4, IPPROTO_TCP, 0
|
|
cmp eax, -1
|
|
jz fail2
|
|
mov [socketnum], eax
|
|
|
|
mcall connect, [socketnum], sockaddr1, 18
|
|
|
|
mcall 40, 1 shl 7 ; + 7
|
|
call [con_cls]
|
|
|
|
mcall 18, 7
|
|
push eax
|
|
mcall 51, 1, thread, mem - 2048
|
|
pop ecx
|
|
mcall 18, 3
|
|
|
|
mainloop:
|
|
mcall 10
|
|
|
|
mcall recv, [socketnum], buffer_ptr, BUFFERSIZE, 0
|
|
cmp eax, -1
|
|
je mainloop
|
|
|
|
mov esi, buffer_ptr
|
|
mov byte [esi + eax], 0
|
|
|
|
@@:
|
|
cmp byte [esi], 0xff ; Interpret As Command
|
|
jne @f
|
|
; TODO: parse options, for now, we will reply with 'WONT' to everything
|
|
mov byte [esi + 1], 252 ; WONT
|
|
add esi, 3 ; a command is always 3 bytes
|
|
jmp @r
|
|
|
|
|
|
@@:
|
|
cmp byte [esi], 0x1b ; escape character
|
|
jne @f
|
|
cmp word [esi+1], 0x485b ; move cursor to beginning
|
|
jne @f
|
|
push 0
|
|
push 0
|
|
call [con_set_cursor_pos]
|
|
add esi, 3
|
|
|
|
|
|
@@:
|
|
push esi
|
|
|
|
cmp esi, buffer_ptr
|
|
je .nocommands
|
|
|
|
mov edx, buffer_ptr
|
|
sub esi, buffer_ptr
|
|
xor edi, edi
|
|
mcall send, [socketnum]
|
|
|
|
.nocommands:
|
|
call [con_write_asciiz]
|
|
jmp mainloop
|
|
|
|
|
|
; write newline and continue main loop
|
|
push str4
|
|
@@:
|
|
call [con_write_asciiz]
|
|
jmp main
|
|
fail:
|
|
push str5
|
|
jmp @b
|
|
fail2:
|
|
push str6
|
|
jmp @b
|
|
|
|
done:
|
|
push 1
|
|
call [con_exit]
|
|
exit:
|
|
mcall -1
|
|
|
|
|
|
|
|
thread:
|
|
mcall 40, 0
|
|
.loop:
|
|
call [con_getch2]
|
|
mov byte [send_data], al
|
|
mcall send, [socketnum], send_data, 1
|
|
jmp .loop
|
|
|
|
; data
|
|
title db 'Telnet',0
|
|
str1 db 'Telnet v0.1',10,' for KolibriOS # 1281 or later. ',10,10,'If you dont know where to connect to, try towel.blinkenlights.nl',10,10,0
|
|
str2 db '> ',0
|
|
str3 db 'Connecting to: ',0
|
|
str4 db 10,0
|
|
str5 db 'Name resolution failed.',10,10,0
|
|
str6 db 'Could not open socket',10,10,0
|
|
str7 db 'Got data!',10,10,0
|
|
|
|
sockaddr1:
|
|
dw AF_INET4
|
|
.port dw 23
|
|
.ip dd 0
|
|
rb 10
|
|
|
|
|
|
|
|
; import
|
|
align 4
|
|
@IMPORT:
|
|
|
|
library network, 'network.obj', console, 'console.obj'
|
|
import network, \
|
|
getaddrinfo, 'getaddrinfo', \
|
|
freeaddrinfo, 'freeaddrinfo', \
|
|
inet_ntoa, 'inet_ntoa'
|
|
import console, \
|
|
con_start, 'START', \
|
|
con_init, 'con_init', \
|
|
con_write_asciiz, 'con_write_asciiz', \
|
|
con_exit, 'con_exit', \
|
|
con_gets, 'con_gets',\
|
|
con_cls, 'con_cls',\
|
|
con_getch2, 'con_getch2',\
|
|
con_set_cursor_pos, 'con_set_cursor_pos'
|
|
i_end:
|
|
|
|
socketnum dd ?
|
|
buffer_ptr rb BUFFERSIZE
|
|
send_data rb 100
|
|
|
|
s rb 256
|
|
align 4
|
|
rb 4096 ; stack
|
|
mem:
|