Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ipv6/src/external/enet/patches/0003-using-address-family-in-functions.patch @ 7389

Last change on this file since 7389 was 7389, checked in by adrfried, 14 years ago

fix some stuff

File size: 11.8 KB
RevLine 
[7389]1From af3c0910bd25d73b1a3c06bbfa4e0a3c6b96ddc5 Mon Sep 17 00:00:00 2001
[7378]2From: Adrian Friedli <adi@koalatux.ch>
3Date: Mon, 6 Sep 2010 14:58:50 +0200
4Subject: [PATCH 3/4] using address family in functions
5
6---
7 host.c              |    4 +-
8 include/enet/enet.h |   22 +++++++++---
9 protocol.c          |    5 ++-
10 unix.c              |   87 ++++++++++++++++++++++++++++++++------------------
11 4 files changed, 77 insertions(+), 41 deletions(-)
12
13diff --git a/host.c b/host.c
14index 8bb2433..9ccf894 100644
15--- a/host.c
16+++ b/host.c
17@@ -48,8 +48,8 @@ enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelL
18     }
19     memset (host -> peers, 0, peerCount * sizeof (ENetPeer));
20 
21-    host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM);
22-    if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0))
23+    host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM, ENET_IPV6);
24+    if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address, ENET_IPV6) < 0))
25     {
26        if (host -> socket != ENET_SOCKET_NULL)
27          enet_socket_destroy (host -> socket);
28diff --git a/include/enet/enet.h b/include/enet/enet.h
[7389]29index d3ca971..7f5876f 100644
[7378]30--- a/include/enet/enet.h
31+++ b/include/enet/enet.h
32@@ -82,6 +82,16 @@ typedef struct _ENetAddress
33 } ENetAddress;
34 
35 /**
36+ * The address family type.
37+ */
38+typedef enum _ENetAddressFamily
39+{
40+    ENET_NO_ADDRESS_FAMILY = 0,
[7389]41+    ENET_IPV4 = (1 << 0),
42+    ENET_IPV6 = (1 << 1)
[7378]43+} ENetAddressFamily;
44+
45+/**
46  * Packet flag bit constants.
47  *
48  * The host must be specified in network byte-order, and the port must be in
49@@ -445,13 +455,13 @@ ENET_API void enet_time_set (enet_uint32);
50 /** @defgroup socket ENet socket functions
51     @{
52 */
53-ENET_API ENetSocket enet_socket_create (ENetSocketType);
54-ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *);
55+ENET_API ENetSocket enet_socket_create (ENetSocketType, ENetAddressFamily);
56+ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *, ENetAddressFamily);
57 ENET_API int        enet_socket_listen (ENetSocket, int);
58-ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
59-ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *);
60-ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
61-ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
62+ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *, ENetAddressFamily);
63+ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *, ENetAddressFamily);
64+ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t, ENetAddressFamily);
65+ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t, ENetAddressFamily);
66 ENET_API int        enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
67 ENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int);
68 ENET_API void       enet_socket_destroy (ENetSocket);
69diff --git a/protocol.c b/protocol.c
70index 930835e..4c4850a 100644
71--- a/protocol.c
72+++ b/protocol.c
73@@ -1046,7 +1046,8 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
74        receivedLength = enet_socket_receive (host -> socket,
75                                              & host -> receivedAddress,
76                                              & buffer,
77-                                             1);
78+                                             1,
79+                                             ENET_IPV6);
80 
81        if (receivedLength < 0)
82          return -1;
83@@ -1509,7 +1510,7 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch
84 
85         currentPeer -> lastSendTime = host -> serviceTime;
86 
87-        sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount);
88+        sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount, ENET_IPV6);
89 
90         enet_protocol_remove_sent_unreliable_commands (currentPeer);
91 
92diff --git a/unix.c b/unix.c
93index de032bb..13a24d8 100644
94--- a/unix.c
95+++ b/unix.c
96@@ -71,7 +71,28 @@ enet_time_set (enet_uint32 newTimeBase)
97     timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase;
98 }
99 
100-static int
101+static enet_uint16
102+enet_af (ENetAddressFamily family)
103+{
104+    if (family == ENET_IPV4)
105+        return AF_INET;
106+    if (family == ENET_IPV6)
107+        return AF_INET6;
108+    return 0;
109+}
110+
111+static socklen_t
112+enet_sa_size (ENetAddressFamily family)
113+{
114+    if (family == ENET_IPV4)
115+        return sizeof (struct sockaddr_in);
116+    if (family == ENET_IPV6)
117+        return sizeof (struct sockaddr_in6);
118+    return 0;
119+}
120+
121+
122+static ENetAddressFamily
123 enet_address_set_address (ENetAddress * address, const struct sockaddr * sin)
124 {
125     memset (address, 0, sizeof (ENetAddress));
126@@ -80,32 +101,31 @@ enet_address_set_address (ENetAddress * address, const struct sockaddr * sin)
127         address -> host = enet_address_map4 ((((struct sockaddr_in *) sin) -> sin_addr.s_addr));
128         //address -> scopeID = 0;
129         address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in *) sin) -> sin_port);
130-        return 0;
131+        return ENET_IPV4;
132     }
133     if (sin -> sa_family == AF_INET6)
134     {
135         address -> host = * (ENetHostAddress *) & ((struct sockaddr_in6 *) sin) -> sin6_addr;
136         address -> scopeID = ((struct sockaddr_in6 *) sin) -> sin6_scope_id;
137         address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in6 *) sin) -> sin6_port);
138-        return 0;
139+        return ENET_IPV6;
140     }
141-    return -1;
142+    return ENET_NO_ADDRESS_FAMILY;
143 }
144 
145 static int
146-enet_address_set_sin (struct sockaddr * sin, const ENetAddress * address, sa_family_t family)
147+enet_address_set_sin (struct sockaddr * sin, const ENetAddress * address, ENetAddressFamily family)
148 {
149-    if (family == AF_INET)
150+    memset (sin, 0, enet_sa_size(family));
151+    if (family == ENET_IPV4)
152     {
153-        memset (sin, 0, sizeof (struct sockaddr_in));
154         ((struct sockaddr_in *) sin) -> sin_family = AF_INET;
155         ((struct sockaddr_in *) sin) -> sin_addr = * (struct in_addr *) & address -> host.addr[12];
156         ((struct sockaddr_in *) sin) -> sin_port = ENET_HOST_TO_NET_16 (address -> port);
157         return 0;
158     }
159-    else if (family == AF_INET6)
160+    else if (family == ENET_IPV6)
161     {
162-        memset (sin, 0, sizeof (struct sockaddr_in6));
163         ((struct sockaddr_in6 *) sin) -> sin6_family = AF_INET6;
164         ((struct sockaddr_in6 *) sin) -> sin6_addr = * (struct in6_addr *) & address -> host;
165         ((struct sockaddr_in6 *) sin) -> sin6_scope_id = address -> scopeID;
166@@ -132,7 +152,7 @@ enet_address_set_host (ENetAddress * address, const char * name)
167 
168     for (res = result; res != NULL; res = res -> ai_next)
169     {
170-        if ( !enet_address_set_address(address, res -> ai_addr) )
171+        if ( enet_address_set_address(address, res -> ai_addr) != ENET_NO_ADDRESS_FAMILY )
172             break;
173     }
174 
175@@ -147,9 +167,9 @@ static int
176 enet_address_get_host_x (const ENetAddress * address, char * name, size_t nameLength, int flags)
177 {
178     struct sockaddr_storage sin;
179-    enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
180+    enet_address_set_sin((struct sockaddr *) & sin, address, ENET_IPV6);
181 
182-    if ( getnameinfo((struct sockaddr *) & sin, sizeof(struct sockaddr_in6), name, nameLength, NULL, 0, flags))
183+    if ( getnameinfo((struct sockaddr *) & sin, enet_sa_size (ENET_IPV6), name, nameLength, NULL, 0, flags))
184         return -1;
185 
186     return 0;
187@@ -168,21 +188,21 @@ enet_address_get_host (const ENetAddress * address, char * name, size_t nameLeng
188 }
189 
190 int
191-enet_socket_bind (ENetSocket socket, const ENetAddress * address)
192+enet_socket_bind (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
193 {
194     struct sockaddr_storage sin;
195 
196     if (address != NULL)
197     {
198-        enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
199+        enet_address_set_sin((struct sockaddr *) & sin, address, family);
200     }
201     else
202     {
203         ENetAddress address_ = { ENET_HOST_ANY, 0, 0 };
204-        enet_address_set_sin((struct sockaddr *) & sin, & address_, AF_INET6);
205+        enet_address_set_sin((struct sockaddr *) & sin, & address_, family);
206     }
207 
208-    return bind (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in6));
209+    return bind (socket, (struct sockaddr *) & sin, enet_sa_size(family));
210 }
211 
212 int
213@@ -192,13 +212,16 @@ enet_socket_listen (ENetSocket socket, int backlog)
214 }
215 
216 ENetSocket
217-enet_socket_create (ENetSocketType type)
218+enet_socket_create (ENetSocketType type, ENetAddressFamily family)
219 {
220-    ENetSocket sock = socket (AF_INET6, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
221+    ENetSocket sock = socket (enet_af (family), type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
222 
223 #ifdef IPV6_V6ONLY
224-    int value = 0;
225-    setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, & value, sizeof (int));
226+    if (family == ENET_IPV6)
227+    {
228+        int value = 0;
229+        setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, & value, sizeof (int));
230+    }
231 #endif // IPV6_V6ONLY
232 
233     return sock;
234@@ -241,25 +264,25 @@ enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value)
235 }
236 
237 int
238-enet_socket_connect (ENetSocket socket, const ENetAddress * address)
239+enet_socket_connect (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
240 {
241     struct sockaddr_storage sin;
242-    enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
243+    enet_address_set_sin((struct sockaddr *) & sin, address, family);
244 
245-    return connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in6));
246+    return connect (socket, (struct sockaddr *) & sin, enet_sa_size (family));
247 }
248 
249 ENetSocket
250-enet_socket_accept (ENetSocket socket, ENetAddress * address)
251+enet_socket_accept (ENetSocket socket, ENetAddress * address, ENetAddressFamily family)
252 {
253     int result;
254     struct sockaddr_storage sin;
255-    socklen_t sinLength = sizeof (struct sockaddr_in6);
256+    socklen_t sinLength = enet_sa_size (family);
257 
258     result = accept (socket,
259                      address != NULL ? (struct sockaddr *) & sin : NULL,
260                      address != NULL ? & sinLength : NULL);
261-   
262+
263     if (result == -1)
264       return ENET_SOCKET_NULL;
265 
266@@ -281,7 +304,8 @@ int
267 enet_socket_send (ENetSocket socket,
268                   const ENetAddress * address,
269                   const ENetBuffer * buffers,
270-                  size_t bufferCount)
271+                  size_t bufferCount,
272+                  ENetAddressFamily family)
273 {
274     struct msghdr msgHdr;
275     struct sockaddr_storage sin;
276@@ -291,9 +315,9 @@ enet_socket_send (ENetSocket socket,
277 
278     if (address != NULL)
279     {
280-        enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
281+        enet_address_set_sin((struct sockaddr *) & sin, address, family);
282         msgHdr.msg_name = & sin;
283-        msgHdr.msg_namelen = sizeof (struct sockaddr_in6);
284+        msgHdr.msg_namelen = enet_sa_size (family);
285     }
286 
287     msgHdr.msg_iov = (struct iovec *) buffers;
288@@ -316,7 +340,8 @@ int
289 enet_socket_receive (ENetSocket socket,
290                      ENetAddress * address,
291                      ENetBuffer * buffers,
292-                     size_t bufferCount)
293+                     size_t bufferCount,
294+                     ENetAddressFamily family)
295 {
296     struct msghdr msgHdr;
297     struct sockaddr_storage sin;
298@@ -327,7 +352,7 @@ enet_socket_receive (ENetSocket socket,
299     if (address != NULL)
300     {
301         msgHdr.msg_name = & sin;
302-        msgHdr.msg_namelen = sizeof (struct sockaddr_in6);
303+        msgHdr.msg_namelen = enet_sa_size (family);
304     }
305 
306     msgHdr.msg_iov = (struct iovec *) buffers;
307--
3081.7.1
309
Note: See TracBrowser for help on using the repository browser.