Implement a raw port. Make ping only run on Windows and Mac because the other platforms require root privs.
parent
a60afaf0ec
commit
2c42e616b4
|
@ -1,12 +1,13 @@
|
|||
! Copyright (C) 2007, 2010 Slava Pestov, Doug Coleman,
|
||||
! Daniel Ehrenberg.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: generic kernel io.backend namespaces continuations sequences
|
||||
arrays io.encodings io.ports io.streams.duplex io.encodings.ascii
|
||||
alien.strings io.binary accessors destructors classes byte-arrays
|
||||
parser alien.c-types math.parser splitting grouping math assocs
|
||||
summary system vocabs.loader combinators present fry vocabs.parser
|
||||
classes.struct alien.data strings io.encodings.binary ;
|
||||
USING: accessors alien.c-types alien.data alien.strings arrays
|
||||
assocs byte-arrays classes classes.struct combinators
|
||||
combinators.short-circuit continuations destructors fry generic
|
||||
grouping io.backend io.binary io.encodings io.encodings.ascii
|
||||
io.encodings.binary io.ports io.streams.duplex kernel math
|
||||
math.parser namespaces parser present sequences splitting
|
||||
strings summary system vocabs.loader vocabs.parser ;
|
||||
IN: io.sockets
|
||||
|
||||
<< {
|
||||
|
@ -254,17 +255,28 @@ TUPLE: datagram-port < port addr ;
|
|||
|
||||
HOOK: (datagram) io-backend ( addr -- datagram )
|
||||
|
||||
: check-datagram-port ( port -- port )
|
||||
dup check-disposed
|
||||
dup datagram-port? [ "Not a datagram port" throw ] unless ; inline
|
||||
|
||||
TUPLE: raw-port < port addr ;
|
||||
|
||||
HOOK: (raw) io-backend ( addr -- raw )
|
||||
|
||||
HOOK: (receive) io-backend ( datagram -- packet addrspec )
|
||||
|
||||
: check-datagram-send ( packet addrspec port -- packet addrspec port )
|
||||
check-datagram-port
|
||||
ERROR: invalid-port object ;
|
||||
|
||||
: check-port ( packet addrspec port -- packet addrspec port )
|
||||
2dup addr>> [ class ] bi@ assert=
|
||||
pick class byte-array assert= ;
|
||||
|
||||
: check-connectionless-port ( port -- port )
|
||||
dup { [ datagram-port? ] [ raw-port? ] } 1|| [ invalid-port ] unless ;
|
||||
|
||||
: check-send ( packet addrspec port -- packet addrspec port )
|
||||
check-connectionless-port dup check-disposed check-port ;
|
||||
|
||||
: check-receive ( port -- port )
|
||||
check-connectionless-port dup check-disposed ;
|
||||
|
||||
HOOK: (send) io-backend ( packet addrspec datagram -- )
|
||||
|
||||
: addrinfo>addrspec ( addrinfo -- addrspec )
|
||||
|
@ -323,12 +335,19 @@ SYMBOL: remote-address
|
|||
>>addr
|
||||
] with-destructors ;
|
||||
|
||||
: <raw> ( addrspec -- datagram )
|
||||
[
|
||||
[ (raw) |dispose ] keep
|
||||
[ drop raw-port <port> ] [ get-local-address ] 2bi
|
||||
>>addr
|
||||
] with-destructors ;
|
||||
|
||||
: receive ( datagram -- packet addrspec )
|
||||
check-datagram-port
|
||||
check-receive
|
||||
[ (receive) ] [ addr>> ] bi parse-sockaddr ;
|
||||
|
||||
: send ( packet addrspec datagram -- )
|
||||
check-datagram-send (send) ;
|
||||
check-send (send) ;
|
||||
|
||||
GENERIC: resolve-host ( addrspec -- seq )
|
||||
|
||||
|
|
|
@ -123,6 +123,9 @@ M: object (accept) ( server addrspec -- fd sockaddr )
|
|||
M: unix (datagram)
|
||||
[ SOCK_DGRAM server-socket-fd ] with-destructors ;
|
||||
|
||||
M: unix (raw)
|
||||
[ SOCK_RAW server-socket-fd ] with-destructors ;
|
||||
|
||||
SYMBOL: receive-buffer
|
||||
|
||||
CONSTANT: packet-size 65536
|
||||
|
|
|
@ -80,19 +80,11 @@ M: object (server) ( addrspec -- handle )
|
|||
dup handle>> listen-backlog listen winsock-return-check
|
||||
] with-destructors ;
|
||||
|
||||
GENERIC: windows-socket-type ( obj -- n )
|
||||
|
||||
M: inet4 windows-socket-type drop SOCK_DGRAM ;
|
||||
|
||||
M: inet6 windows-socket-type drop SOCK_DGRAM ;
|
||||
|
||||
M: icmp4 windows-socket-type drop SOCK_RAW ;
|
||||
|
||||
M: icmp6 windows-socket-type drop SOCK_RAW ;
|
||||
|
||||
M: windows (datagram) ( addrspec -- handle )
|
||||
[ dup windows-socket-type server-socket ] with-destructors ;
|
||||
[ SOCK_DGRAM server-socket ] with-destructors ;
|
||||
|
||||
M: windows (raw) ( addrspec -- handle )
|
||||
[ SOCK_RAW server-socket ] with-destructors ;
|
||||
|
||||
: malloc-int ( n -- alien )
|
||||
<int> malloc-byte-array ; inline
|
||||
|
|
|
@ -64,6 +64,7 @@ CONSTANT: max-un-path 104
|
|||
|
||||
CONSTANT: SOCK_STREAM 1
|
||||
CONSTANT: SOCK_DGRAM 2
|
||||
CONSTANT: SOCK_RAW 3
|
||||
|
||||
CONSTANT: AF_UNSPEC 0
|
||||
CONSTANT: AF_UNIX 1
|
||||
|
|
|
@ -62,6 +62,7 @@ STRUCT: sockaddr-un
|
|||
|
||||
CONSTANT: SOCK_STREAM 1
|
||||
CONSTANT: SOCK_DGRAM 2
|
||||
CONSTANT: SOCK_RAW 3
|
||||
|
||||
CONSTANT: AF_UNSPEC 0
|
||||
CONSTANT: AF_UNIX 1
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
|
||||
USING: ping tools.test ;
|
||||
|
||||
USING: continuations destructors io.sockets kernel ping
|
||||
tools.test ;
|
||||
IN: ping.tests
|
||||
|
||||
[ t ] [ "localhost" alive? ] unit-test
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
! Copyright (C) 2010 John Benediktsson
|
||||
! See http://factorcode.org/license.txt for BSD license
|
||||
|
||||
USING: accessors byte-arrays calendar checksums
|
||||
checksums.internet combinators combinators.smart continuations
|
||||
destructors io.sockets io.sockets.icmp io.timeouts kernel pack
|
||||
random sequences locals ;
|
||||
|
||||
destructors io.sockets io.sockets.icmp io.timeouts kernel
|
||||
locals pack random sequences system ;
|
||||
IN: ping
|
||||
|
||||
<PRIVATE
|
||||
|
@ -32,21 +30,27 @@ TUPLE: echo type identifier sequence data ;
|
|||
"CCSSS" unpack-be { 0 3 4 } swap nths first3
|
||||
] dip echo boa ;
|
||||
|
||||
: send-ping ( addr datagram -- )
|
||||
: send-ping ( addr raw -- )
|
||||
[ 0 { } <echo> echo>byte-array ] 2dip send ;
|
||||
|
||||
:: recv-ping ( addr datagram -- echo )
|
||||
datagram receive addr = [
|
||||
:: recv-ping ( addr raw -- echo )
|
||||
raw receive addr = [
|
||||
20 tail byte-array>echo
|
||||
] [
|
||||
drop addr datagram recv-ping
|
||||
drop addr raw recv-ping
|
||||
] if ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
HOOK: <ping-port> os ( inet -- port )
|
||||
|
||||
M: object <ping-port> <raw> ;
|
||||
|
||||
M: macosx <ping-port> <datagram> ;
|
||||
|
||||
: ping ( host -- reply )
|
||||
<icmp> resolve-host [ icmp4? ] filter random
|
||||
f <icmp4> <datagram>
|
||||
f <icmp4> <ping-port>
|
||||
1 seconds over set-timeout
|
||||
[ [ send-ping ] [ recv-ping ] 2bi ] with-disposal ;
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
windows macosx
|
Loading…
Reference in New Issue