From ee19a9786944e7918072815c22e3be801c27043c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B6rn=20Lindqvist?= Date: Thu, 27 Mar 2014 19:38:08 +0100 Subject: [PATCH] io.sockets.windows: wrap ioctlsocket and related constants to enable setting sockets in non-blocking mode --- basis/io/sockets/windows/windows-tests.factor | 20 +++++++++++++++++++ basis/io/sockets/windows/windows.factor | 3 +++ basis/windows/winsock/winsock.factor | 5 +++++ 3 files changed, 28 insertions(+) create mode 100644 basis/io/sockets/windows/windows-tests.factor diff --git a/basis/io/sockets/windows/windows-tests.factor b/basis/io/sockets/windows/windows-tests.factor new file mode 100644 index 0000000000..562585b8e4 --- /dev/null +++ b/basis/io/sockets/windows/windows-tests.factor @@ -0,0 +1,20 @@ +USING: accessors continuations io.sockets io.sockets.windows kernel sequences tools.test +urls windows.winsock ; +IN: io.sockets.windows.tests + +: google-socket ( -- socket ) + URL" http://www.google.com" url-addr resolve-host first + SOCK_STREAM open-socket ; + +{ } [ + google-socket + { FIONBIO FIONREAD } [ + google-socket swap execute( -- x ) + [ 1 set-ioctl-socket ] [ 0 set-ioctl-socket ] 2bi + ] each drop +] unit-test + +{ t } [ + [ google-socket 1337 -8 set-ioctl-socket ] + [ [ winsock-exception? ] [ n>> 10045 = ] bi and ] recover +] unit-test diff --git a/basis/io/sockets/windows/windows.factor b/basis/io/sockets/windows/windows.factor index ee70e74cce..2df94f8544 100755 --- a/basis/io/sockets/windows/windows.factor +++ b/basis/io/sockets/windows/windows.factor @@ -11,6 +11,9 @@ IN: io.sockets.windows : set-socket-option ( handle level opt -- ) [ handle>> ] 2dip 1 int dup byte-length setsockopt socket-error ; +: set-ioctl-socket ( handle cmd arg -- ) + [ handle>> ] 2dip ulong ioctlsocket socket-error ; + M: windows addrinfo-error ( n -- ) winsock-return-check ; diff --git a/basis/windows/winsock/winsock.factor b/basis/windows/winsock/winsock.factor index c64e2493fd..f094b04ac7 100644 --- a/basis/windows/winsock/winsock.factor +++ b/basis/windows/winsock/winsock.factor @@ -88,6 +88,10 @@ CONSTANT: IPPROTO_TCP 6 CONSTANT: IPPROTO_UDP 17 CONSTANT: IPPROTO_RM 113 +CONSTANT: FIOASYNC 0x8004667d +CONSTANT: FIONBIO 0x8004667e +CONSTANT: FIONREAD 0x4004667f + CONSTANT: WSA_FLAG_OVERLAPPED 1 ALIAS: WSA_WAIT_EVENT_0 WAIT_OBJECT_0 ALIAS: WSA_MAXIMUM_WAIT_EVENTS MAXIMUM_WAIT_OBJECTS @@ -166,6 +170,7 @@ STRUCT: fd_set LIBRARY: winsock FUNCTION: int setsockopt ( SOCKET s, int level, int optname, c-string optval, int optlen ) ; +FUNCTION: int ioctlsocket ( SOCKET s, long cmd, ulong* *argp ) ; FUNCTION: ushort htons ( ushort n ) ; FUNCTION: ushort ntohs ( ushort n ) ; -- 2.34.1