Added ipv6 patch.

This commit is contained in:
rakshasa
2014-08-14 20:56:20 +09:00
parent 7537a3c2a9
commit 7007973c76
11 changed files with 339 additions and 14 deletions
+17 -1
View File
@@ -91,8 +91,13 @@ CurlGet::start() {
curl_easy_setopt(m_handle, CURLOPT_NOSIGNAL, (long)1);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, (long)1);
curl_easy_setopt(m_handle, CURLOPT_MAXREDIRS, (long)5);
curl_easy_setopt(m_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_easy_setopt(m_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
curl_easy_setopt(m_handle, CURLOPT_ENCODING, "");
#ifdef RAK_USE_INET6
m_ipv6 = false;
#endif
m_stack->add_get(this);
}
@@ -110,6 +115,17 @@ CurlGet::close() {
m_handle = NULL;
}
#ifdef RAK_USE_INET6
void
CurlGet::retry_ipv6() {
CURL* nhandle = curl_easy_duphandle(m_handle);
curl_easy_setopt(nhandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
curl_easy_cleanup(m_handle);
m_handle = nhandle;
m_ipv6 = true;
}
#endif
void
CurlGet::receive_timeout() {
return m_stack->transfer_done(m_handle, "Timed out");
+7
View File
@@ -57,6 +57,10 @@ public:
void start();
void close();
#ifdef RAK_USE_INET6
bool is_using_ipv6() { return m_ipv6; }
void retry_ipv6();
#endif
bool is_busy() const { return m_handle; }
bool is_active() const { return m_active; }
@@ -75,6 +79,9 @@ private:
void receive_timeout();
bool m_active;
#ifdef RAK_USE_INET6
bool m_ipv6;
#endif
rak::priority_item m_taskTimeout;
+17 -2
View File
@@ -132,8 +132,23 @@ CurlStack::process_done_handle() {
if (msg->msg != CURLMSG_DONE)
throw torrent::internal_error("CurlStack::receive_action() msg->msg != CURLMSG_DONE.");
transfer_done(msg->easy_handle,
msg->data.result == CURLE_OK ? NULL : curl_easy_strerror(msg->data.result));
if (msg->data.result == CURLE_COULDNT_RESOLVE_HOST) {
iterator itr = std::find_if(begin(), end(), rak::equal(msg->easy_handle, std::mem_fun(&CurlGet::handle)));
if (itr == end())
throw torrent::internal_error("Could not find CurlGet when calling CurlStack::receive_action.");
if (!(*itr)->is_using_ipv6()) {
(*itr)->retry_ipv6();
if (curl_multi_add_handle((CURLM*)m_handle, (*itr)->handle()) > 0)
throw torrent::internal_error("Error calling curl_multi_add_handle.");
}
} else {
transfer_done(msg->easy_handle,
msg->data.result == CURLE_OK ? NULL : curl_easy_strerror(msg->data.result));
}
return remaining_msgs != 0;
}
+11
View File
@@ -228,7 +228,13 @@ Manager::set_bind_address(const std::string& addr) {
int err;
rak::address_info* ai;
#ifdef RAK_USE_INET6
if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 &&
(err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0)
#else
if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0)
#endif
throw torrent::input_error("Could not set bind address: " + std::string(rak::address_info::strerror(err)) + ".");
try {
@@ -262,7 +268,12 @@ Manager::set_local_address(const std::string& addr) {
int err;
rak::address_info* ai;
#ifdef RAK_USE_INET6
if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 &&
(err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0)
#else
if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0)
#endif
throw torrent::input_error("Could not set local address: " + std::string(rak::address_info::strerror(err)) + ".");
try {