! Copyright (C) 2006 Mackenzie Straight, Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien alien.c-types alien.data alien.strings
-alien.syntax arrays byte-arrays classes.struct grouping init
-io.encodings.utf16n kernel literals math math.bitwise
+! See https://factorcode.org/license.txt for BSD license.
+USING: accessors alien alien.c-types alien.data alien.syntax
+byte-arrays classes.struct grouping init kernel literals math
math.parser sequences system vocabs.parser windows.com.syntax
windows.errors windows.kernel32 windows.types ;
-FROM: alien.c-types => short ;
IN: windows.winsock
<<
CONSTANT: PF_INET 2
CONSTANT: PF_INET6 23
-CONSTANT: AI_PASSIVE 1
-CONSTANT: AI_CANONNAME 2
-CONSTANT: AI_NUMERICHOST 4
+CONSTANT: AI_PASSIVE 0x0001
+CONSTANT: AI_CANONNAME 0x0002
+CONSTANT: AI_NUMERICHOST 0x0004
+CONSTANT: AI_ALL 0x0100
+CONSTANT: AI_ADDRCONFIG 0x0400
CONSTANT: AI_MASK flags{ AI_PASSIVE AI_CANONNAME AI_NUMERICHOST }
CONSTANT: NI_NUMERICHOST 1
CONSTANT: NI_NUMERICSERV 2
-CONSTANT: IPPROTO_TCP 6
-CONSTANT: IPPROTO_UDP 17
-CONSTANT: IPPROTO_RM 113
+CONSTANT: IPPROTO_IP 0 ! Dummy protocol for TCP.
+CONSTANT: IPPROTO_ICMP 1 ! Internet Control Message Protocol.
+CONSTANT: IPPROTO_IGMP 2 ! Internet Group Management Protocol. */
+CONSTANT: IPPROTO_IPIP 4 ! IPIP tunnels (older KA9Q tunnels use 94).
+CONSTANT: IPPROTO_TCP 6 ! Transmission Control Protocol.
+CONSTANT: IPPROTO_EGP 8 ! Exterior Gateway Protocol.
+CONSTANT: IPPROTO_PUP 12 ! PUP protocol.
+CONSTANT: IPPROTO_UDP 17 ! User Datagram Protocol.
+CONSTANT: IPPROTO_IDP 22 ! XNS IDP protocol.
+CONSTANT: IPPROTO_TP 29 ! SO Transport Protocol Class 4.
+CONSTANT: IPPROTO_DCCP 33 ! Datagram Congestion Control Protocol.
+CONSTANT: IPPROTO_IPV6 41 ! IPv6 header.
+CONSTANT: IPPROTO_RSVP 46 ! Reservation Protocol.
+CONSTANT: IPPROTO_GRE 47 ! General Routing Encapsulation.
+CONSTANT: IPPROTO_ESP 50 ! encapsulating security payload.
+CONSTANT: IPPROTO_AH 51 ! authentication header.
+CONSTANT: IPPROTO_MTP 92 ! Multicast Transport Protocol.
+CONSTANT: IPPROTO_BEETPH 94 ! IP option pseudo header for BEET.
+CONSTANT: IPPROTO_ENCAP 98 ! Encapsulation Header.
+CONSTANT: IPPROTO_PIM 103 ! Protocol Independent Multicast.
+CONSTANT: IPPROTO_COMP 108 ! Compression Header Protocol.
+CONSTANT: IPPROTO_RM 113 ! Reliable Multicast aka PGM
+CONSTANT: IPPROTO_SCTP 132 ! Stream Control Transmission Protocol.
+CONSTANT: IPPROTO_UDPLITE 136 ! UDP-Lite protocol.
+CONSTANT: IPPROTO_MPLS 137 ! MPLS in IP.
+CONSTANT: IPPROTO_RAW 255 ! Raw IP packets.
+
+CONSTANT: FIOASYNC 0x8004667d
+CONSTANT: FIONBIO 0x8004667e
+CONSTANT: FIONREAD 0x4004667f
+
+CONSTANT: IP_OPTIONS 1
+CONSTANT: IP_HDRINCL 2
+CONSTANT: IP_TOS 3
+CONSTANT: IP_TTL 4
+CONSTANT: IP_MULTICAST_IF 9
+CONSTANT: IP_MULTICAST_TTL 10
+CONSTANT: IP_MULTICAST_LOOP 11
+CONSTANT: IP_ADD_MEMBERSHIP 12
+CONSTANT: IP_DROP_MEMBERSHIP 13
+CONSTANT: IP_DONTFRAGMENT 14
+CONSTANT: IP_ADD_SOURCE_MEMBERSHIP 15
+CONSTANT: IP_DROP_SOURCE_MEMBERSHIP 16
+CONSTANT: IP_BLOCK_SOURCE 17
+CONSTANT: IP_UNBLOCK_SOURCE 18
+CONSTANT: IP_PKTINFO 19
+CONSTANT: IP_RECEIVE_BROADCAST 22
+
CONSTANT: WSA_FLAG_OVERLAPPED 1
ALIAS: WSA_WAIT_EVENT_0 WAIT_OBJECT_0
GENERIC: sockaddr>ip ( sockaddr -- string )
-M: sockaddr-in sockaddr>ip ( sockaddr -- string )
+M: sockaddr-in sockaddr>ip
addr>> uint <ref> [ number>string ] { } map-as "." join ;
-M: sockaddr-in6 sockaddr>ip ( uchar-array -- string )
+M: sockaddr-in6 sockaddr>ip
addr>> [ >hex ] { } map-as 2 group [ concat ] map ":" join ;
STRUCT: fd_set
LIBRARY: winsock
-FUNCTION: int setsockopt ( SOCKET s, int level, int optname, c-string optval, int optlen ) ;
+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 ) ;
-FUNCTION: int bind ( SOCKET socket, sockaddr-in* sockaddr, int len ) ;
-FUNCTION: int listen ( SOCKET socket, int backlog ) ;
-FUNCTION: c-string inet_ntoa ( int in-addr ) ;
+FUNCTION: ushort htons ( ushort n )
+FUNCTION: ushort ntohs ( ushort n )
+FUNCTION: int bind ( SOCKET socket, sockaddr-in* sockaddr, int len )
+FUNCTION: int listen ( SOCKET socket, int backlog )
+FUNCTION: c-string inet_ntoa ( int in-addr )
FUNCTION: int getaddrinfo ( c-string nodename,
c-string servername,
addrinfo* hints,
- addrinfo** res ) ;
+ addrinfo** res )
-FUNCTION: void freeaddrinfo ( addrinfo* ai ) ;
+FUNCTION: void freeaddrinfo ( addrinfo* ai )
-FUNCTION: hostent* gethostbyname ( c-string name ) ;
-FUNCTION: int gethostname ( c-string name, int len ) ;
-FUNCTION: SOCKET socket ( int domain, int type, int protocol ) ;
-FUNCTION: int connect ( SOCKET socket, sockaddr-in* sockaddr, int addrlen ) ;
-FUNCTION: int select ( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout ) ;
-FUNCTION: int closesocket ( SOCKET s ) ;
-FUNCTION: int shutdown ( SOCKET s, int how ) ;
-FUNCTION: int send ( SOCKET s, c-string buf, int len, int flags ) ;
-FUNCTION: int recv ( SOCKET s, c-string buf, int len, int flags ) ;
+FUNCTION: hostent* gethostbyname ( c-string name )
+FUNCTION: int gethostname ( c-string name, int len )
+FUNCTION: SOCKET socket ( int domain, int type, int protocol )
+FUNCTION: int connect ( SOCKET socket, sockaddr-in* sockaddr, int addrlen )
+FUNCTION: int select ( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout )
+FUNCTION: int closesocket ( SOCKET s )
+FUNCTION: int shutdown ( SOCKET s, int how )
+FUNCTION: int send ( SOCKET s, c-string buf, int len, int flags )
+FUNCTION: int recv ( SOCKET s, c-string buf, int len, int flags )
-FUNCTION: int getsockname ( SOCKET s, sockaddr-in* address, int* addrlen ) ;
-FUNCTION: int getpeername ( SOCKET s, sockaddr-in* address, int* addrlen ) ;
+FUNCTION: int getsockname ( SOCKET s, sockaddr-in* address, int* addrlen )
+FUNCTION: int getpeername ( SOCKET s, sockaddr-in* address, int* addrlen )
-FUNCTION: protoent* getprotobyname ( c-string name ) ;
+FUNCTION: protoent* getprotobyname ( c-string name )
-FUNCTION: servent* getservbyname ( c-string name, c-string prot ) ;
-FUNCTION: servent* getservbyport ( int port, c-string prot ) ;
+FUNCTION: servent* getservbyname ( c-string name, c-string prot )
+FUNCTION: servent* getservbyport ( int port, c-string prot )
TYPEDEF: uint SERVICETYPE
TYPEDEF: void* LPWSADATA
sockaddr* addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondition,
- DWORD dwCallbackData ) ;
+ DWORD dwCallbackData )
! FUNCTION: INT WSAAddressToString ( LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFO lpProtocolInfo, LPTSTR lpszAddressString, LPDWORD lpdwAddressStringLength ) ;
-FUNCTION: int WSACleanup ( ) ;
-FUNCTION: BOOL WSACloseEvent ( WSAEVENT hEvent ) ;
+FUNCTION: int WSACleanup ( )
+FUNCTION: BOOL WSACloseEvent ( WSAEVENT hEvent )
FUNCTION: int WSAConnect ( SOCKET s,
sockaddr* name,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
- LPQOS lpGQOS ) ;
-FUNCTION: WSAEVENT WSACreateEvent ( ) ;
+ LPQOS lpGQOS )
+FUNCTION: WSAEVENT WSACreateEvent ( )
! FUNCTION: INT WSAEnumNameSpaceProviders ( LPDWORD lpdwBufferLength, LPWSANAMESPACE_INFO lpnspBuffer ) ;
FUNCTION: int WSAEnumNetworkEvents ( SOCKET s,
WSAEVENT hEventObject,
- LPWSANETWORKEVENTS lpNetworkEvents ) ;
+ LPWSANETWORKEVENTS lpNetworkEvents )
! FUNCTION: int WSAEnumProtocols ( LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer, LPDWORD lpwdBufferLength ) ;
FUNCTION: int WSAEventSelect ( SOCKET s,
WSAEVENT hEventObject,
- long lNetworkEvents ) ;
-FUNCTION: int WSAGetLastError ( ) ;
+ long lNetworkEvents )
+FUNCTION: int WSAGetLastError ( )
FUNCTION: BOOL WSAGetOverlappedResult ( SOCKET s,
LPWSAOVERLAPPED lpOverlapped,
LPDWORD lpcbTransfer,
BOOL fWait,
- LPDWORD lpdwFlags ) ;
+ LPDWORD lpdwFlags )
TYPEDEF: void* LPWSAOVERLAPPED_COMPLETION_ROUTINE
FUNCTION: int WSAIoctl ( SOCKET s,
DWORD cbOutBuffer,
LPDWORD lpcbBytesReturned,
LPWSAOVERLAPPED lpOverlapped,
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
FUNCTION: int WSARecv ( SOCKET s,
LPWSABUF lpBuffers,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
FUNCTION: int WSARecvFrom ( SOCKET s,
LPWSABUF lpBuffers,
sockaddr* lpFrom,
LPINT lpFromlen,
LPWSAOVERLAPPED lpOverlapped,
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
-FUNCTION: BOOL WSAResetEvent ( WSAEVENT hEvent ) ;
+FUNCTION: BOOL WSAResetEvent ( WSAEVENT hEvent )
FUNCTION: int WSASend ( SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
FUNCTION: int WSASendTo ( SOCKET s,
LPWSABUF lpBuffers,
sockaddr* lpTo,
int iToLen,
LPWSAOVERLAPPED lpOverlapped,
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
-FUNCTION: int WSAStartup ( WORD version, LPWSADATA out-data ) ;
+FUNCTION: int WSAStartup ( WORD version, LPWSADATA out-data )
FUNCTION: SOCKET WSASocketW ( int af,
int type,
int protocol,
LPWSAPROTOCOL_INFOW lpProtocolInfo,
GROUP g,
- DWORD flags ) ;
+ DWORD flags )
ALIAS: WSASocket WSASocketW
FUNCTION: DWORD WSAWaitForMultipleEvents ( DWORD cEvents,
WSAEVENT* lphEvents,
BOOL fWaitAll,
DWORD dwTimeout,
- BOOL fAlertable ) ;
+ BOOL fAlertable )
LIBRARY: mswsock
DWORD addr-len,
DWORD remote-len,
LPDWORD out-len,
- LPOVERLAPPED overlapped ) ;
+ LPOVERLAPPED overlapped )
FUNCTION: void GetAcceptExSockaddrs (
PVOID lpOutputBuffer,
LPINT LocalSockaddrLength,
LPSOCKADDR* RemoteSockaddr,
LPINT RemoteSockaddrLength
-) ;
+)
CONSTANT: SIO_GET_EXTENSION_FUNCTION_POINTER -939524090
${ ERROR_IO_PENDING ERROR_SUCCESS WSA_IO_PENDING } member? ;
: (maybe-winsock-exception) ( n -- winsock-exception/f )
- ! #! WSAStartup returns the error code 'n' directly
+ ! ! WSAStartup returns the error code 'n' directly
dup winsock-expected-error?
[ drop f ] [ [ ] [ n>win32-error-string ] bi \ winsock-exception boa ] if ;
: winsock-error ( -- )
maybe-winsock-exception [ throw ] when* ;
-: (throw-winsock-error) ( n -- * )
+: (winsock-error) ( n -- * )
[ ] [ n>win32-error-string ] bi winsock-exception ;
: throw-winsock-error ( -- * )
- WSAGetLastError (throw-winsock-error) ;
+ WSAGetLastError (winsock-error) ;
: winsock-error=0/f ( n/f -- )
- { 0 f } member? [ throw-winsock-error ] when ;
+ { 0 f } member? [ winsock-error ] when ;
: winsock-error!=0/f ( n/f -- )
- { 0 f } member? [ throw-winsock-error ] unless ;
+ { 0 f } member? [ winsock-error ] unless ;
! WSAStartup and WSACleanup return the error code directly
: winsock-return-check ( n/f -- )
: shutdown-winsock ( -- ) WSACleanup winsock-return-check ;
-[ init-winsock ] "windows.winsock" add-startup-hook
-[ shutdown-winsock ] "windows.winsock" add-shutdown-hook
+STARTUP-HOOK: init-winsock
+SHUTDOWN-HOOK: shutdown-winsock