X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=blobdiff_plain;f=basis%2Fwindows%2Fwinsock%2Fwinsock.factor;h=f0503114e378e6322efbc2e92cd9b502686c7241;hp=3336c527430e32213608b1877cc53969a83489e7;hb=10e78dde3637ed0adca1972c76e7f283096cdcdc;hpb=a5397756fe92003ef6f478ae314065c62285a78c diff --git a/basis/windows/winsock/winsock.factor b/basis/windows/winsock/winsock.factor index 3336c52743..f0503114e3 100644 --- a/basis/windows/winsock/winsock.factor +++ b/basis/windows/winsock/winsock.factor @@ -1,11 +1,9 @@ ! 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 +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 << @@ -75,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 @@ -102,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 @@ -153,10 +198,10 @@ STRUCT: timeval 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 ; STRUCT: fd_set @@ -165,38 +210,39 @@ 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 @@ -303,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, @@ -316,23 +362,23 @@ 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, @@ -343,7 +389,7 @@ 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, @@ -351,7 +397,7 @@ FUNCTION: int WSARecv ( SOCKET s, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) ; + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ) FUNCTION: int WSARecvFrom ( SOCKET s, LPWSABUF lpBuffers, @@ -361,16 +407,16 @@ FUNCTION: int WSARecvFrom ( SOCKET s, 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, @@ -380,23 +426,23 @@ FUNCTION: int WSASendTo ( SOCKET s, 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 @@ -408,7 +454,7 @@ FUNCTION: int AcceptEx ( SOCKET listen, DWORD addr-len, DWORD remote-len, LPDWORD out-len, - LPOVERLAPPED overlapped ) ; + LPOVERLAPPED overlapped ) FUNCTION: void GetAcceptExSockaddrs ( PVOID lpOutputBuffer, @@ -419,7 +465,7 @@ FUNCTION: void GetAcceptExSockaddrs ( LPINT LocalSockaddrLength, LPSOCKADDR* RemoteSockaddr, LPINT RemoteSockaddrLength -) ; +) CONSTANT: SIO_GET_EXTENSION_FUNCTION_POINTER -939524090 @@ -431,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 ; @@ -441,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 -- ) @@ -479,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