aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLee Salzman <[email protected]>2017-05-06 14:55:03 -0400
committerLee Salzman <[email protected]>2017-05-06 14:55:03 -0400
commit3ae5af4548d4d0fbf9335f415d14897ce231a5a1 (patch)
treef998314a5e7d1388718d8d120a7e42f52b12cfdf
parentf46fee0acc8e243b2b6910b09693f93c3aad775f (diff)
downloadenet-3ae5af4548d4d0fbf9335f415d14897ce231a5a1.tar.gz
enet-3ae5af4548d4d0fbf9335f415d14897ce231a5a1.zip
add portable enet_address_set_host_ip that can properly parse broadcast address
-rw-r--r--include/enet/enet.h11
-rw-r--r--unix.c22
-rw-r--r--win32.c34
3 files changed, 52 insertions, 15 deletions
diff --git a/include/enet/enet.h b/include/enet/enet.h
index 650b199..c762453 100644
--- a/include/enet/enet.h
+++ b/include/enet/enet.h
@@ -509,6 +509,17 @@ ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSock
/** @defgroup Address ENet address functions
@{
*/
+
+/** Attempts to parse the printable form of the IP address in the parameter hostName
+ and sets the host field in the address parameter if successful.
+ @param address destination to store the parsed IP address
+ @param hostName IP address to parse
+ @retval 0 on success
+ @retval < 0 on failure
+ @returns the address of the given hostName in address on success
+*/
+ENET_API int enet_address_set_host_ip (ENetAddress * address, const char * hostName);
+
/** Attempts to resolve the host named by the parameter hostName and sets
the host field in the address parameter if successful.
@param address destination to store resolved address
diff --git a/unix.c b/unix.c
index b3cadd0..c36a082 100644
--- a/unix.c
+++ b/unix.c
@@ -102,6 +102,19 @@ enet_time_set (enet_uint32 newTimeBase)
}
int
+enet_address_set_host_ip (ENetAddress * address, const char * name)
+{
+#ifdef HAS_INET_PTON
+ if (! inet_pton (AF_INET, name, & address -> host))
+#else
+ if (! inet_aton (name, (struct in_addr *) & address -> host))
+#endif
+ return -1;
+
+ return 0;
+}
+
+int
enet_address_set_host (ENetAddress * address, const char * name)
{
#ifdef HAS_GETADDRINFO
@@ -153,14 +166,7 @@ enet_address_set_host (ENetAddress * address, const char * name)
}
#endif
-#ifdef HAS_INET_PTON
- if (! inet_pton (AF_INET, name, & address -> host))
-#else
- if (! inet_aton (name, (struct in_addr *) & address -> host))
-#endif
- return -1;
-
- return 0;
+ return enet_address_set_host_ip (address, name);
}
int
diff --git a/win32.c b/win32.c
index 5cc1679..81175a4 100644
--- a/win32.c
+++ b/win32.c
@@ -60,6 +60,32 @@ enet_time_set (enet_uint32 newTimeBase)
}
int
+enet_address_set_host_ip (ENetAddress * address, const char * name)
+{
+ enet_uint8 vals [4] = { 0, 0, 0, 0 };
+ int i;
+
+ for (i = 0; i < 4; ++ i)
+ {
+ const char * next = name + 1;
+ if (* name != '0')
+ {
+ long val = strtol (name, (char **) & next, 10);
+ if (val < 0 || val > 255 || next == name || next - name > 3)
+ return -1;
+ vals [i] = (enet_uint8) val;
+ }
+
+ if (* next != (i < 3 ? '.' : '\0'))
+ return -1;
+ name = next + 1;
+ }
+
+ memcpy (& address -> host, vals, sizeof (enet_uint32));
+ return 0;
+}
+
+int
enet_address_set_host (ENetAddress * address, const char * name)
{
struct hostent * hostEntry;
@@ -67,13 +93,7 @@ enet_address_set_host (ENetAddress * address, const char * name)
hostEntry = gethostbyname (name);
if (hostEntry == NULL ||
hostEntry -> h_addrtype != AF_INET)
- {
- unsigned long host = inet_addr (name);
- if (host == INADDR_NONE)
- return -1;
- address -> host = host;
- return 0;
- }
+ return enet_address_set_host_ip (address, name);
address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0];