Ticket #1111: rtorrent-0.8.7-ipv6-08.patch
| File rtorrent-0.8.7-ipv6-08.patch, 21.4 KB (added by anonymous, 13 months ago) |
|---|
-
rak/socket_address.h
diff -Nru rtorrent-0.8.7.orig/rak/socket_address.h rtorrent-0.8.7/rak/socket_address.h
old new 145 145 }; 146 146 }; 147 147 148 // Reme ber to set the AF_INET.148 // Remember to set the AF_INET. 149 149 150 150 class socket_address_inet { 151 151 public: … … 184 184 185 185 const sockaddr* c_sockaddr() const { return reinterpret_cast<const sockaddr*>(&m_sockaddr); } 186 186 const sockaddr_in* c_sockaddr_inet() const { return &m_sockaddr; } 187 188 #ifdef RAK_USE_INET6 189 socket_address_inet6 to_mapped_address() const; 190 #endif 187 191 188 192 bool operator == (const socket_address_inet& rhs) const; 189 193 bool operator < (const socket_address_inet& rhs) const; … … 192 196 struct sockaddr_in m_sockaddr; 193 197 }; 194 198 199 #ifdef RAK_USE_INET6 200 // Remember to set the AF_INET6. 201 202 class socket_address_inet6 { 203 public: 204 bool is_any() const { return is_port_any() && is_address_any(); } 205 bool is_valid() const { return !is_port_any() && !is_address_any(); } 206 bool is_port_any() const { return port() == 0; } 207 bool is_address_any() const { return std::memcmp(&m_sockaddr.sin6_addr, &in6addr_any, sizeof(in6_addr)) == 0; } 208 209 void clear() { std::memset(this, 0, sizeof(socket_address_inet6)); set_family(); } 210 211 uint16_t port() const { return ntohs(m_sockaddr.sin6_port); } 212 uint16_t port_n() const { return m_sockaddr.sin6_port; } 213 void set_port(uint16_t p) { m_sockaddr.sin6_port = htons(p); } 214 void set_port_n(uint16_t p) { m_sockaddr.sin6_port = p; } 215 216 in6_addr address() const { return m_sockaddr.sin6_addr; } 217 std::string address_str() const; 218 bool address_c_str(char* buf, socklen_t size) const; 219 220 void set_address(in6_addr a) { m_sockaddr.sin6_addr = a; } 221 bool set_address_str(const std::string& a) { return set_address_c_str(a.c_str()); } 222 bool set_address_c_str(const char* a); 223 224 void set_address_any() { set_port(0); set_address(in6addr_any); } 225 226 sa_family_t family() const { return m_sockaddr.sin6_family; } 227 void set_family() { m_sockaddr.sin6_family = AF_INET6; } 228 229 sockaddr* c_sockaddr() { return reinterpret_cast<sockaddr*>(&m_sockaddr); } 230 sockaddr_in6* c_sockaddr_inet6() { return &m_sockaddr; } 231 232 const sockaddr* c_sockaddr() const { return reinterpret_cast<const sockaddr*>(&m_sockaddr); } 233 const sockaddr_in6* c_sockaddr_inet6() const { return &m_sockaddr; } 234 235 socket_address normalize_address() const; 236 237 bool operator == (const socket_address_inet6& rhs) const; 238 bool operator < (const socket_address_inet6& rhs) const; 239 240 private: 241 struct sockaddr_in6 m_sockaddr; 242 }; 243 #endif 244 195 245 // Unique key for the address, excluding port numbers etc. 196 246 class socket_address_key { 197 247 public: … … 241 291 switch (family()) { 242 292 case af_inet: 243 293 return sa_inet()->is_valid(); 244 // case af_inet6: 245 // return sa_inet6().is_valid(); 294 #ifdef RAK_USE_INET6 295 case af_inet6: 296 return sa_inet6()->is_valid(); 297 #endif 246 298 default: 247 299 return false; 248 300 } … … 253 305 switch (family()) { 254 306 case af_inet: 255 307 return !sa_inet()->is_address_any(); 308 #ifdef RAK_USE_INET6 309 case af_inet6: 310 return !sa_inet6()->is_address_any(); 311 #endif 256 312 default: 257 313 return false; 258 314 } … … 263 319 switch (family()) { 264 320 case af_inet: 265 321 return sa_inet()->is_address_any(); 322 #ifdef RAK_USE_INET6 323 case af_inet6: 324 return sa_inet6()->is_address_any(); 325 #endif 266 326 default: 267 327 return true; 268 328 } … … 273 333 switch (family()) { 274 334 case af_inet: 275 335 return sa_inet()->port(); 336 #ifdef RAK_USE_INET6 337 case af_inet6: 338 return sa_inet6()->port(); 339 #endif 276 340 default: 277 341 return 0; 278 342 } … … 283 347 switch (family()) { 284 348 case af_inet: 285 349 return sa_inet()->set_port(p); 350 #ifdef RAK_USE_INET6 351 case af_inet6: 352 return sa_inet6()->set_port(p); 353 #endif 286 354 default: 287 355 break; 288 356 } … … 293 361 switch (family()) { 294 362 case af_inet: 295 363 return sa_inet()->address_str(); 364 #ifdef RAK_USE_INET6 365 case af_inet6: 366 return sa_inet6()->address_str(); 367 #endif 296 368 default: 297 369 return std::string(); 298 370 } … … 303 375 switch (family()) { 304 376 case af_inet: 305 377 return sa_inet()->address_c_str(buf, size); 378 #ifdef RAK_USE_INET6 379 case af_inet6: 380 return sa_inet6()->address_c_str(buf, size); 381 #endif 306 382 default: 307 383 return false; 308 384 } … … 314 390 sa_inet()->set_family(); 315 391 return true; 316 392 393 #ifdef RAK_USE_INET6 394 } else if (sa_inet6()->set_address_c_str(a)) { 395 sa_inet6()->set_family(); 396 return true; 397 #endif 398 317 399 } else { 318 400 return false; 319 401 } … … 325 407 switch(family()) { 326 408 case af_inet: 327 409 return sizeof(sockaddr_in); 410 #ifdef RAK_USE_INET6 411 case af_inet6: 412 return sizeof(sockaddr_in6); 413 #endif 328 414 default: 329 415 return 0; 330 416 } … … 349 435 switch (family()) { 350 436 case af_inet: 351 437 return *sa_inet() == *rhs.sa_inet(); 352 // case af_inet6: 353 // return *sa_inet6() == *rhs.sa_inet6(); 438 #ifdef RAK_USE_INET6 439 case af_inet6: 440 return *sa_inet6() == *rhs.sa_inet6(); 441 #endif 354 442 default: 355 443 throw std::logic_error("socket_address::operator == (rhs) invalid type comparison."); 356 444 } … … 364 452 switch (family()) { 365 453 case af_inet: 366 454 return *sa_inet() < *rhs.sa_inet(); 367 // case af_inet6: 368 // return *sa_inet6() < *rhs.sa_inet6(); 455 #ifdef RAK_USE_INET6 456 case af_inet6: 457 return *sa_inet6() < *rhs.sa_inet6(); 458 #endif 369 459 default: 370 460 throw std::logic_error("socket_address::operator < (rhs) invalid type comparison."); 371 461 } … … 391 481 return inet_pton(AF_INET, a, &m_sockaddr.sin_addr); 392 482 } 393 483 484 #ifdef RAK_USE_INET6 485 inline socket_address_inet6 486 socket_address_inet::to_mapped_address() const { 487 uint32_t addr32[4]; 488 addr32[0] = 0; 489 addr32[1] = 0; 490 addr32[2] = htonl(0xffff); 491 addr32[3] = m_sockaddr.sin_addr.s_addr; 492 493 socket_address_inet6 sa; 494 sa.clear(); 495 sa.set_address(*reinterpret_cast<in6_addr *>(addr32)); 496 sa.set_port_n(m_sockaddr.sin_port); 497 return sa; 498 } 499 #endif 500 394 501 inline bool 395 502 socket_address_inet::operator == (const socket_address_inet& rhs) const { 396 503 return … … 406 513 m_sockaddr.sin_port < rhs.m_sockaddr.sin_port); 407 514 } 408 515 516 #ifdef RAK_USE_INET6 517 518 inline std::string 519 socket_address_inet6::address_str() const { 520 char buf[INET6_ADDRSTRLEN]; 521 522 if (!address_c_str(buf, INET6_ADDRSTRLEN)) 523 return std::string(); 524 525 return std::string(buf); 526 } 527 528 inline bool 529 socket_address_inet6::address_c_str(char* buf, socklen_t size) const { 530 return inet_ntop(family(), &m_sockaddr.sin6_addr, buf, size); 531 } 532 533 inline bool 534 socket_address_inet6::set_address_c_str(const char* a) { 535 return inet_pton(AF_INET6, a, &m_sockaddr.sin6_addr); 536 } 537 538 inline socket_address 539 socket_address_inet6::normalize_address() const { 540 const uint32_t *addr32 = reinterpret_cast<const uint32_t *>(m_sockaddr.sin6_addr.s6_addr); 541 if (addr32[0] == 0 && addr32[1] == 0 && addr32[2] == htonl(0xffff)) { 542 socket_address addr4; 543 addr4.sa_inet()->set_family(); 544 addr4.sa_inet()->set_address_n(addr32[3]); 545 addr4.sa_inet()->set_port_n(m_sockaddr.sin6_port); 546 return addr4; 547 } 548 return *reinterpret_cast<const socket_address*>(this); 549 } 550 551 inline bool 552 socket_address_inet6::operator == (const socket_address_inet6& rhs) const { 553 return 554 memcmp(&m_sockaddr.sin6_addr, &rhs.m_sockaddr.sin6_addr, sizeof(in6_addr)) == 0 && 555 m_sockaddr.sin6_port == rhs.m_sockaddr.sin6_port; 556 } 557 558 inline bool 559 socket_address_inet6::operator < (const socket_address_inet6& rhs) const { 560 int addr_comp = memcmp(&m_sockaddr.sin6_addr, &rhs.m_sockaddr.sin6_addr, sizeof(in6_addr)); 561 return 562 addr_comp < 0 || 563 (addr_comp == 0 || 564 m_sockaddr.sin6_port < rhs.m_sockaddr.sin6_port); 565 } 566 567 #endif 568 409 569 } 410 570 411 571 #endif -
src/command_download.cc
diff -Nru rtorrent-0.8.7.orig/src/command_download.cc rtorrent-0.8.7/src/command_download.cc
old new 340 340 if (download->download()->info()->is_private()) 341 341 throw torrent::input_error("Download is private."); 342 342 343 #ifdef RAK_USE_INET6 344 ret = std::sscanf(arg.c_str(), "[%64[^]]]:%i%c", host, &port, &dummy); 345 if (ret < 1) 346 ret = std::sscanf(arg.c_str(), "%1023[^:]:%i%c", host, &port, &dummy); 347 #else 343 348 ret = std::sscanf(arg.c_str(), "%1023[^:]:%i%c", host, &port, &dummy); 349 #endif 344 350 345 351 if (ret == 1) 346 352 port = 6881; … … 350 356 if (port < 1 || port > 65535) 351 357 throw torrent::input_error("Invalid port number."); 352 358 359 #ifdef RAK_USE_INET6 360 torrent::connection_manager()->resolver()(host, (int)rak::socket_address::pf_unspec, SOCK_STREAM, call_add_d_peer_t(download, port)); 361 #else 353 362 torrent::connection_manager()->resolver()(host, (int)rak::socket_address::pf_inet, SOCK_STREAM, call_add_d_peer_t(download, port)); 363 #endif 354 364 } 355 365 356 366 torrent::Object -
src/command_network.cc
diff -Nru rtorrent-0.8.7.orig/src/command_network.cc rtorrent-0.8.7/src/command_network.cc
old new 355 355 356 356 control->core()->push_log("The SCGI socket has not been bound to any address and likely poses a security risk."); 357 357 358 #ifdef RAK_USE_INET6 359 } else if (std::sscanf(arg.c_str(), "%1023[^:]:%i%c", address, &port, &dummy) == 2 || 360 std::sscanf(arg.c_str(), "[%64[^]]]:%i%c", address, &port, &dummy) == 2) { // [xx::xx]:port format 361 #else 358 362 } else if (std::sscanf(arg.c_str(), "%1023[^:]:%i%c", address, &port, &dummy) == 2) { 359 if ((err = rak::address_info::get_address_info(address, PF_INET, SOCK_STREAM, &ai)) != 0) 363 #endif 364 if ((err = rak::address_info::get_address_info(address,PF_UNSPEC, SOCK_STREAM, &ai)) != 0) 360 365 throw torrent::input_error("Could not bind address: " + std::string(rak::address_info::strerror(err)) + "."); 361 366 362 367 saPtr = ai->address(); -
src/command_peer.cc
diff -Nru rtorrent-0.8.7.orig/src/command_peer.cc rtorrent-0.8.7/src/command_peer.cc
old new 69 69 70 70 torrent::Object 71 71 retrieve_p_address(torrent::Peer* peer) { 72 return rak::socket_address::cast_from(peer->peer_info()->socket_address())->address_str(); 72 const rak::socket_address *addr = rak::socket_address::cast_from(peer->peer_info()->socket_address()); 73 #ifdef RAK_USE_INET6 74 if (addr->family() == rak::socket_address::af_inet6) 75 return "[" + addr->address_str() + "]"; 76 else 77 #endif 78 return addr->address_str(); 73 79 } 74 80 75 81 torrent::Object -
src/core/curl_get.cc
diff -Nru rtorrent-0.8.7.orig/src/core/curl_get.cc rtorrent-0.8.7/src/core/curl_get.cc
old new 88 88 curl_easy_setopt(m_handle, CURLOPT_NOSIGNAL, (long)1); 89 89 curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, (long)1); 90 90 curl_easy_setopt(m_handle, CURLOPT_MAXREDIRS, (long)5); 91 curl_easy_setopt(m_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 91 92 curl_easy_setopt(m_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER); 93 92 94 curl_easy_setopt(m_handle, CURLOPT_ENCODING, ""); 95 #ifdef RAK_USE_INET6 96 m_ipv6 = false; 97 #endif 93 98 94 99 m_stack->add_get(this); 95 100 } … … 107 112 m_handle = NULL; 108 113 } 109 114 115 #ifdef RAK_USE_INET6 116 void 117 CurlGet::retry_ipv6() { 118 CURL* nhandle = curl_easy_duphandle(m_handle); 119 curl_easy_setopt(nhandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); 120 curl_easy_cleanup(m_handle); 121 m_handle = nhandle; 122 m_ipv6 = true; 123 } 124 #endif 125 110 126 void 111 127 CurlGet::receive_timeout() { 112 128 return m_stack->transfer_done(m_handle, "Timed out"); -
src/core/curl_get.h
diff -Nru rtorrent-0.8.7.orig/src/core/curl_get.h rtorrent-0.8.7/src/core/curl_get.h
old new 56 56 57 57 void start(); 58 58 void close(); 59 #ifdef RAK_USE_INET6 60 bool is_using_ipv6() { return m_ipv6; } 61 void retry_ipv6(); 62 #endif 59 63 60 64 bool is_busy() const { return m_handle; } 61 65 bool is_active() const { return m_active; } … … 74 78 void receive_timeout(); 75 79 76 80 bool m_active; 81 #ifdef RAK_USE_INET6 82 bool m_ipv6; 83 #endif 77 84 78 85 rak::priority_item m_taskTimeout; 79 86 -
src/core/curl_stack.cc
diff -Nru rtorrent-0.8.7.orig/src/core/curl_stack.cc rtorrent-0.8.7/src/core/curl_stack.cc
old new 111 111 if (msg->msg != CURLMSG_DONE) 112 112 throw torrent::internal_error("CurlStack::receive_action() msg->msg != CURLMSG_DONE."); 113 113 114 #ifdef RAK_USE_INET6 115 if (msg->data.result == CURLE_COULDNT_RESOLVE_HOST) { 116 iterator itr = std::find_if(begin(), end(), rak::equal(msg->easy_handle, std::mem_fun(&CurlGet::handle))); 117 118 if (itr == end()) 119 throw torrent::internal_error("Could not find CurlGet when calling CurlStack::receive_action."); 120 121 if (!(*itr)->is_using_ipv6()) { 122 (*itr)->retry_ipv6(); 123 if (curl_multi_add_handle((CURLM*)m_handle, (*itr)->handle()) > 0) 124 throw torrent::internal_error("Error calling curl_multi_add_handle."); 125 continue; 126 } 127 } else 128 #endif 114 129 transfer_done(msg->easy_handle, msg->data.result == CURLE_OK ? NULL : curl_easy_strerror(msg->data.result)); 115 130 } 116 131 -
src/core/manager.cc
diff -Nru rtorrent-0.8.7.orig/src/core/manager.cc rtorrent-0.8.7/src/core/manager.cc
old new 301 301 int err; 302 302 rak::address_info* ai; 303 303 304 305 #ifdef RAK_USE_INET6 306 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 && 307 (err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0) 308 #else 304 309 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0) 310 #endif 305 311 throw torrent::input_error("Could not set bind address: " + std::string(rak::address_info::strerror(err)) + "."); 306 312 307 313 try { … … 335 341 int err; 336 342 rak::address_info* ai; 337 343 344 #ifdef RAK_USE_INET6 345 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 && 346 (err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0) 347 #else 338 348 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0) 349 #endif 339 350 throw torrent::input_error("Could not set local address: " + std::string(rak::address_info::strerror(err)) + "."); 340 351 341 352 try { -
src/display/window_peer_list.cc
diff -Nru rtorrent-0.8.7.orig/src/display/window_peer_list.cc rtorrent-0.8.7/src/display/window_peer_list.cc
old new 68 68 int x = 2; 69 69 int y = 0; 70 70 71 m_canvas->print(x, y, "IP"); x += 16; 71 #ifdef RAK_USE_INET6 72 m_canvas->print(x, y, "IP"); x += 25; 73 #else 74 m_canvas->print(x, y, "IP"); x += 16; 75 #endif 72 76 m_canvas->print(x, y, "UP"); x += 7; 73 77 m_canvas->print(x, y, "DOWN"); x += 7; 74 78 m_canvas->print(x, y, "PEER"); x += 7; … … 99 103 100 104 x = 0; 101 105 106 std::string ip_address = rak::socket_address::cast_from(p->address())->address_str(); 107 #ifdef RAK_USE_INET6 108 if (ip_address.size() >= 24) { 109 ip_address.replace(ip_address.begin() + 21, ip_address.end(), "..."); 110 } 111 #endif 112 102 113 m_canvas->print(x, y, "%c %s", 103 114 range.first == *m_focus ? '*' : ' ', 104 rak::socket_address::cast_from(p->address())->address_str().c_str()); 115 ip_address.c_str()); 116 #ifdef RAK_USE_INET6 117 x += 27; 118 #else 105 119 x += 18; 120 #endif 106 121 107 122 m_canvas->print(x, y, "%.1f", (double)p->up_rate()->rate() / 1024); x += 7; 108 123 m_canvas->print(x, y, "%.1f", (double)p->down_rate()->rate() / 1024); x += 7; -
src/utils/socket_fd.cc
diff -Nru rtorrent-0.8.7.orig/src/utils/socket_fd.cc rtorrent-0.8.7/src/utils/socket_fd.cc
old new 71 71 check_valid(); 72 72 int opt = p; 73 73 74 #ifdef RAK_USE_INET6 75 if (m_ipv6_socket) 76 return setsockopt(m_fd, IPPROTO_IPV6, IPV6_TCLASS, &opt, sizeof(opt)) == 0; 77 else 78 #endif 74 79 return setsockopt(m_fd, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)) == 0; 75 80 } 76 81 … … 130 135 131 136 bool 132 137 SocketFd::open_stream() { 138 #ifdef RAK_USE_INET6 139 m_fd = socket(rak::socket_address::pf_inet6, SOCK_STREAM, IPPROTO_TCP); 140 if (m_fd == -1) { 141 m_ipv6_socket = false; 142 return (m_fd = socket(rak::socket_address::pf_inet, SOCK_STREAM, IPPROTO_TCP)) != -1; 143 } 144 m_ipv6_socket = true; 145 146 int zero = 0; 147 return setsockopt(m_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) != -1; 148 #else 133 149 return (m_fd = socket(rak::socket_address::pf_inet, SOCK_STREAM, IPPROTO_TCP)) != -1; 150 #endif 134 151 } 135 152 136 153 bool 137 154 SocketFd::open_datagram() { 155 #ifdef RAK_USE_INET6 156 m_fd = socket(rak::socket_address::pf_inet6, SOCK_DGRAM, 0); 157 if (m_fd == -1) { 158 m_ipv6_socket = false; 159 return (m_fd = socket(rak::socket_address::pf_inet, SOCK_DGRAM, 0)) != -1; 160 } 161 m_ipv6_socket = true; 162 163 int zero = 0; 164 return setsockopt(m_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) != -1; 165 #else 138 166 return (m_fd = socket(rak::socket_address::pf_inet, SOCK_DGRAM, 0)) != -1; 167 #endif 139 168 } 140 169 141 170 bool … … 153 182 SocketFd::bind(const rak::socket_address& sa) { 154 183 check_valid(); 155 184 185 #ifdef RAK_USE_INET6 186 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { 187 rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); 188 return !::bind(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)); 189 } 190 #endif 156 191 return !::bind(m_fd, sa.c_sockaddr(), sa.length()); 157 192 } 158 193 … … 160 195 SocketFd::bind(const rak::socket_address& sa, unsigned int length) { 161 196 check_valid(); 162 197 198 #ifdef RAK_USE_INET6 199 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { 200 rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); 201 return !::bind(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)); 202 } 203 #endif 163 204 return !::bind(m_fd, sa.c_sockaddr(), length); 164 205 } 165 206 … … 167 208 SocketFd::connect(const rak::socket_address& sa) { 168 209 check_valid(); 169 210 211 #ifdef RAK_USE_INET6 212 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { 213 rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); 214 return !::connect(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)) || errno == EINPROGRESS; 215 } 216 #endif 170 217 return !::connect(m_fd, sa.c_sockaddr(), sa.length()) || errno == EINPROGRESS; 171 218 } 172 219 173 220 bool 221 SocketFd::getsockname(rak::socket_address *sa) { 222 check_valid(); 223 224 socklen_t len = sizeof(rak::socket_address); 225 if (::getsockname(m_fd, sa->c_sockaddr(), &len)) { 226 return false; 227 } 228 229 #ifdef RAK_USE_INET6 230 if (m_ipv6_socket && sa->family() == rak::socket_address::af_inet6) { 231 *sa = sa->sa_inet6()->normalize_address(); 232 } 233 #endif 234 235 return true; 236 } 237 238 bool 174 239 SocketFd::listen(int size) { 175 240 check_valid(); 176 241 … … 182 247 check_valid(); 183 248 socklen_t len = sizeof(rak::socket_address); 184 249 250 #ifdef RAK_USE_INET6 251 if (sa == NULL) { 252 return SocketFd(::accept(m_fd, NULL, &len)); 253 } 254 int fd = ::accept(m_fd, sa->c_sockaddr(), &len); 255 if (fd != -1 && m_ipv6_socket && sa->family() == rak::socket_address::af_inet6) { 256 *sa = sa->sa_inet6()->normalize_address(); 257 } 258 return SocketFd(fd); 259 #else 185 260 return SocketFd(::accept(m_fd, sa != NULL ? sa->c_sockaddr() : NULL, &len)); 261 #endif 186 262 } 187 263 188 264 // unsigned int -
src/utils/socket_fd.h
diff -Nru rtorrent-0.8.7.orig/src/utils/socket_fd.h rtorrent-0.8.7/src/utils/socket_fd.h
old new 80 80 bool bind(const rak::socket_address& sa); 81 81 bool bind(const rak::socket_address& sa, unsigned int length); 82 82 bool connect(const rak::socket_address& sa); 83 bool getsockname(rak::socket_address* sa); 83 84 84 85 bool listen(int size); 85 86 SocketFd accept(rak::socket_address* sa); … … 91 92 inline void check_valid() const; 92 93 93 94 int m_fd; 95 #ifdef RAK_USE_INET6 96 bool m_ipv6_socket; 97 #endif 94 98 }; 95 99 96 100 }
