| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| /* |
| * pkix_pl_socket.h |
| * |
| * Socket Object Type Definition |
| * |
| */ |
| |
| #ifndef _PKIX_PL_SOCKET_H |
| #define _PKIX_PL_SOCKET_H |
| |
| #include <errno.h> |
| #include "pkix_pl_common.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| typedef enum { |
| SOCKET_BOUND, |
| SOCKET_LISTENING, |
| SOCKET_ACCEPTPENDING, |
| SOCKET_UNCONNECTED, |
| SOCKET_CONNECTPENDING, |
| SOCKET_CONNECTED, |
| SOCKET_SENDPENDING, |
| SOCKET_RCVPENDING, |
| SOCKET_SENDRCVPENDING, |
| SOCKET_SHUTDOWN |
| } SockStatus; |
| |
| /* This is the default port number, if none is supplied to CreateByName. */ |
| #define LDAP_PORT 389 |
| |
| /* |
| * These callbacks allow a user to substitute a counterfeit socket in places |
| * where a PKIX_PL_Socket is expected. A conforming usage will use the |
| * ListenCallback function instead of Listen, AcceptCallback instead of Accept, |
| * etc. The counterfeit socket may have special capabilites such as the |
| * ability to do proxy authentication, etc. |
| */ |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_ListenCallback)( |
| PKIX_PL_Socket *socket, |
| PKIX_UInt32 backlog, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_AcceptCallback)( |
| PKIX_PL_Socket *socket, |
| PKIX_PL_Socket **pRendezvousSock, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_ConnectContinueCallback)( |
| PKIX_PL_Socket *socket, |
| PRErrorCode *pStatus, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_SendCallback)( |
| PKIX_PL_Socket *sendSock, |
| void *buf, |
| PKIX_UInt32 bytesToWrite, |
| PKIX_Int32 *pBytesWritten, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_RecvCallback)( |
| PKIX_PL_Socket *rcvSock, |
| void *buf, |
| PKIX_UInt32 capacity, |
| PKIX_Int32 *pBytesRead, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_PollCallback)( |
| PKIX_PL_Socket *sock, |
| PKIX_Int32 *pBytesWritten, |
| PKIX_Int32 *pBytesRead, |
| void *plContext); |
| |
| typedef PKIX_Error * |
| (*pkix_pl_Socket_ShutdownCallback)( |
| PKIX_PL_Socket *socket, void *plContext); |
| |
| typedef struct PKIX_PL_Socket_CallbackStruct { |
| pkix_pl_Socket_ListenCallback listenCallback; |
| pkix_pl_Socket_AcceptCallback acceptCallback; |
| pkix_pl_Socket_ConnectContinueCallback connectcontinueCallback; |
| pkix_pl_Socket_SendCallback sendCallback; |
| pkix_pl_Socket_RecvCallback recvCallback; |
| pkix_pl_Socket_PollCallback pollCallback; |
| pkix_pl_Socket_ShutdownCallback shutdownCallback; |
| } PKIX_PL_Socket_Callback; |
| |
| struct PKIX_PL_SocketStruct { |
| PKIX_Boolean isServer; |
| PRIntervalTime timeout; /* zero for non-blocking I/O */ |
| SockStatus status; |
| PRFileDesc *clientSock; |
| PRFileDesc *serverSock; |
| void *readBuf; |
| void *writeBuf; |
| PKIX_UInt32 readBufSize; |
| PKIX_UInt32 writeBufSize; |
| PRNetAddr *netAddr; |
| PKIX_PL_Socket_Callback callbackList; |
| }; |
| |
| /* see source file for function documentation */ |
| |
| PKIX_Error *pkix_pl_Socket_RegisterSelf(void *plContext); |
| |
| PKIX_Error * |
| pkix_pl_Socket_Create( |
| PKIX_Boolean isServer, |
| PRIntervalTime timeout, /* zero for non-blocking I/O */ |
| PRNetAddr *netAddr, |
| PRErrorCode *status, |
| PKIX_PL_Socket **pSocket, |
| void *plContext); |
| |
| PKIX_Error * |
| pkix_pl_Socket_CreateByName( |
| PKIX_Boolean isServer, |
| PRIntervalTime timeout, |
| char *serverName, |
| PRErrorCode *pStatus, |
| PKIX_PL_Socket **pSocket, |
| void *plContext); |
| |
| PKIX_Error * |
| pkix_pl_Socket_CreateByHostAndPort( |
| PKIX_Boolean isServer, |
| PRIntervalTime timeout, |
| char *hostname, |
| PRUint16 portnum, |
| PRErrorCode *pStatus, |
| PKIX_PL_Socket **pSocket, |
| void *plContext); |
| |
| /* Do not use these functions directly; use their callback variants instead |
| * static PKIX_Error * |
| * pkix_pl_Socket_Listen( |
| * PKIX_PL_Socket *socket, |
| * PKIX_UInt32 backlog, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_Accept( |
| * PKIX_PL_Socket *socket, |
| * PKIX_PL_Socket **pRendezvousSock, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_ConnectContinue( |
| * PKIX_PL_Socket *socket, |
| * PRErrorCode *pStatus, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_Send( |
| * PKIX_PL_Socket *sendSock, |
| * void *buf, |
| * PKIX_UInt32 bytesToWrite, |
| * PKIX_Int32 *pBytesWritten, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_Recv( |
| * PKIX_PL_Socket *rcvSock, |
| * void *buf, |
| * PKIX_UInt32 capacity, |
| * PKIX_Int32 *pBytesRead, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_Poll( |
| * PKIX_PL_Socket *sock, |
| * PKIX_Int32 *pBytesWritten, |
| * PKIX_Int32 *pBytesRead, |
| * void *plContext); |
| * |
| * static PKIX_Error * |
| * pkix_pl_Socket_Shutdown( |
| * PKIX_PL_Socket *socket, void *plContext); |
| */ |
| |
| PKIX_Error * |
| pkix_pl_Socket_GetCallbackList( |
| PKIX_PL_Socket *socket, |
| PKIX_PL_Socket_Callback **pCallbackList, |
| void *plContext); |
| |
| PKIX_Error * |
| pkix_pl_Socket_GetPRFileDesc( |
| PKIX_PL_Socket *socket, |
| PRFileDesc **pDesc, |
| void *plContext); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _PKIX_PL_SOCKET_H */ |