X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=blobdiff_plain;f=basis%2Fwindows%2Fwinsock%2Fwinsock.factor;h=f0503114e378e6322efbc2e92cd9b502686c7241;hp=ed4738430915fd2df9310ed95960e0434c4b1b56;hb=10e78dde3637ed0adca1972c76e7f283096cdcdc;hpb=04c36279bb03bf1be75f760eca3948a9107102f5 diff --git a/basis/windows/winsock/winsock.factor b/basis/windows/winsock/winsock.factor index ed47384309..f0503114e3 100644 --- a/basis/windows/winsock/winsock.factor +++ b/basis/windows/winsock/winsock.factor @@ -1,13 +1,16 @@ ! 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 -math.parser sequences windows.com.syntax windows.errors -windows.kernel32 windows.types ; -FROM: alien.c-types => short ; +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 ; IN: windows.winsock +<< +! Some differences between Win32 and Win64 +cpu x86.64? "windows.winsock.64" "windows.winsock.32" ? use-vocab +>> + TYPEDEF: int* SOCKET : ( -- byte-array ) @@ -70,18 +73,65 @@ CONSTANT: PF_LOCAL 1 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 @@ -97,7 +147,7 @@ CONSTANT: INADDR_ANY 0 : INVALID_SOCKET ( -- n ) -1 ; inline -: SOCKET_ERROR ( -- n ) -1 ; inline +: SOCKET_ERROR ( -- n ) -1 ; inline CONSTANT: SD_RECV 0 CONSTANT: SD_SEND 1 @@ -146,57 +196,56 @@ STRUCT: timeval { sec long } { usec long } ; -STRUCT: servent - { name c-string } - { aliases void* } - { port int } - { proto c-string } ; - GENERIC: sockaddr>ip ( sockaddr -- string ) -M: sockaddr-in sockaddr>ip ( sockaddr -- string ) +M: sockaddr-in sockaddr>ip addr>> uint [ 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 ; -C-TYPE: fd_set +STRUCT: fd_set + { fd_count uint } + { fd_array SOCKET[64] } ; 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 ( void* socket, sockaddr-in* sockaddr, int len ) ; -FUNCTION: int listen ( void* 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: int connect ( void* 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 TYPEDEF: OVERLAPPED WSAOVERLAPPED TYPEDEF: WSAOVERLAPPED* LPWSAOVERLAPPED TYPEDEF: uint GROUP @@ -300,12 +349,12 @@ FUNCTION: SOCKET WSAAccept ( SOCKET s, 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, @@ -313,24 +362,25 @@ FUNCTION: int WSAConnect ( SOCKET s, 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 dwIoControlCode, LPVOID lpvInBuffer, @@ -338,36 +388,35 @@ FUNCTION: int WSAIoctl ( SOCKET s, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, - void* lpOverlapped, - void* lpCompletionRoutine ) ; + LPWSAOVERLAPPED lpOverlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) -TYPEDEF: void* LPWSAOVERLAPPED_COMPLETION_ROUTINE FUNCTION: int WSARecv ( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ; + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) FUNCTION: int WSARecvFrom ( SOCKET s, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRecvd, - LPDWORD lpFlags, - sockaddr* lpFrom, - LPINT lpFromlen, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ; - -FUNCTION: BOOL WSAResetEvent ( WSAEVENT hEvent ) ; + LPWSABUF lpBuffers, + DWORD dwBufferCount, + LPDWORD lpNumberOfBytesRecvd, + LPDWORD lpFlags, + sockaddr* lpFrom, + LPINT lpFromlen, + LPWSAOVERLAPPED lpOverlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) + +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, @@ -377,31 +426,35 @@ FUNCTION: int WSASendTo ( SOCKET s, sockaddr* lpTo, int iToLen, LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ; - - -FUNCTION: int WSAStartup ( short version, void* out-data ) ; - + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) +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 -FUNCTION: int AcceptEx ( void* listen, void* accept, void* out-buf, int recv-len, int addr-len, int remote-len, void* out-len, void* overlapped ) ; +FUNCTION: int AcceptEx ( SOCKET listen, + SOCKET accept, + PVOID out-buf, + DWORD recv-len, + DWORD addr-len, + DWORD remote-len, + LPDWORD out-len, + LPOVERLAPPED overlapped ) FUNCTION: void GetAcceptExSockaddrs ( PVOID lpOutputBuffer, @@ -412,7 +465,7 @@ FUNCTION: void GetAcceptExSockaddrs ( LPINT LocalSockaddrLength, LPSOCKADDR* RemoteSockaddr, LPINT RemoteSockaddrLength -) ; +) CONSTANT: SIO_GET_EXTENSION_FUNCTION_POINTER -939524090 @@ -424,7 +477,7 @@ ERROR: winsock-exception n string ; ${ 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 ; @@ -434,17 +487,17 @@ ERROR: winsock-exception n string ; : 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 -- ) @@ -472,5 +525,5 @@ ERROR: winsock-exception n string ; : 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