USING: accessors alien.c-types alien.data classes.struct combinators continuations grouping kernel io.binary io.sockets io.sockets.private math.parser memoize sequences splitting system vocabs.parser ; IN: io.sockets.icmp << { { [ os windows? ] [ "windows.winsock" ] } { [ os unix? ] [ "unix.ffi" ] } } cond use-vocab >> > ; MEMO: IPPROTO_ICMP6 ( -- protocol ) "ipv6-icmp" getprotobyname proto>> ; PRIVATE> TUPLE: icmp4 host ; C: icmp4 M: icmp4 protocol drop IPPROTO_ICMP4 ; ! FIXME: The following is "mostly" the same as inet4 (port = 0) M: icmp4 inet-ntop ( data addrspec -- str ) drop 4 memory>byte-array [ number>string ] { } map-as "." join ; M: icmp4 inet-pton ( str addrspec -- data ) drop [ parse-inet4 ] [ invalid-inet4 ] recover ; M: icmp4 address-size drop 4 ; M: icmp4 protocol-family drop PF_INET ; M: icmp4 sockaddr-size drop sockaddr-in heap-size ; M: icmp4 empty-sockaddr drop sockaddr-in ; M: icmp4 make-sockaddr ( inet -- sockaddr ) sockaddr-in AF_INET >>family swap [ host>> "0.0.0.0" or ] [ inet-pton *uint >>addr ] bi ; M: icmp4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec ) [ addr>> ] dip inet-ntop ; TUPLE: icmp6 host ; C: icmp6 M: icmp6 protocol drop IPPROTO_ICMP6 ; ! FIXME: The following is "mostly" the same as inet6 (port = 0) M: icmp6 inet-ntop ( data addrspec -- str ) drop 16 memory>byte-array 2 [ be> >hex ] map ":" join ; M: icmp6 inet-pton ( str addrspec -- data ) drop [ "::" split1 [ parse-inet6 ] bi@ pad-inet6 inet6-bytes ] [ invalid-inet6 ] recover ; M: icmp6 address-size drop 16 ; M: icmp6 protocol-family drop PF_INET6 ; M: icmp6 sockaddr-size drop sockaddr-in6 heap-size ; M: icmp6 empty-sockaddr drop sockaddr-in6 ; M: icmp6 make-sockaddr ( inet -- sockaddr ) sockaddr-in6 AF_INET6 >>family swap [ host>> "::" or ] [ inet-pton >>addr ] bi ; M: icmp6 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec ) [ addr>> ] dip inet-ntop ;