]> gitweb.factorcode.org Git - factor.git/commitdiff
io.sockets.windows: wrap ioctlsocket and related constants to enable
authorBjörn Lindqvist <bjourne@gmail.com>
Thu, 27 Mar 2014 18:38:08 +0000 (19:38 +0100)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 2 Apr 2014 21:50:20 +0000 (16:50 -0500)
setting sockets in non-blocking mode

basis/io/sockets/windows/windows-tests.factor [new file with mode: 0644]
basis/io/sockets/windows/windows.factor
basis/windows/winsock/winsock.factor

diff --git a/basis/io/sockets/windows/windows-tests.factor b/basis/io/sockets/windows/windows-tests.factor
new file mode 100644 (file)
index 0000000..562585b
--- /dev/null
@@ -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
index ee70e74ccef4e175a1bdd56767f753b53d5f9a3f..2df94f854480b41cd25cdcdbf55b6e3bd27aadfc 100755 (executable)
@@ -11,6 +11,9 @@ IN: io.sockets.windows
 : set-socket-option ( handle level opt -- )\r
     [ handle>> ] 2dip 1 int <ref> dup byte-length setsockopt socket-error ;\r
 \r
+: set-ioctl-socket ( handle cmd arg -- )\r
+    [ handle>> ] 2dip ulong <ref> ioctlsocket socket-error ;\r
+\r
 M: windows addrinfo-error ( n -- )\r
     winsock-return-check ;\r
 \r
index c64e2493fd333475ded807f267741c8731e6bad9..f094b04ac7d87801e2a86193af26ea9b47ea21ea 100644 (file)
@@ -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 ) ;