Login

Subversion Repositories NedoOS

Rev

Rev 1933 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

MODULE OS_NETSOCKET
PUBLIC OS_NETSOCKET
#include "sysdefs.asm"
RSEG CODE

OS_NETSOCKET:  
;D - AF_INET
;E - (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip
;------
;L - SOCKET
;A - ErrNo
        push bc
        ld l,0x01
        ld c, CMD_WIZNETOPEN
        ex af,af'
        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        pop bc
        ld h, l
        ld l, a
       
        ret
ENDMOD

MODULE OS_NETCONNECT
PUBLIC OS_NETCONNECT
#include "sysdefs.asm"
RSEG CODE

OS_NETCONNECT: 
;A  - Socket
;DE - Pointer to adrstruct
;------
;L - <0 err
;H - ErrNo
;CMD_WIZNETOPEN=0xdb ;A=SOCKET, L=subfunction (see sys_h.asm)
        push bc
        ld a, e
        ld d, b
        ld e, c
        ex af,af'

        ld c, CMD_WIZNETOPEN
        ld l,0x03
        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        ld h, l
        LD l, a
        pop bc
        ret
ENDMOD

MODULE OS_WIZNETREAD
PUBLIC OS_WIZNETREAD
#include "sysdefs.asm"
RSEG CODE
;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
;out: HL=count if HL < 0 then A=error
OS_WIZNETREAD: 
        push bc
        ld b, e
        ld a, e
        add a, 05       ; protocol
        ld e, a        
        ld a, (de)      ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip  
        cp 01
        jp z, tcpread
        cp 02
        jp z, icmpread
        cp 03
        jp z, udpread


tcpread:
        ld e, b        
        ex de,hl
        ld a, (hl)      ;socket
        inc hl
        ld e, (hl)      ;buffer L
        inc hl
        ld d, (hl)      ;buffer H
        inc hl
        ld c, (hl)      ;size L
        inc hl
        ld b, (hl)      ;size H
        ld l, c
        ld h, b
        ld c, CMD_WIZNETREAD
        push ix
        push iy
        ex af,af'
        call BDOS
        pop iy
        pop ix
        bit 7, h
        jp z, readok    ;noerror just return
        ld l, a
        jp readnot

icmpread:
udpread:
        ld e, b        
        ex de,hl
        ld a, (hl)      ;socket
        inc hl
        ld (store_ix1), hl
        ld IX, (store_ix1)      ; buffer HL
        inc hl
        inc hl
        ld c, (hl)                      ;size L
        inc hl
        ld b, (hl)                      ;size H
        ld l, c
        ld h, b
        ex af,af'

        ld c, CMD_WIZNETREAD
        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        bit 7, h
        jp z, readok    ;noerror just return
        ld l, a

readok:
readnot:
        pop bc
        ret
store_ix1:
defb 0,0,0,0,0,0,0,0
ENDMOD

MODULE OS_WIZNETWRITE
PUBLIC OS_WIZNETWRITE
#include "sysdefs.asm"
RSEG CODE
;if TCP: A=SOCKET, de=buffer_ptr,               HL=sizeof(buffer)
;else:   A=SOCKET, de=sockaddr_in ptr,  HL=sizeof(buffer), IX=buffer_ptr,
;out: HL=count if HL < 0 then A=error
OS_WIZNETWRITE 
        push bc
        ld b, e
        ld a, e
        add a, 05       ; protocol
        ld e, a        
        ld a, (de)      ;(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip  
        cp 01
        jp z, tcpsend
        cp 02
        jp z, icmpsend
        cp 03
        jp z, udpsend

tcpsend:       
        ld e, b
        ex de,hl
        ld a, (hl)                      ;socket
        inc hl
        ld e, (hl)                      ;buffer L
        inc hl
        ld d, (hl)                      ;buffer H
        inc hl
        ld c, (hl)                      ;size L
        inc hl
        ld b, (hl)                      ;size H
        ld l, c
        ld h, b
        push ix
        push iy
        ld c, CMD_WIZNETWRITE
        ex af,af'
        call BDOS
        pop iy
        pop ix
        bit 7, h
        jp z, writeok           ;noerror just return
        ld l, a
        jp writenot
       
udpsend:
icmpsend:
        ld e, b
        ex de,hl
        ld a, (hl)                      ; socket
        inc hl
        ld (store_ix), hl
        ld IX, (store_ix)       ; buffer HL
        inc hl
        inc hl
        ld c, (hl)                      ; size L
        inc hl
        ld b, (hl)                      ; size H
        inc hl                          ; protocol
        inc hl
        ex de,hl                        ; DE-HL now point at sockaddr_in
        ex af,af'

        ld c, CMD_WIZNETWRITE
        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        bit 7, h
        jp z, writeok           ;noerror just return
        ld l, a
writeok:
writenot:
        pop bc
        ret
store_ix:
defb 0,0,0,0,0,0,0,0
ENDMOD

MODULE OS_BIND
PUBLIC OS_BIND
#include "sysdefs.asm"
RSEG CODE
;  A - SOCKET
;  DE - указатель на структуру sockaddr_in содержащую номер исходящего порта.
;   (остальные поля структуры не используются, но обязаны присутствовать)
; Возвращаемые значения в регистрах:
;  L - При отрицательном значении - функция завершилась с ошибкой.
;  А - errno при ошибке
OS_BIND:       
        push bc
        ld a, e
        ld d, b
        ld e, c
        ld l,0x05
    ld c,CMD_WIZNETOPEN
        push ix
        push iy
        ex af,af'
        call BDOS
        pop iy
        pop ix
        ld h, l
        ld l, a
        pop bc
        ret
ENDMOD

MODULE OS_LISTEN
PUBLIC OS_LISTEN
#include "sysdefs.asm"
RSEG CODE
; A - SOCKET
; Возвращаемые значения в регистрах:
; L - При отрицательном значении - функция завершилась с ошибкой.
; А - errno при ошибке.
OS_LISTEN:     
        push bc
        push de
        ld a, e
        ld l,0x06
    ld c,CMD_WIZNETOPEN
        ex af,af'

        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        pop de
        pop bc
        ld h, l
        ld l, a
        ret
ENDMOD


MODULE OS_ACCEPT
PUBLIC OS_ACCEPT
#include "sysdefs.asm"
RSEG CODE
; A - SOCKET
; Возвращаемые значения в регистрах:
; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
; А - errno при ошибке.
OS_ACCEPT:     
        push bc
        push de
        ld a, e
        ld l,0x04
    ld c,CMD_WIZNETOPEN
        ex af,af'
        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        ld h, l
        ld l, a
        pop de
        pop bc
        ret
ENDMOD



MODULE OS_NETSHUTDOWN
PUBLIC OS_NETSHUTDOWN
#include "sysdefs.asm"
RSEG CODE
; A - SOCKET
; E - Варианты закрытия, 0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст.
; Возвращаемые значения в регистрах:
; L - SOCKET при положительном значении, при отрицательном значении  - функция завершилась с ошибкой.
; А - errno при ошибке.
OS_NETSHUTDOWN:
        push bc
        push de
        ld a, e
        ld e, b
        ld l,0x02
    ld c,CMD_WIZNETOPEN
        ex af,af'

        push ix
        push iy
        call BDOS
        pop iy
        pop ix
        ld h, l
        ld l, a
        pop de
        pop bc
        ret
ENDMOD

MODULE OS_GETDNS
PUBLIC OS_GETDNS
#include "sysdefs.asm"
RSEG CODE
OS_GETDNS:
        ld l,0x08
        push ix
        push iy
        ld a,c
        ex af,af'
        ld c,CMD_WIZNETOPEN
        call BDOS
        ld a,l
        pop iy
        pop ix
        ret
ENDMOD

MODULE OS_SETDNS
PUBLIC OS_SETDNS
#include "sysdefs.asm"
RSEG CODE
OS_SETDNS:
        ld l,0x07
        push ix
        push iy
        ld a,c
        ex af,af'

        ld c,CMD_WIZNETOPEN
        call BDOS
        ld a,l
        pop iy
        pop ix
        ret
ENDMOD

MODULE LIB_DNS_RESOLVER
        PUBLIC DNS_RESOLVER
        EXTERN errno, OS_NETSOCKET, OS_NETSHUTDOWN, YIELD
        EXTERN OS_NETCONNECT, OS_WIZNETREAD, OS_WIZNETWRITE
        EXTERN OS_GETDNS
               
        RSEG    CODE
DNS_RESOLVER:           ;DE-domain name
        push ix
        push de
    ld de,dns_ia + 3
    call OS_GETDNS
        ld hl,dns_head
        ld de,dnsbuf
        ld bc,6
        ldir
        ex de,hl
        ld de,dnsbuf+7
        ld (hl),0
        ld bc,256-7
        ldir
        ld de,dnsbuf+12
        ld h,d
        ld l,e
        pop bc
name_loop:
        inc hl
        ld a,(bc)
        ld (hl),a
        inc bc
        cp '.'
        jr z,is_dot
        or a
        jr nz,name_loop
is_dot:
        sbc hl,de
        ex de,hl
        dec e
        ld (hl),e
        inc e
        add hl,de
        ld d,h
        ld e,l
        or a
        jr nz,name_loop
        inc a
        inc hl
        inc hl
        ld (hl),a
        inc hl
        inc hl
        ld (hl),a
        inc hl
        push hl
       
        ld de,0x0203
        call OS_NETSOCKET
        ld (dnssoc),a
        or a
        jp m,exiterr
        ;LD     C,A
        ;LD     DE,dns_ia
        ;CALL   OS_NETCONNECT
        ;or a
        ;jp m,exiterr
       
        pop hl
        push hl
        ld de,0xffff&(-dnsbuf)
        add hl,de
        PUSH    HL
        LD      bc,(dnssoc)
        LD      ix,dnsbuf
        ld      de,dns_ia
        CALL    OS_WIZNETWRITE
        pop af
        bit 7,h
        jr nz,exitcode
        ld b,50
        push bc
        jr recv_wait1
recv_wait:
        push bc
        call YIELD
recv_wait1:
        ld hl,256
        PUSH    HL
        LD      bc,(dnssoc)
        LD      DE,dnsbuf
        LD      ix,dnsbuf
        CALL    OS_WIZNETREAD
        pop af
        pop bc
        ;ld a,h
        ;or l
        bit 7,h
        jr z,recv_wait_end
        djnz recv_wait
        ld a,54 ;ERR_CONNRESET
        ld (errno),a
        jr exiterr
recv_wait_end:
        ld a,65         ;ERR_HOSTUNREACH
        ld (errno),a
        bit 7,h
        jr nz,exitcode
        ld a,(dnsbuf+3)
        and 0x0f       
        jr nz,exiterr
exitcode:
        LD      BC,(dnssoc)
        LD      E,0
        CALL    OS_NETSHUTDOWN
        pop hl
        pop ix
reqpars_l
        inc hl
        inc hl
        inc hl
        ld a,(hl)
        ld de,7
        add hl,de
        ld b,(hl)
        inc hl
        ld c,(hl)
        inc hl
        dec a
        ret z
        cp 4
        jr nz,exiterr1
        add hl,bc
        jr reqpars_l
       
exiterr:
        pop af
        ld a,(errno)
        push af
        LD      BC,(dnssoc)
        LD      E,0
        CALL    OS_NETSHUTDOWN
        pop af
        ld (errno),a
        pop ix
exiterr1:
        ld hl,0
        ret
       
        RSEG    CONST
dns_head
        defb 0x11,0x22,0x01,0x00,0x00,0x01
dns_ia:
        defb 0,0,53,8,8,8,8
        RSEG    NO_INIT
dnssoc:
        DEFS 1 
dnsbuf:
        DEFS 256
       
ENDMOD


END