/******************************************************************************* * Copyright (c) 2009, 2014 IBM Corp. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Ian Craggs - initial implementation and documentation * Ian Craggs - async client updates *******************************************************************************/ #if !defined(SOCKET_H) #define SOCKET_H #include #if defined(WIN32) || defined(WIN64) #include #include #define MAXHOSTNAMELEN 256 #if !defined(SSLSOCKET_H) #undef EAGAIN #define EAGAIN WSAEWOULDBLOCK #undef EINTR #define EINTR WSAEINTR #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef ENOTCONN #define ENOTCONN WSAENOTCONN #undef ECONNRESET #define ECONNRESET WSAECONNRESET #undef ETIMEDOUT #define ETIMEDOUT WAIT_TIMEOUT #endif #define ioctl ioctlsocket #define socklen_t int #else #define INVALID_SOCKET SOCKET_ERROR #include #if !defined(_WRS_KERNEL) #include #include #include #include #else #include #endif #include #include #include #include #include #include #include #include #include #define ULONG size_t #endif /** socket operation completed successfully */ #define TCPSOCKET_COMPLETE 0 #if !defined(SOCKET_ERROR) /** error in socket operation */ #define SOCKET_ERROR -1 #endif /** must be the same as SOCKETBUFFER_INTERRUPTED */ #define TCPSOCKET_INTERRUPTED -22 #define SSL_FATAL -3 #if !defined(INET6_ADDRSTRLEN) #define INET6_ADDRSTRLEN 46 /** only needed for gcc/cygwin on windows */ #endif #if !defined(max) #define max(A,B) ( (A) > (B) ? (A):(B)) #endif #include "LinkedList.h" /*BE def FD_SET { 128 n8 "data" } def SOCKETS { FD_SET "rset" FD_SET "rset_saved" n32 dec "maxfdp1" n32 ptr INTList "clientsds" n32 ptr INTItem "cur_clientsds" n32 ptr INTList "connect_pending" n32 ptr INTList "write_pending" FD_SET "pending_wset" } BE*/ /** * Structure to hold all socket data for the module */ typedef struct { fd_set rset, /**< socket read set (see select doc) */ rset_saved; /**< saved socket read set */ int maxfdp1; /**< max descriptor used +1 (again see select doc) */ List* clientsds; /**< list of client socket descriptors */ ListElement* cur_clientsds; /**< current client socket descriptor (iterator) */ List* connect_pending; /**< list of sockets for which a connect is pending */ List* write_pending; /**< list of sockets for which a write is pending */ fd_set pending_wset; /**< socket pending write set for select */ } Sockets; void Socket_outInitialize(void); void Socket_outTerminate(void); int Socket_getReadySocket(int more_work, struct timeval *tp); int Socket_getch(int socket, char* c); char *Socket_getdata(int socket, size_t bytes, size_t* actual_len); int Socket_putdatas(int socket, char* buf0, size_t buf0len, int count, char** buffers, size_t* buflens, int* frees); void Socket_close(int socket); int Socket_new(char* addr, int port, int* socket); int Socket_noPendingWrites(int socket); char* Socket_getpeer(int sock); void Socket_addPendingWrite(int socket); void Socket_clearPendingWrite(int socket); typedef void Socket_writeComplete(int socket); void Socket_setWriteCompleteCallback(Socket_writeComplete*); #endif /* SOCKET_H */