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
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to