1 #ifndef SOCKET_H_INCLUDED
2 #define SOCKET_H_INCLUDED
4 #include <netinet/in.h>
6 #include "xmlrpc-c/abyss.h"
8 #include <netinet/in.h>
10 #define IPB1(x) (((unsigned char *)(&x))[0])
11 #define IPB2(x) (((unsigned char *)(&x))[1])
12 #define IPB3(x) (((unsigned char *)(&x))[2])
13 #define IPB4(x) (((unsigned char *)(&x))[3])
15 typedef struct in_addr TIPAddr;
17 typedef void SocketDestroyImpl(TSocket * const socketP);
19 typedef void SocketWriteImpl(TSocket * const socketP,
20 const unsigned char * const buffer,
22 abyss_bool * const failedP);
24 typedef uint32_t SocketReadImpl(TSocket * const socketP,
28 typedef abyss_bool SocketConnectImpl(TSocket * const socketP,
29 TIPAddr * const addrP,
30 uint16_t const portNumber);
32 typedef abyss_bool SocketBindImpl(TSocket * const socketP,
33 TIPAddr * const addrP,
34 uint16_t const portNumber);
36 typedef abyss_bool SocketListenImpl(TSocket * const socketP,
37 uint32_t const backlog);
39 typedef void SocketAcceptImpl(TSocket * const listenSocketP,
40 abyss_bool * const connectedP,
41 abyss_bool * const failedP,
42 TSocket ** const acceptedSocketPP,
43 TIPAddr * const ipAddrP);
45 typedef uint32_t SocketErrorImpl(TSocket * const socketP);
47 typedef uint32_t SocketWaitImpl(TSocket * const socketP,
50 uint32_t const timems);
52 typedef uint32_t SocketAvailableReadBytesImpl(TSocket * const socketP);
54 typedef void SocketGetPeerNameImpl(TSocket * const socketP,
55 TIPAddr * const ipAddrP,
56 uint16_t * const portNumberP,
57 abyss_bool * const successP);
60 SocketDestroyImpl * destroy;
61 SocketWriteImpl * write;
62 SocketReadImpl * read;
63 SocketConnectImpl * connect;
64 SocketBindImpl * bind;
65 SocketListenImpl * listen;
66 SocketAcceptImpl * accept;
67 SocketErrorImpl * error;
68 SocketWaitImpl * wait;
69 SocketAvailableReadBytesImpl * availableReadBytes;
70 SocketGetPeerNameImpl * getPeerName;
75 /* With both background and foreground use of sockets, and
76 background being both fork and pthread, it is very easy to
77 screw up socket lifetime and try to destroy twice. We use
78 this signature to help catch such bugs.
81 struct TSocketVtbl vtbl;
84 #define TIME_INFINITE 0xffffffff
86 extern abyss_bool SocketTraceIsActive;
95 SocketCreate(const struct TSocketVtbl * const vtblP,
97 TSocket ** const socketPP);
100 SocketWrite(TSocket * const socketP,
101 const unsigned char * const buffer,
103 abyss_bool * const failedP);
106 SocketRead(TSocket * const socketP,
107 unsigned char * const buffer,
111 SocketConnect(TSocket * const socketP,
112 TIPAddr * const addrP,
113 uint16_t const portNumber);
116 SocketBind(TSocket * const socketP,
117 TIPAddr * const addrP,
118 uint16_t const portNumber);
121 SocketListen(TSocket * const socketP,
122 uint32_t const backlog);
125 SocketAccept(TSocket * const listenSocketP,
126 abyss_bool * const connectedP,
127 abyss_bool * const failedP,
128 TSocket ** const acceptedSocketP,
129 TIPAddr * const ipAddrP);
132 SocketWait(TSocket * const socketP,
135 uint32_t const timems);
138 SocketAvailableReadBytes(TSocket * const socketP);
141 SocketGetPeerName(TSocket * const socketP,
142 TIPAddr * const ipAddrP,
143 uint16_t * const portNumberP,
144 abyss_bool * const successP);
147 SocketError(TSocket * const socketP);