Revision: 7217
http://playerstage.svn.sourceforge.net/playerstage/?rev=7217&view=rev
Author: thjc
Date: 2008-12-28 07:18:36 +0000 (Sun, 28 Dec 2008)
Log Message:
-----------
Merge from trunk of 7167-7168:
Allow both IPv4 and IPv6 addresses in libplayerc server address spec
Added #ifdef for AF_INET6, to handle old systems that don't define it
Modified Paths:
--------------
code/player/branches/release-2-1-patches/client_libs/libplayerc/client.c
Property Changed:
----------------
code/player/branches/release-2-1-patches/
Property changes on: code/player/branches/release-2-1-patches
___________________________________________________________________
Modified: svn:mergeinfo
- /code/player/trunk:7062,7081,7166
+ /code/player/trunk:7062,7081,7166-7168
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc/client.c
===================================================================
--- code/player/branches/release-2-1-patches/client_libs/libplayerc/client.c
2008-12-28 01:56:00 UTC (rev 7216)
+++ code/player/branches/release-2-1-patches/client_libs/libplayerc/client.c
2008-12-28 07:18:36 UTC (rev 7217)
@@ -212,7 +212,11 @@
// Connect to the server
int playerc_client_connect(playerc_client_t *client)
{
- struct hostent* entp;
+#if defined(HAVE_GETADDRINFO)
+ struct addrinfo* addr_ptr = NULL;
+#else
+ struct hostent* entp = NULL;
+#endif
char banner[PLAYER_IDENT_STRLEN];
int old_flags;
int ret;
@@ -274,6 +278,34 @@
#endif
// Construct server address
+
+ memset(&client->server, 0, sizeof(client->server));
+ client->server.sin_family = AF_INET;
+ client->server.sin_port = htons(client->port);
+#if defined(HAVE_GETADDRINFO)
+ if (getaddrinfo(client->host, NULL, NULL, &addr_ptr) != 0)
+ {
+ playerc_client_disconnect(client);
+ PLAYERC_ERR("getaddrinfo() failed with error");
+ return -1;
+ }
+ assert(addr_ptr);
+ assert(addr_ptr->ai_addr);
+#ifdef AF_INET6
+ if (((addr_ptr->ai_addr->sa_family) != AF_INET) &&
+ ((addr_ptr->ai_addr->sa_family) != AF_INET6))
+#else
+ if ((addr_ptr->ai_addr->sa_family) != AF_INET)
+#endif
+ {
+ playerc_client_disconnect(client);
+ PLAYERC_ERR("unsupported internet address family");
+ return -1;
+ }
+ client->server.sin_addr.s_addr = ((struct sockaddr_in
*)(addr_ptr->ai_addr))->sin_addr.s_addr;
+ freeaddrinfo(addr_ptr);
+ addr_ptr = NULL;
+#else
entp = gethostbyname(client->host);
if (entp == NULL)
{
@@ -281,10 +313,9 @@
PLAYERC_ERR1("gethostbyname failed with error [%s]", strerror(errno));
return -1;
}
- client->server.sin_family = PF_INET;
- memcpy(&client->server.sin_addr, entp->h_addr_list[0], entp->h_length);
- client->server.sin_port = htons(client->port);
-
+ assert(entp->h_length <= sizeof (client->server.sin_addr));
+ memcpy(&(client->server.sin_addr), entp->h_addr_list[0], entp->h_length);
+#endif
// Connect the socket
/*
t = client->request_timeout;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit