Annotation of gforth/netlib/netlib.fs, revision 1.1
1.1 ! jwilke 1: \ netlib.fs include netlib.so and forth utilities 08mar98jaw
! 2:
! 3: require ./../wordlib.fs
! 4:
! 5: WordLibrary netlib.fs ./netlib.so
! 6:
! 7: \ ------ Address structures
! 8:
! 9: decimal
! 10:
! 11: struct
! 12: char% field sa_len
! 13: char% field sa_family
! 14: char% 14 * field sa_data
! 15: end-struct sockaddr
! 16:
! 17: struct
! 18: char% 2* field sin_family
! 19: char% 2* field sin_port
! 20: char% 4 * field sin_addr
! 21: char% 8 * field sin_fill
! 22: end-struct sockaddr_in
! 23:
! 24: \ ------ Socket Types and address families
! 25:
! 26: 1 constant SOCK_STREAM \ stream (connection) socket
! 27: 2 constant SOCK_DGRAM \ datagram (conn.less) socket
! 28: 3 constant SOCK_RAW \ raw socket
! 29: 4 constant SOCK_RDM \ reliably-delivered message
! 30: 5 constant SOCK_SEQPACKET \ sequential packet socket
! 31: 10 constant SOCK_PACKET \ linux specific way of
! 32: \ getting packets at the dev
! 33: \ level. For writing rarp and
! 34: \ other similar things on the
! 35: \ user level.
! 36:
! 37: 2 constant AF_INET \ just define the most important
! 38: \ one
! 39:
! 40: 1 constant SOL_SOCKET
! 41:
! 42: \ ------ place +place 01jan95jaw
! 43:
! 44: [IFUNDEF] place
! 45: : place ( c-addr1 u c-addr2 )
! 46: 2dup c! char+ swap move ;
! 47: [THEN]
! 48:
! 49: [IFUNDEF] +place
! 50: : +place ( adr len adr )
! 51: 2dup >r >r
! 52: dup c@ char+ + swap move
! 53: r> r> dup c@ rot + swap c! ;
! 54: [THEN]
! 55:
! 56: \ ------ IP number conversion 31dec95jaw
! 57:
! 58: variable ip-class
! 59:
! 60: : (ip>)
! 61: 2dup [char] . scan
! 62: dup >r swap >r -
! 63: s>number drop or
! 64: r> r>
! 65: dup 0= IF EXIT THEN
! 66: 1 ip-class +!
! 67: 1- swap 1+ swap ;
! 68:
! 69: : dotted>ip ( adr len -- u )
! 70: 0 ip-class !
! 71: 0 -rot 4 0 DO rot 8 lshift -rot (ip>) LOOP
! 72: 2drop ;
! 73:
! 74: CREATE IP-Num 0 , 30 chars allot align
! 75:
! 76: : ip>dotted ( u -- adr len )
! 77: dup 24 rshift
! 78: 255 and 0 <# [char] . hold #S #> IP-Num place
! 79: dup 16 rshift
! 80: 255 and 0 <# [char] . hold #S #> IP-Num +place
! 81: dup 8 rshift
! 82: 255 and 0 <# [char] . hold #S #> IP-Num +place
! 83: 255 and 0 <# #S #> IP-Num +place
! 84: IP-Num count ;
! 85:
! 86: \ ------ Host and Networkbyteorder 30dec95jaw
! 87: \ Shift routines
! 88:
! 89: 1 here ! here c@ \ check byte order
! 90: [IF] \ little endian
! 91: : htonl >r
! 92: r@ 255 and 24 lshift
! 93: r@ [ 255 8 lshift ] literal and 8 lshift
! 94: r@ [ 255 16 lshift ] literal and 8 rshift
! 95: r> [ 255 24 lshift ] literal and 24 rshift
! 96: or or or ;
! 97:
! 98: : htons >r
! 99: r@ 255 and 8 lshift
! 100: r> [ 255 8 lshift ] literal and 8 rshift
! 101: or ;
! 102:
! 103: ' htonl ALIAS ntohl
! 104: ' htons ALIAS ntohs
! 105: [ELSE]
! 106: ' NOOP ALIAS htonl
! 107: ' NOOP ALIAS htons
! 108: ' NOOP ALIAS ntohl
! 109: ' NOOP ALIAS ntohs
! 110: [THEN]
! 111:
! 112: \ ------ Short memory handling 30dec95jaw
! 113:
! 114: 1 here ! here c@ \ check byte order
! 115: [IF] \ little endian
! 116: [IFUNDEF] s@ : s@ ( adr -- s ) @ 65535 and ; [THEN]
! 117: [IFUNDEF] s! : s! ( s adr -- ) over 255 and over c!
! 118: swap 8 rshift 255 and swap char+ c! ; [THEN]
! 119: [ELSE]
! 120: [IFUNDEF] s@ : s@ ( adr -- s ) @ 16 rshift ; [THEN]
! 121: [IFUNDEF] s! : s! ( s adr -- ) over 8 rshift 255 and over c!
! 122: swap 255 and swap char+ c! ; [THEN]
! 123: [THEN]
! 124: [IFUNDEF] s+! : s+! ( s adr -- ) swap over s@ + swap s! ; [THEN]
! 125:
! 126: \ ------ Utils 08mar98jaw
! 127:
! 128: : uerr
! 129: -1 = ;
! 130:
! 131: : hostip ( adr len -- ip )
! 132: \G returns the first valid ip address of host with name (adr len)
! 133: \G as 32 Bit value in host byte order
! 134: net-gethostbyname dup 0= ABORT" can't resolve domain name!"
! 135: 4 cells + @ ( list address ) @ ( address of address ) @ ( address )
! 136: ntohl ;
! 137:
! 138: : connect-tcp ( sockaddr_in* -- sock_fd )
! 139: AF_INET SOCK_STREAM 0 net-socket
! 140: dup uerr ABORT" couldn't make socket"
! 141: >r sockaddr_in %size r@ net-connect uerr ABORT" couldn't connect"
! 142: r> ;
! 143:
! 144: : ipport!sockaddr { ip port sockaddr* -- }
! 145: port htons sockaddr* sin_port s!
! 146: ip htonl sockaddr* sin_addr !
! 147: AF_INET sockaddr* sin_family s! ;
! 148:
! 149: : connect-tcp-ip ( ip port -- sock_fd )
! 150: sockaddr_in %alloc dup >r ipport!sockaddr
! 151: r@ connect-tcp
! 152: r> free throw ;
! 153:
! 154: : connect-tcp-name ( adr len port -- sock_fd )
! 155: >r hostip r> connect-tcp-ip ;
! 156:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>