OSDN Git Service

Support IPv6 in HTTP streaming.
authorLorenzo Colitti <lorenzo@google.com>
Tue, 4 Jan 2011 00:10:34 +0000 (16:10 -0800)
committerLorenzo Colitti <lorenzo@google.com>
Tue, 8 Mar 2011 23:01:15 +0000 (15:01 -0800)
Bug: 4068057
Change-Id: I1e141ec99fbfa43722eeb2e4161d56548ffc0640

media/libstagefright/HTTPStream.cpp

index 7194614..adb6d01 100644 (file)
@@ -133,15 +133,27 @@ status_t HTTPStream::connect(const char *server, int port) {
         return ERROR_ALREADY_CONNECTED;
     }
 
-    struct hostent *ent = gethostbyname(server);
-    if (ent == NULL) {
+    if (port < 0 || port > (int) USHRT_MAX) {
+        return UNKNOWN_ERROR;
+    }
+
+    char service[sizeof("65536")];
+    sprintf(service, "%d", port);
+    struct addrinfo hints, *ai;
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICSERV;
+    hints.ai_socktype = SOCK_STREAM;
+
+    int ret = getaddrinfo(server, service, &hints, &ai);
+    if (ret) {
         return ERROR_UNKNOWN_HOST;
     }
 
     CHECK_EQ(mSocket, -1);
-    mSocket = socket(AF_INET, SOCK_STREAM, 0);
+    mSocket = socket(ai[0].ai_family, ai[0].ai_socktype, ai[0].ai_protocol);
 
     if (mSocket < 0) {
+        freeaddrinfo(ai);
         return UNKNOWN_ERROR;
     }
 
@@ -153,13 +165,9 @@ status_t HTTPStream::connect(const char *server, int port) {
 
     mLock.unlock();
 
-    struct sockaddr_in addr;
-    addr.sin_family = AF_INET;
-    addr.sin_port = htons(port);
-    addr.sin_addr.s_addr = *(in_addr_t *)ent->h_addr;
-    memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
+    status_t res = MyConnect(s, ai[0].ai_addr, ai[0].ai_addrlen);
 
-    status_t res = MyConnect(s, (const struct sockaddr *)&addr, sizeof(addr));
+    freeaddrinfo(ai);
 
     mLock.lock();