]> gitweb.factorcode.org Git - factor.git/blob - basis/io/windows/sockets/sockets.factor
Fix permission bits
[factor.git] / basis / io / windows / sockets / sockets.factor
1 USING: kernel accessors io.sockets io.windows io.backend\r
2 windows.winsock system destructors alien.c-types ;\r
3 IN: io.windows.sockets\r
4 \r
5 HOOK: WSASocket-flags io-backend ( -- DWORD )\r
6 \r
7 TUPLE: win32-socket < win32-file ;\r
8 \r
9 : <win32-socket> ( handle -- win32-socket )\r
10     win32-socket new-win32-handle ;\r
11 \r
12 M: win32-socket dispose ( stream -- )\r
13     handle>> closesocket drop ;\r
14 \r
15 : unspecific-sockaddr/size ( addrspec -- sockaddr len )\r
16     [ empty-sockaddr/size ] [ protocol-family ] bi\r
17     pick set-sockaddr-in-family ;\r
18 \r
19 : opened-socket ( handle -- win32-socket )\r
20     <win32-socket> |dispose dup add-completion ;\r
21 \r
22 : open-socket ( addrspec type -- win32-socket )\r
23     >r protocol-family r>\r
24     0 f 0 WSASocket-flags WSASocket\r
25     dup socket-error\r
26     opened-socket ;\r
27 \r
28 M: object (get-local-address) ( socket addrspec -- sockaddr )\r
29     >r handle>> r> empty-sockaddr/size <int>\r
30     [ getsockname socket-error ] 2keep drop ;\r
31 \r
32 M: object (get-remote-address) ( socket addrspec -- sockaddr )\r
33     >r handle>> r> empty-sockaddr/size <int>\r
34     [ getpeername socket-error ] 2keep drop ;\r
35 \r
36 : bind-socket ( win32-socket sockaddr len -- )\r
37     >r >r handle>> r> r> bind socket-error ;\r
38 \r
39 M: object ((client)) ( addrspec -- handle )\r
40     [ SOCK_STREAM open-socket ] keep\r
41     [ unspecific-sockaddr/size bind-socket ] [ drop ] 2bi ;\r
42 \r
43 : server-socket ( addrspec type -- fd )\r
44     [ open-socket ] [ drop ] 2bi\r
45     [ make-sockaddr/size bind-socket ] [ drop ] 2bi ;\r
46 \r
47 ! http://support.microsoft.com/kb/127144\r
48 ! NOTE: Possibly tweak this because of SYN flood attacks\r
49 : listen-backlog ( -- n ) HEX: 7fffffff ; inline\r
50 \r
51 M: object (server) ( addrspec -- handle )\r
52     [\r
53         SOCK_STREAM server-socket\r
54         dup handle>> listen-backlog listen winsock-return-check\r
55     ] with-destructors ;\r
56 \r
57 M: windows (datagram) ( addrspec -- handle )\r
58     [ SOCK_DGRAM server-socket ] with-destructors ;\r
59 \r
60 M: windows addrinfo-error ( n -- )\r
61     winsock-return-check ;\r