| 1 : |
jwilke
|
1.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 : |
|
|
|