/*++ Copyright (c) 1995 Microsoft Corporation Module Name: iwinsock.hxx Abstract: Contains prototypes for indirected sockets functions Author: Richard L Firth (rfirth) 12-Apr-1995 Revision History: 12-Apr-1995 rfirth Created 08-May-1996 arthurbi Moved into SOCKET_FUNC_ARRAY in order to supports Socks. --*/ #if !defined(_IWINSOCK_) #define _WINSOCK_ #if defined(__cplusplus) extern "C" { #endif // // includes // #include #include #include #include #include // // prototypes // BOOL IwinsockInitialize( VOID ); VOID IwinsockTerminate( VOID ); DWORD LoadWinsock( VOID ); VOID UnloadWinsock( BOOL fOverrideRefCount = FALSE ); DWORD SafeCloseSocket( IN SOCKET Socket ); BOOL ParseHostName( IN LPSTR lpHostName, IN DWORD cchHostName, OUT LPBOOL lpbIsLiteral, OUT LPBOOL lpbIsLocalHost, IN OUT LPSOCKADDR_IN6 lpSockAddr OPTIONAL ); // // sockets functions // extern SOCKET (PASCAL FAR * _I_accept)( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen ); extern int (PASCAL FAR * _I_bind)( SOCKET s, const struct sockaddr FAR *addr, int namelen ); extern int (PASCAL FAR * _I_closesocket)( SOCKET s ); extern int (PASCAL FAR * _I_connect)( SOCKET s, const struct sockaddr FAR *name, int namelen ); extern int (PASCAL FAR * _I_gethostname)( char FAR * name, int namelen ); extern LPHOSTENT (PASCAL FAR * _I_gethostbyaddr)( const char FAR * addr, int len, int type ); extern LPHOSTENT (PASCAL FAR * _I_gethostbyname)( const char FAR * lpHostName ); extern int (PASCAL FAR * _I_getsockname)( SOCKET s, struct sockaddr FAR *name, int FAR * namelen ); extern int (PASCAL FAR * _I_getsockopt)( SOCKET s, int level, int optname, char FAR * optval, int FAR *optlen ); extern u_long (PASCAL FAR * _I_htonl)( u_long hostlong ); extern u_short (PASCAL FAR * _I_htons)( u_short hostshort ); extern unsigned long (PASCAL FAR * _I_inet_addr)( const char FAR * cp ); extern char FAR * (PASCAL FAR * _I_inet_ntoa)( struct in_addr in ); extern int (PASCAL FAR * _I_ioctlsocket)( SOCKET s, long cmd, u_long FAR *argp ); extern int (PASCAL FAR * _I_listen)( SOCKET s, int backlog ); extern u_short (PASCAL FAR * _I_ntohs)( u_short netshort ); extern int (PASCAL FAR * _I_recv)( SOCKET s, char FAR * buf, int len, int flags ); extern int (PASCAL FAR * _I_WSARecv)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); extern int (PASCAL FAR * _I_recvfrom)( SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR *from, int FAR * fromlen ); extern int (PASCAL FAR * _I_select)( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout ); extern int (PASCAL FAR * _I_send)( SOCKET s, const char FAR * buf, int len, int flags ); extern int (PASCAL FAR * _I_WSASend)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); extern int (PASCAL FAR * _I_sendto)( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR *to, int tolen ); extern int (PASCAL FAR * _I_setsockopt)( SOCKET s, int level, int optname, const char FAR * optval, int optlen ); extern int (PASCAL FAR * _I_shutdown)( SOCKET s, int how ); extern SOCKET (PASCAL FAR * _I_socket)( int af, int type, int protocol ); // // WSA functions // extern int (PASCAL FAR * _I_WSAStartup)( WORD wVersionRequired, LPWSADATA lpWSAData ); extern int (PASCAL FAR * _I_WSACleanup)( void ); extern int (PASCAL FAR * _I_WSAGetLastError)( void ); extern void (PASCAL FAR * _I_WSASetLastError)( int iError ); extern int (PASCAL FAR * _I___WSAFDIsSet)( SOCKET, fd_set FAR * ); class CWrapOverlapped { WSAOVERLAPPED m_Overlapped; LONG m_dwReferenceCount; public: CWrapOverlapped() { //Don't need to zero out the overlapped struct here. // since we zero it out in the fsm's before using (see icsocket.cxx) m_dwReferenceCount = 1; } LONG Reference() { return InterlockedIncrement(&m_dwReferenceCount); } BOOL Dereference() { BOOL bRet = FALSE; LONG lResult = InterlockedDecrement(&m_dwReferenceCount); if (lResult == 0) { delete this; bRet = TRUE; } return bRet; } LPWSAOVERLAPPED GetOverlapped() { return &m_Overlapped; } friend CWrapOverlapped* GetWrapOverlappedObject(LPVOID lpAddress); }; // // address family independent APIs // extern int (PASCAL FAR * _I_getaddrinfo)( IN const char FAR * nodename, IN const char FAR * servname, IN const struct addrinfo FAR * hints, OUT struct addrinfo FAR * FAR * res ); extern void (PASCAL FAR * _I_freeaddrinfo)( IN struct addrinfo *ai ); extern int (PASCAL FAR * _I_getnameinfo)( IN const struct sockaddr FAR * sa, IN socklen_t salen, OUT char FAR * host, IN size_t hostlen, OUT char FAR * serv, IN size_t servlen, IN int flags ); extern INT (PASCAL FAR * _I_WSAStringToAddressA)( IN LPSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOA lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength ); extern INT (PASCAL FAR * _I_WSAStringToAddressW)( IN LPWSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength ); extern INT (PASCAL FAR * _I_WSAAddressToStringA)( IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOA lpProtocolInfo, IN OUT LPSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength ); // // macros // #ifndef unix #if defined(FD_ISSET) #undef FD_ISSET #endif #define FD_ISSET(fd, set) _I___WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set)) #endif /* unix */ #if INET_DEBUG VOID IWinsockCheckSockets( VOID ); #define CHECK_SOCKETS() IWinsockCheckSockets() #else #define CHECK_SOCKETS() /* NOTHING */ #endif #if defined(__cplusplus) } #endif #endif // _IWINSOCK_