From bd0e806a61df9b67890dc3b1390db554e7468b4a Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 3 Feb 2011 16:41:34 -0800 Subject: [PATCH] Support IPv6->IPv4 fallback in HTTP streaming. Bug: 4068057 Change-Id: I425f65a99eb9e0986d9e9c0e264c3c8f61fcfdbd --- media/libstagefright/HTTPStream.cpp | 44 ++++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/media/libstagefright/HTTPStream.cpp b/media/libstagefright/HTTPStream.cpp index adb6d014f3d77..4ad1c120419af 100644 --- a/media/libstagefright/HTTPStream.cpp +++ b/media/libstagefright/HTTPStream.cpp @@ -150,31 +150,41 @@ status_t HTTPStream::connect(const char *server, int port) { } CHECK_EQ(mSocket, -1); - mSocket = socket(ai[0].ai_family, ai[0].ai_socktype, ai[0].ai_protocol); - - if (mSocket < 0) { - freeaddrinfo(ai); - return UNKNOWN_ERROR; - } - - setReceiveTimeout(30); // Time out reads after 30 secs by default mState = CONNECTING; + status_t res = -1; + struct addrinfo *tmp; + for (tmp = ai; tmp; tmp = tmp->ai_next) { + mSocket = socket(tmp->ai_family, tmp->ai_socktype, tmp->ai_protocol); + if (mSocket < 0) { + continue; + } - int s = mSocket; + setReceiveTimeout(30); // Time out reads after 30 secs by default. - mLock.unlock(); + int s = mSocket; - status_t res = MyConnect(s, ai[0].ai_addr, ai[0].ai_addrlen); + mLock.unlock(); + + res = MyConnect(s, tmp->ai_addr, tmp->ai_addrlen); + + mLock.lock(); + + if (mState != CONNECTING) { + close(s); + freeaddrinfo(ai); + return UNKNOWN_ERROR; + } + + if (res == OK) { + break; + } + + close(s); + } freeaddrinfo(ai); - mLock.lock(); - - if (mState != CONNECTING) { - return UNKNOWN_ERROR; - } - if (res != OK) { close(mSocket); mSocket = -1;