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