SocketCore.cc 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #include "SocketCore.h"
  36. #include <unistd.h>
  37. #ifdef HAVE_IFADDRS_H
  38. # include <ifaddrs.h>
  39. #endif // HAVE_IFADDRS_H
  40. #include <cerrno>
  41. #include <cstring>
  42. #ifdef HAVE_LIBGNUTLS
  43. # include <gnutls/x509.h>
  44. #endif // HAVE_LIBGNUTLS
  45. #include "message.h"
  46. #include "a2netcompat.h"
  47. #include "DlRetryEx.h"
  48. #include "DlAbortEx.h"
  49. #include "StringFormat.h"
  50. #include "util.h"
  51. #include "TimeA2.h"
  52. #include "a2functional.h"
  53. #include "LogFactory.h"
  54. #ifdef ENABLE_SSL
  55. # include "TLSContext.h"
  56. #endif // ENABLE_SSL
  57. #ifndef __MINGW32__
  58. # define SOCKET_ERRNO (errno)
  59. #else
  60. # define SOCKET_ERRNO (WSAGetLastError())
  61. #endif // __MINGW32__
  62. #ifdef __MINGW32__
  63. # define A2_EINPROGRESS WSAEWOULDBLOCK
  64. #else
  65. # define A2_EINPROGRESS EINPROGRESS
  66. #endif // __MINGW32__
  67. #ifdef __MINGW32__
  68. # define CLOSE(X) ::closesocket(X)
  69. #else
  70. # define CLOSE(X) while(close(X) == -1 && errno == EINTR)
  71. #endif // __MINGW32__
  72. namespace aria2 {
  73. #ifdef HAVE_EPOLL
  74. SocketCore::PollMethod SocketCore::_pollMethod = SocketCore::POLL_METHOD_EPOLL;
  75. #else // !HAVE_EPOLL
  76. SocketCore::PollMethod SocketCore::_pollMethod = SocketCore::POLL_METHOD_SELECT;
  77. #endif // !HAVE_EPOLL
  78. int SocketCore::_protocolFamily = AF_UNSPEC;
  79. SharedHandle<struct sockaddr_storage> SocketCore::_bindAddr;
  80. socklen_t SocketCore::_bindAddrLen = 0;
  81. #ifdef ENABLE_SSL
  82. SharedHandle<TLSContext> SocketCore::_tlsContext;
  83. void SocketCore::setTLSContext(const SharedHandle<TLSContext>& tlsContext)
  84. {
  85. _tlsContext = tlsContext;
  86. }
  87. #endif // ENABLE_SSL
  88. SocketCore::SocketCore(int sockType):_sockType(sockType), sockfd(-1) {
  89. init();
  90. }
  91. SocketCore::SocketCore(sock_t sockfd, int sockType):_sockType(sockType), sockfd(sockfd) {
  92. init();
  93. }
  94. void SocketCore::init()
  95. {
  96. #ifdef HAVE_EPOLL
  97. _epfd = -1;
  98. #endif // HAVE_EPOLL
  99. blocking = true;
  100. secure = 0;
  101. _wantRead = false;
  102. _wantWrite = false;
  103. #ifdef HAVE_LIBSSL
  104. // for SSL
  105. ssl = NULL;
  106. #endif // HAVE_LIBSSL
  107. #ifdef HAVE_LIBGNUTLS
  108. sslSession = NULL;
  109. peekBufMax = 4096;
  110. peekBuf = 0;
  111. peekBufLength = 0;
  112. #endif //HAVE_LIBGNUTLS
  113. }
  114. SocketCore::~SocketCore() {
  115. closeConnection();
  116. #ifdef HAVE_EPOLL
  117. if(_epfd != -1) {
  118. CLOSE(_epfd);
  119. }
  120. #endif // HAVE_EPOLL
  121. #ifdef HAVE_LIBGNUTLS
  122. delete [] peekBuf;
  123. #endif // HAVE_LIBGNUTLS
  124. }
  125. template<typename T>
  126. std::string uitos(T value)
  127. {
  128. std::string str;
  129. if(value == 0) {
  130. str = "0";
  131. return str;
  132. }
  133. while(value) {
  134. char digit = value%10+'0';
  135. str.insert(str.begin(), digit);
  136. value /= 10;
  137. }
  138. return str;
  139. }
  140. static sock_t bindInternal(int family, int socktype, int protocol,
  141. const struct sockaddr* addr, socklen_t addrlen)
  142. {
  143. sock_t fd = socket(family, socktype, protocol);
  144. if(fd == (sock_t) -1) {
  145. return -1;
  146. }
  147. int sockopt = 1;
  148. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (a2_sockopt_t) &sockopt,
  149. sizeof(sockopt)) < 0) {
  150. CLOSE(fd);
  151. return -1;
  152. }
  153. if(::bind(fd, addr, addrlen) == -1) {
  154. LogFactory::getInstance()->debug("%s", strerror(errno));
  155. CLOSE(fd);
  156. return -1;
  157. }
  158. return fd;
  159. }
  160. void SocketCore::bind(uint16_t port, int flags)
  161. {
  162. closeConnection();
  163. if(flags == 0 || _bindAddr.isNull()) {
  164. struct addrinfo hints;
  165. struct addrinfo* res;
  166. memset(&hints, 0, sizeof(hints));
  167. hints.ai_family = _protocolFamily;
  168. hints.ai_socktype = _sockType;
  169. hints.ai_flags = flags;
  170. hints.ai_protocol = 0;
  171. int s;
  172. s = getaddrinfo(0, uitos(port).c_str(), &hints, &res);
  173. if(s) {
  174. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, gai_strerror(s)).str());
  175. }
  176. struct addrinfo* rp;
  177. for(rp = res; rp; rp = rp->ai_next) {
  178. sock_t fd = bindInternal(rp->ai_family, rp->ai_socktype, rp->ai_protocol,
  179. rp->ai_addr, rp->ai_addrlen);
  180. if(fd == (sock_t) -1) {
  181. continue;
  182. }
  183. sockfd = fd;
  184. break;
  185. }
  186. freeaddrinfo(res);
  187. } else {
  188. sock_t fd = bindInternal
  189. (_bindAddr->ss_family, _sockType, 0,
  190. reinterpret_cast<const struct sockaddr*>(_bindAddr.get()), _bindAddrLen);
  191. if(fd != (sock_t)-1) {
  192. sockfd = fd;
  193. }
  194. }
  195. if(sockfd == (sock_t) -1) {
  196. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, "all addresses failed").str());
  197. }
  198. }
  199. void SocketCore::bind(const struct sockaddr* addr, socklen_t addrlen)
  200. {
  201. closeConnection();
  202. sock_t fd = bindInternal(addr->sa_family, _sockType, 0, addr, addrlen);
  203. if(fd != (sock_t)-1) {
  204. sockfd = fd;
  205. }
  206. if(sockfd == (sock_t) -1) {
  207. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, strerror(errno)).str());
  208. }
  209. }
  210. void SocketCore::beginListen()
  211. {
  212. if(listen(sockfd, 1) == -1) {
  213. throw DL_ABORT_EX(StringFormat(EX_SOCKET_LISTEN, errorMsg()).str());
  214. }
  215. }
  216. SocketCore* SocketCore::acceptConnection() const
  217. {
  218. struct sockaddr_storage sockaddr;
  219. socklen_t len = sizeof(sockaddr);
  220. sock_t fd;
  221. while((fd = accept(sockfd, reinterpret_cast<struct sockaddr*>(&sockaddr), &len)) == (sock_t) -1 && SOCKET_ERRNO == EINTR);
  222. if(fd == (sock_t) -1) {
  223. throw DL_ABORT_EX(StringFormat(EX_SOCKET_ACCEPT, errorMsg()).str());
  224. }
  225. return new SocketCore(fd, _sockType);
  226. }
  227. void SocketCore::getAddrInfo(std::pair<std::string, uint16_t>& addrinfo) const
  228. {
  229. struct sockaddr_storage sockaddr;
  230. socklen_t len = sizeof(sockaddr);
  231. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  232. if(getsockname(sockfd, addrp, &len) == -1) {
  233. throw DL_ABORT_EX(StringFormat(EX_SOCKET_GET_NAME, errorMsg()).str());
  234. }
  235. addrinfo = util::getNumericNameInfo(addrp, len);
  236. }
  237. void SocketCore::getPeerInfo(std::pair<std::string, uint16_t>& peerinfo) const
  238. {
  239. struct sockaddr_storage sockaddr;
  240. socklen_t len = sizeof(sockaddr);
  241. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  242. if(getpeername(sockfd, addrp, &len) == -1) {
  243. throw DL_ABORT_EX(StringFormat(EX_SOCKET_GET_NAME, errorMsg()).str());
  244. }
  245. peerinfo = util::getNumericNameInfo(addrp, len);
  246. }
  247. void SocketCore::establishConnection(const std::string& host, uint16_t port)
  248. {
  249. closeConnection();
  250. struct addrinfo hints;
  251. struct addrinfo* res;
  252. memset(&hints, 0, sizeof(hints));
  253. hints.ai_family = _protocolFamily;
  254. hints.ai_socktype = _sockType;
  255. hints.ai_flags = 0;
  256. hints.ai_protocol = 0;
  257. int s;
  258. s = getaddrinfo(host.c_str(), uitos(port).c_str(), &hints, &res);
  259. if(s) {
  260. throw DL_ABORT_EX(StringFormat(EX_RESOLVE_HOSTNAME,
  261. host.c_str(), gai_strerror(s)).str());
  262. }
  263. struct addrinfo* rp;
  264. for(rp = res; rp; rp = rp->ai_next) {
  265. sock_t fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  266. if(fd == (sock_t) -1) {
  267. continue;
  268. }
  269. int sockopt = 1;
  270. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (a2_sockopt_t) &sockopt, sizeof(sockopt)) < 0) {
  271. CLOSE(fd);
  272. continue;
  273. }
  274. if(!_bindAddr.isNull()) {
  275. if(::bind(fd, reinterpret_cast<const struct sockaddr*>(_bindAddr.get()),
  276. _bindAddrLen) == -1) {
  277. CLOSE(fd);
  278. continue;
  279. }
  280. }
  281. sockfd = fd;
  282. // make socket non-blocking mode
  283. setNonBlockingMode();
  284. if(connect(fd, rp->ai_addr, rp->ai_addrlen) == -1 &&
  285. SOCKET_ERRNO != A2_EINPROGRESS) {
  286. CLOSE(sockfd);
  287. sockfd = (sock_t) -1;
  288. continue;
  289. }
  290. // TODO at this point, connection may not be established and it may fail
  291. // later. In such case, next ai_addr should be tried.
  292. break;
  293. }
  294. freeaddrinfo(res);
  295. if(sockfd == (sock_t) -1) {
  296. throw DL_ABORT_EX(StringFormat(EX_SOCKET_CONNECT, host.c_str(),
  297. "all addresses failed").str());
  298. }
  299. }
  300. void SocketCore::setNonBlockingMode()
  301. {
  302. #ifdef __MINGW32__
  303. static u_long flag = 1;
  304. if (::ioctlsocket(sockfd, FIONBIO, &flag) == -1) {
  305. throw DL_ABORT_EX(StringFormat(EX_SOCKET_NONBLOCKING, errorMsg()).str());
  306. }
  307. #else
  308. int flags;
  309. while((flags = fcntl(sockfd, F_GETFL, 0)) == -1 && errno == EINTR);
  310. // TODO add error handling
  311. while(fcntl(sockfd, F_SETFL, flags|O_NONBLOCK) == -1 && errno == EINTR);
  312. #endif // __MINGW32__
  313. blocking = false;
  314. }
  315. void SocketCore::setBlockingMode()
  316. {
  317. #ifdef __MINGW32__
  318. static u_long flag = 0;
  319. if (::ioctlsocket(sockfd, FIONBIO, &flag) == -1) {
  320. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BLOCKING, errorMsg()).str());
  321. }
  322. #else
  323. int flags;
  324. while((flags = fcntl(sockfd, F_GETFL, 0)) == -1 && errno == EINTR);
  325. // TODO add error handling
  326. while(fcntl(sockfd, F_SETFL, flags&(~O_NONBLOCK)) == -1 && errno == EINTR);
  327. #endif // __MINGW32__
  328. blocking = true;
  329. }
  330. void SocketCore::closeConnection()
  331. {
  332. #ifdef HAVE_LIBSSL
  333. // for SSL
  334. if(secure) {
  335. SSL_shutdown(ssl);
  336. }
  337. #endif // HAVE_LIBSSL
  338. #ifdef HAVE_LIBGNUTLS
  339. if(secure) {
  340. gnutls_bye(sslSession, GNUTLS_SHUT_RDWR);
  341. }
  342. #endif // HAVE_LIBGNUTLS
  343. if(sockfd != (sock_t) -1) {
  344. CLOSE(sockfd);
  345. sockfd = -1;
  346. }
  347. #ifdef HAVE_LIBSSL
  348. // for SSL
  349. if(secure) {
  350. SSL_free(ssl);
  351. }
  352. #endif // HAVE_LIBSSL
  353. #ifdef HAVE_LIBGNUTLS
  354. if(secure) {
  355. gnutls_deinit(sslSession);
  356. }
  357. #endif // HAVE_LIBGNUTLS
  358. }
  359. #ifdef HAVE_EPOLL
  360. void SocketCore::initEPOLL()
  361. {
  362. if((_epfd = epoll_create(1)) == -1) {
  363. throw DL_RETRY_EX(StringFormat("epoll_create failed:%s", errorMsg()).str());
  364. }
  365. memset(&_epEvent, 0, sizeof(struct epoll_event));
  366. _epEvent.events = EPOLLIN|EPOLLOUT;
  367. _epEvent.data.fd = sockfd;
  368. if(epoll_ctl(_epfd, EPOLL_CTL_ADD, sockfd, &_epEvent) == -1) {
  369. throw DL_RETRY_EX(StringFormat("epoll_ctl failed:%s", errorMsg()).str());
  370. }
  371. }
  372. #endif // HAVE_EPOLL
  373. bool SocketCore::isWritable(time_t timeout)
  374. {
  375. #ifdef HAVE_EPOLL
  376. if(_pollMethod == SocketCore::POLL_METHOD_EPOLL) {
  377. if(_epfd == -1) {
  378. initEPOLL();
  379. }
  380. struct epoll_event epEvents[1];
  381. int r;
  382. while((r = epoll_wait(_epfd, epEvents, 1, 0)) == -1 && errno == EINTR);
  383. if(r > 0) {
  384. return epEvents[0].events&(EPOLLOUT|EPOLLHUP|EPOLLERR);
  385. } else if(r == 0) {
  386. return false;
  387. } else {
  388. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_WRITABLE, errorMsg()).str());
  389. }
  390. } else
  391. #endif // HAVE_EPOLL
  392. if(_pollMethod == SocketCore::POLL_METHOD_SELECT) {
  393. fd_set fds;
  394. FD_ZERO(&fds);
  395. FD_SET(sockfd, &fds);
  396. struct timeval tv;
  397. tv.tv_sec = timeout;
  398. tv.tv_usec = 0;
  399. int r = select(sockfd+1, NULL, &fds, NULL, &tv);
  400. if(r == 1) {
  401. return true;
  402. } else if(r == 0) {
  403. // time out
  404. return false;
  405. } else {
  406. if(SOCKET_ERRNO == A2_EINPROGRESS || SOCKET_ERRNO == EINTR) {
  407. return false;
  408. } else {
  409. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_WRITABLE, errorMsg()).str());
  410. }
  411. }
  412. } else {
  413. abort();
  414. }
  415. }
  416. bool SocketCore::isReadable(time_t timeout)
  417. {
  418. #ifdef HAVE_LIBGNUTLS
  419. if(secure && peekBufLength > 0) {
  420. return true;
  421. }
  422. #endif // HAVE_LIBGNUTLS
  423. #ifdef HAVE_EPOLL
  424. if(_pollMethod == SocketCore::POLL_METHOD_EPOLL) {
  425. if(_epfd == -1) {
  426. initEPOLL();
  427. }
  428. struct epoll_event epEvents[1];
  429. int r;
  430. while((r = epoll_wait(_epfd, epEvents, 1, 0)) == -1 && errno == EINTR);
  431. if(r > 0) {
  432. return epEvents[0].events&(EPOLLIN|EPOLLHUP|EPOLLERR);
  433. } else if(r == 0) {
  434. return false;
  435. } else {
  436. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_READABLE, errorMsg()).str());
  437. }
  438. } else
  439. #endif // HAVE_EPOLL
  440. if(_pollMethod == SocketCore::POLL_METHOD_SELECT) {
  441. fd_set fds;
  442. FD_ZERO(&fds);
  443. FD_SET(sockfd, &fds);
  444. struct timeval tv;
  445. tv.tv_sec = timeout;
  446. tv.tv_usec = 0;
  447. int r = select(sockfd+1, &fds, NULL, NULL, &tv);
  448. if(r == 1) {
  449. return true;
  450. } else if(r == 0) {
  451. // time out
  452. return false;
  453. } else {
  454. if(SOCKET_ERRNO == A2_EINPROGRESS || SOCKET_ERRNO == EINTR) {
  455. return false;
  456. } else {
  457. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_READABLE, errorMsg()).str());
  458. }
  459. }
  460. } else {
  461. abort();
  462. }
  463. }
  464. #ifdef HAVE_LIBSSL
  465. int SocketCore::sslHandleEAGAIN(int ret)
  466. {
  467. int error = SSL_get_error(ssl, ret);
  468. if(error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE) {
  469. ret = 0;
  470. if(error == SSL_ERROR_WANT_READ) {
  471. _wantRead = true;
  472. } else {
  473. _wantWrite = true;
  474. }
  475. }
  476. return ret;
  477. }
  478. #endif // HAVE_LIBSSL
  479. #ifdef HAVE_LIBGNUTLS
  480. void SocketCore::gnutlsRecordCheckDirection()
  481. {
  482. int direction = gnutls_record_get_direction(sslSession);
  483. if(direction == 0) {
  484. _wantRead = true;
  485. } else { // if(direction == 1) {
  486. _wantWrite = true;
  487. }
  488. }
  489. #endif // HAVE_LIBGNUTLS
  490. ssize_t SocketCore::writeData(const char* data, size_t len)
  491. {
  492. ssize_t ret = 0;
  493. _wantRead = false;
  494. _wantWrite = false;
  495. if(!secure) {
  496. while((ret = send(sockfd, data, len, 0)) == -1 && SOCKET_ERRNO == EINTR);
  497. if(ret == -1) {
  498. if(SOCKET_ERRNO == EAGAIN) {
  499. _wantWrite = true;
  500. ret = 0;
  501. } else {
  502. throw DL_RETRY_EX(StringFormat(EX_SOCKET_SEND, errorMsg()).str());
  503. }
  504. }
  505. } else {
  506. #ifdef HAVE_LIBSSL
  507. ret = SSL_write(ssl, data, len);
  508. if(ret == 0) {
  509. throw DL_RETRY_EX
  510. (StringFormat
  511. (EX_SOCKET_SEND, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  512. }
  513. if(ret < 0) {
  514. ret = sslHandleEAGAIN(ret);
  515. }
  516. if(ret < 0) {
  517. throw DL_RETRY_EX
  518. (StringFormat
  519. (EX_SOCKET_SEND, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  520. }
  521. #endif // HAVE_LIBSSL
  522. #ifdef HAVE_LIBGNUTLS
  523. while((ret = gnutls_record_send(sslSession, data, len)) ==
  524. GNUTLS_E_INTERRUPTED);
  525. if(ret == GNUTLS_E_AGAIN) {
  526. gnutlsRecordCheckDirection();
  527. ret = 0;
  528. } else if(ret < 0) {
  529. throw DL_RETRY_EX(StringFormat(EX_SOCKET_SEND, gnutls_strerror(ret)).str());
  530. }
  531. #endif // HAVE_LIBGNUTLS
  532. }
  533. return ret;
  534. }
  535. void SocketCore::readData(char* data, size_t& len)
  536. {
  537. ssize_t ret = 0;
  538. _wantRead = false;
  539. _wantWrite = false;
  540. if(!secure) {
  541. while((ret = recv(sockfd, data, len, 0)) == -1 && SOCKET_ERRNO == EINTR);
  542. if(ret == -1) {
  543. if(SOCKET_ERRNO == EAGAIN) {
  544. _wantRead = true;
  545. ret = 0;
  546. } else {
  547. throw DL_RETRY_EX(StringFormat(EX_SOCKET_RECV, errorMsg()).str());
  548. }
  549. }
  550. } else {
  551. #ifdef HAVE_LIBSSL
  552. // for SSL
  553. // TODO handling len == 0 case required
  554. ret = SSL_read(ssl, data, len);
  555. if(ret == 0) {
  556. throw DL_RETRY_EX
  557. (StringFormat
  558. (EX_SOCKET_RECV, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  559. }
  560. if(ret < 0) {
  561. ret = sslHandleEAGAIN(ret);
  562. }
  563. if(ret < 0) {
  564. throw DL_RETRY_EX
  565. (StringFormat
  566. (EX_SOCKET_RECV, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  567. }
  568. #endif // HAVE_LIBSSL
  569. #ifdef HAVE_LIBGNUTLS
  570. ret = gnutlsRecv(data, len);
  571. if(ret == GNUTLS_E_AGAIN) {
  572. gnutlsRecordCheckDirection();
  573. ret = 0;
  574. } else if(ret < 0) {
  575. throw DL_RETRY_EX
  576. (StringFormat(EX_SOCKET_RECV, gnutls_strerror(ret)).str());
  577. }
  578. #endif // HAVE_LIBGNUTLS
  579. }
  580. len = ret;
  581. }
  582. void SocketCore::peekData(char* data, size_t& len)
  583. {
  584. ssize_t ret = 0;
  585. _wantRead = false;
  586. _wantWrite = false;
  587. if(!secure) {
  588. while((ret = recv(sockfd, data, len, MSG_PEEK)) == -1 && SOCKET_ERRNO == EINTR);
  589. if(ret == -1) {
  590. if(SOCKET_ERRNO == EAGAIN) {
  591. _wantRead = true;
  592. ret = 0;
  593. } else {
  594. throw DL_RETRY_EX(StringFormat(EX_SOCKET_PEEK, errorMsg()).str());
  595. }
  596. }
  597. } else {
  598. #ifdef HAVE_LIBSSL
  599. // for SSL
  600. // TODO handling len == 0 case required
  601. ret = SSL_peek(ssl, data, len);
  602. if(ret == 0) {
  603. throw DL_RETRY_EX
  604. (StringFormat(EX_SOCKET_PEEK,
  605. ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  606. }
  607. if(ret < 0) {
  608. ret = sslHandleEAGAIN(ret);
  609. }
  610. if(ret < 0) {
  611. throw DL_RETRY_EX
  612. (StringFormat(EX_SOCKET_PEEK,
  613. ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  614. }
  615. #endif // HAVE_LIBSSL
  616. #ifdef HAVE_LIBGNUTLS
  617. ret = gnutlsPeek(data, len);
  618. if(ret == GNUTLS_E_AGAIN) {
  619. gnutlsRecordCheckDirection();
  620. ret = 0;
  621. } else if(ret < 0) {
  622. throw DL_RETRY_EX(StringFormat(EX_SOCKET_PEEK,
  623. gnutls_strerror(ret)).str());
  624. }
  625. #endif // HAVE_LIBGNUTLS
  626. }
  627. len = ret;
  628. }
  629. #ifdef HAVE_LIBGNUTLS
  630. size_t SocketCore::shiftPeekData(char* data, size_t len)
  631. {
  632. if(peekBufLength <= len) {
  633. memcpy(data, peekBuf, peekBufLength);
  634. size_t ret = peekBufLength;
  635. peekBufLength = 0;
  636. return ret;
  637. } else {
  638. memcpy(data, peekBuf, len);
  639. char* temp = new char[peekBufMax];
  640. memcpy(temp, peekBuf+len, peekBufLength-len);
  641. delete [] peekBuf;
  642. peekBuf = temp;
  643. peekBufLength -= len;
  644. return len;
  645. }
  646. }
  647. void SocketCore::addPeekData(char* data, size_t len)
  648. {
  649. if(peekBufLength+len > peekBufMax) {
  650. char* temp = new char[peekBufMax+len];
  651. memcpy(temp, peekBuf, peekBufLength);
  652. delete [] peekBuf;
  653. peekBuf = temp;
  654. peekBufMax = peekBufLength+len;
  655. }
  656. memcpy(peekBuf+peekBufLength, data, len);
  657. peekBufLength += len;
  658. }
  659. static ssize_t GNUTLS_RECORD_RECV_NO_INTERRUPT
  660. (gnutls_session_t sslSession, char* data, size_t len)
  661. {
  662. int ret;
  663. while((ret = gnutls_record_recv(sslSession, data, len)) ==
  664. GNUTLS_E_INTERRUPTED);
  665. if(ret < 0 && ret != GNUTLS_E_AGAIN) {
  666. throw DL_RETRY_EX
  667. (StringFormat(EX_SOCKET_RECV, gnutls_strerror(ret)).str());
  668. }
  669. return ret;
  670. }
  671. ssize_t SocketCore::gnutlsRecv(char* data, size_t len)
  672. {
  673. size_t plen = shiftPeekData(data, len);
  674. if(plen < len) {
  675. ssize_t ret = GNUTLS_RECORD_RECV_NO_INTERRUPT
  676. (sslSession, data+plen, len-plen);
  677. if(ret == GNUTLS_E_AGAIN) {
  678. return GNUTLS_E_AGAIN;
  679. }
  680. return plen+ret;
  681. } else {
  682. return plen;
  683. }
  684. }
  685. ssize_t SocketCore::gnutlsPeek(char* data, size_t len)
  686. {
  687. if(peekBufLength >= len) {
  688. memcpy(data, peekBuf, len);
  689. return len;
  690. } else {
  691. memcpy(data, peekBuf, peekBufLength);
  692. ssize_t ret = GNUTLS_RECORD_RECV_NO_INTERRUPT
  693. (sslSession, data+peekBufLength, len-peekBufLength);
  694. if(ret == GNUTLS_E_AGAIN) {
  695. return GNUTLS_E_AGAIN;
  696. }
  697. addPeekData(data+peekBufLength, ret);
  698. return peekBufLength;
  699. }
  700. }
  701. #endif // HAVE_LIBGNUTLS
  702. void SocketCore::prepareSecureConnection()
  703. {
  704. if(!secure) {
  705. #ifdef HAVE_LIBSSL
  706. // for SSL
  707. ssl = SSL_new(_tlsContext->getSSLCtx());
  708. if(!ssl) {
  709. throw DL_ABORT_EX
  710. (StringFormat(EX_SSL_INIT_FAILURE,
  711. ERR_error_string(ERR_get_error(), 0)).str());
  712. }
  713. if(SSL_set_fd(ssl, sockfd) == 0) {
  714. throw DL_ABORT_EX
  715. (StringFormat(EX_SSL_INIT_FAILURE,
  716. ERR_error_string(ERR_get_error(), 0)).str());
  717. }
  718. #endif // HAVE_LIBSSL
  719. #ifdef HAVE_LIBGNUTLS
  720. int r;
  721. gnutls_init(&sslSession, GNUTLS_CLIENT);
  722. // It seems err is not error message, but the argument string
  723. // which causes syntax error.
  724. const char* err;
  725. // Disables TLS1.1 here because there are servers that don't
  726. // understand TLS1.1.
  727. r = gnutls_priority_set_direct(sslSession, "NORMAL:!VERS-TLS1.1", &err);
  728. if(r != GNUTLS_E_SUCCESS) {
  729. throw DL_ABORT_EX
  730. (StringFormat(EX_SSL_INIT_FAILURE, gnutls_strerror(r)).str());
  731. }
  732. // put the x509 credentials to the current session
  733. gnutls_credentials_set(sslSession, GNUTLS_CRD_CERTIFICATE,
  734. _tlsContext->getCertCred());
  735. gnutls_transport_set_ptr(sslSession, (gnutls_transport_ptr_t)sockfd);
  736. #endif // HAVE_LIBGNUTLS
  737. secure = 1;
  738. }
  739. }
  740. bool SocketCore::initiateSecureConnection(const std::string& hostname)
  741. {
  742. if(secure == 1) {
  743. _wantRead = false;
  744. _wantWrite = false;
  745. #ifdef HAVE_LIBSSL
  746. int e = SSL_connect(ssl);
  747. if (e <= 0) {
  748. int ssl_error = SSL_get_error(ssl, e);
  749. switch(ssl_error) {
  750. case SSL_ERROR_NONE:
  751. break;
  752. case SSL_ERROR_WANT_READ:
  753. _wantRead = true;
  754. return false;
  755. case SSL_ERROR_WANT_WRITE:
  756. _wantWrite = true;
  757. return false;
  758. case SSL_ERROR_WANT_X509_LOOKUP:
  759. case SSL_ERROR_ZERO_RETURN:
  760. if (blocking) {
  761. throw DL_ABORT_EX
  762. (StringFormat(EX_SSL_CONNECT_ERROR, ssl_error).str());
  763. }
  764. break;
  765. case SSL_ERROR_SYSCALL:
  766. throw DL_ABORT_EX(EX_SSL_IO_ERROR);
  767. case SSL_ERROR_SSL:
  768. throw DL_ABORT_EX(EX_SSL_PROTOCOL_ERROR);
  769. default:
  770. throw DL_ABORT_EX
  771. (StringFormat(EX_SSL_UNKNOWN_ERROR, ssl_error).str());
  772. }
  773. }
  774. if(_tlsContext->peerVerificationEnabled()) {
  775. // verify peer
  776. X509* peerCert = SSL_get_peer_certificate(ssl);
  777. if(!peerCert) {
  778. throw DL_ABORT_EX(MSG_NO_CERT_FOUND);
  779. }
  780. auto_delete<X509*> certDeleter(peerCert, X509_free);
  781. long verifyResult = SSL_get_verify_result(ssl);
  782. if(verifyResult != X509_V_OK) {
  783. throw DL_ABORT_EX
  784. (StringFormat(MSG_CERT_VERIFICATION_FAILED,
  785. X509_verify_cert_error_string(verifyResult)).str());
  786. }
  787. X509_NAME* name = X509_get_subject_name(peerCert);
  788. if(!name) {
  789. throw DL_ABORT_EX("Could not get X509 name object from the certificate.");
  790. }
  791. bool hostnameOK = false;
  792. int lastpos = -1;
  793. while(true) {
  794. lastpos = X509_NAME_get_index_by_NID(name, NID_commonName, lastpos);
  795. if(lastpos == -1) {
  796. break;
  797. }
  798. X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, lastpos);
  799. unsigned char* out;
  800. int outlen = ASN1_STRING_to_UTF8(&out, X509_NAME_ENTRY_get_data(entry));
  801. if(outlen < 0) {
  802. continue;
  803. }
  804. std::string commonName(&out[0], &out[outlen]);
  805. OPENSSL_free(out);
  806. if(commonName == hostname) {
  807. hostnameOK = true;
  808. break;
  809. }
  810. }
  811. if(!hostnameOK) {
  812. throw DL_ABORT_EX(MSG_HOSTNAME_NOT_MATCH);
  813. }
  814. }
  815. #endif // HAVE_LIBSSL
  816. #ifdef HAVE_LIBGNUTLS
  817. int ret = gnutls_handshake(sslSession);
  818. if(ret == GNUTLS_E_AGAIN) {
  819. gnutlsRecordCheckDirection();
  820. return false;
  821. } else if(ret < 0) {
  822. throw DL_ABORT_EX
  823. (StringFormat(EX_SSL_INIT_FAILURE, gnutls_strerror(ret)).str());
  824. }
  825. if(_tlsContext->peerVerificationEnabled()) {
  826. // verify peer
  827. unsigned int status;
  828. ret = gnutls_certificate_verify_peers2(sslSession, &status);
  829. if(ret < 0) {
  830. throw DL_ABORT_EX
  831. (StringFormat("gnutls_certificate_verify_peer2() failed. Cause: %s",
  832. gnutls_strerror(ret)).str());
  833. }
  834. if(status) {
  835. std::string errors;
  836. if(status & GNUTLS_CERT_INVALID) {
  837. errors += " `not signed by known authorities or invalid'";
  838. }
  839. if(status & GNUTLS_CERT_REVOKED) {
  840. errors += " `revoked by its CA'";
  841. }
  842. if(status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
  843. errors += " `issuer is not known'";
  844. }
  845. if(!errors.empty()) {
  846. throw DL_ABORT_EX
  847. (StringFormat(MSG_CERT_VERIFICATION_FAILED, errors.c_str()).str());
  848. }
  849. }
  850. // certificate type: only X509 is allowed.
  851. if(gnutls_certificate_type_get(sslSession) != GNUTLS_CRT_X509) {
  852. throw DL_ABORT_EX("Certificate type is not X509.");
  853. }
  854. unsigned int peerCertsLength;
  855. const gnutls_datum_t* peerCerts = gnutls_certificate_get_peers
  856. (sslSession, &peerCertsLength);
  857. if(!peerCerts) {
  858. throw DL_ABORT_EX(MSG_NO_CERT_FOUND);
  859. }
  860. Time now;
  861. for(unsigned int i = 0; i < peerCertsLength; ++i) {
  862. gnutls_x509_crt_t cert;
  863. ret = gnutls_x509_crt_init(&cert);
  864. if(ret < 0) {
  865. throw DL_ABORT_EX
  866. (StringFormat("gnutls_x509_crt_init() failed. Cause: %s",
  867. gnutls_strerror(ret)).str());
  868. }
  869. auto_delete<gnutls_x509_crt_t> certDeleter
  870. (cert, gnutls_x509_crt_deinit);
  871. ret = gnutls_x509_crt_import(cert, &peerCerts[i], GNUTLS_X509_FMT_DER);
  872. if(ret < 0) {
  873. throw DL_ABORT_EX
  874. (StringFormat("gnutls_x509_crt_import() failed. Cause: %s",
  875. gnutls_strerror(ret)).str());
  876. }
  877. if(i == 0) {
  878. if(!gnutls_x509_crt_check_hostname(cert, hostname.c_str())) {
  879. throw DL_ABORT_EX(MSG_HOSTNAME_NOT_MATCH);
  880. }
  881. }
  882. time_t activationTime = gnutls_x509_crt_get_activation_time(cert);
  883. if(activationTime == -1) {
  884. throw DL_ABORT_EX("Could not get activation time from certificate.");
  885. }
  886. if(now.getTime() < activationTime) {
  887. throw DL_ABORT_EX("Certificate is not activated yet.");
  888. }
  889. time_t expirationTime = gnutls_x509_crt_get_expiration_time(cert);
  890. if(expirationTime == -1) {
  891. throw DL_ABORT_EX("Could not get expiration time from certificate.");
  892. }
  893. if(expirationTime < now.getTime()) {
  894. throw DL_ABORT_EX("Certificate has expired.");
  895. }
  896. }
  897. }
  898. peekBuf = new char[peekBufMax];
  899. #endif // HAVE_LIBGNUTLS
  900. secure = 2;
  901. return true;
  902. } else {
  903. return true;
  904. }
  905. }
  906. /* static */ int SocketCore::error()
  907. {
  908. return SOCKET_ERRNO;
  909. }
  910. /* static */ const char *SocketCore::errorMsg()
  911. {
  912. return errorMsg(SOCKET_ERRNO);
  913. }
  914. /* static */ const char *SocketCore::errorMsg(const int err)
  915. {
  916. #ifndef __MINGW32__
  917. return strerror(err);
  918. #else
  919. static char buf[256];
  920. if (FormatMessage(
  921. FORMAT_MESSAGE_FROM_SYSTEM |
  922. FORMAT_MESSAGE_IGNORE_INSERTS,
  923. NULL,
  924. err,
  925. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  926. (LPTSTR) &buf,
  927. sizeof(buf),
  928. NULL
  929. ) == 0) {
  930. snprintf(buf, sizeof(buf), EX_SOCKET_UNKNOWN_ERROR, err, err);
  931. }
  932. return buf;
  933. #endif // __MINGW32__
  934. }
  935. ssize_t SocketCore::writeData(const char* data, size_t len,
  936. const std::string& host, uint16_t port)
  937. {
  938. _wantRead = false;
  939. _wantWrite = false;
  940. struct addrinfo hints;
  941. struct addrinfo* res;
  942. memset(&hints, 0, sizeof(hints));
  943. hints.ai_family = _protocolFamily;
  944. hints.ai_socktype = _sockType;
  945. hints.ai_flags = 0;
  946. hints.ai_protocol = 0;
  947. int s;
  948. s = getaddrinfo(host.c_str(), uitos(port).c_str(), &hints, &res);
  949. if(s) {
  950. throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, gai_strerror(s)).str());
  951. }
  952. struct addrinfo* rp;
  953. ssize_t r = -1;
  954. for(rp = res; rp; rp = rp->ai_next) {
  955. while((r = sendto(sockfd, data, len, 0, rp->ai_addr, rp->ai_addrlen)) == -1 && EINTR == SOCKET_ERRNO);
  956. if(r == static_cast<ssize_t>(len)) {
  957. break;
  958. }
  959. if(r == -1 && SOCKET_ERRNO == EAGAIN) {
  960. _wantWrite = true;
  961. r = 0;
  962. break;
  963. }
  964. }
  965. freeaddrinfo(res);
  966. if(r == -1) {
  967. throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, errorMsg()).str());
  968. }
  969. return r;
  970. }
  971. ssize_t SocketCore::readDataFrom(char* data, size_t len,
  972. std::pair<std::string /* numerichost */,
  973. uint16_t /* port */>& sender)
  974. {
  975. _wantRead = false;
  976. _wantWrite = false;
  977. struct sockaddr_storage sockaddr;
  978. socklen_t sockaddrlen = sizeof(struct sockaddr_storage);
  979. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  980. ssize_t r;
  981. while((r = recvfrom(sockfd, data, len, 0, addrp, &sockaddrlen)) == -1 &&
  982. EINTR == SOCKET_ERRNO);
  983. if(r == -1) {
  984. if(SOCKET_ERRNO == EAGAIN) {
  985. _wantRead = true;
  986. r = 0;
  987. } else {
  988. throw DL_RETRY_EX(StringFormat(EX_SOCKET_RECV, errorMsg()).str());
  989. }
  990. } else {
  991. sender = util::getNumericNameInfo(addrp, sockaddrlen);
  992. }
  993. return r;
  994. }
  995. std::string SocketCore::getSocketError() const
  996. {
  997. int error;
  998. socklen_t optlen = sizeof(error);
  999. if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (a2_sockopt_t) &error, &optlen) == -1) {
  1000. throw DL_ABORT_EX(StringFormat("Failed to get socket error: %s",
  1001. errorMsg()).str());
  1002. }
  1003. if(error != 0) {
  1004. return errorMsg(error);
  1005. } else {
  1006. return "";
  1007. }
  1008. }
  1009. bool SocketCore::wantRead() const
  1010. {
  1011. return _wantRead;
  1012. }
  1013. bool SocketCore::wantWrite() const
  1014. {
  1015. return _wantWrite;
  1016. }
  1017. #ifdef HAVE_EPOLL
  1018. void SocketCore::useEpoll()
  1019. {
  1020. _pollMethod = SocketCore::POLL_METHOD_EPOLL;
  1021. }
  1022. #endif // HAVE_EPOLL
  1023. void SocketCore::useSelect()
  1024. {
  1025. _pollMethod = SocketCore::POLL_METHOD_SELECT;
  1026. }
  1027. void SocketCore::bindAddress(const std::string& interface)
  1028. {
  1029. SharedHandle<struct sockaddr_storage> bindAddr(new struct sockaddr_storage());
  1030. socklen_t bindAddrLen = 0;
  1031. memset(bindAddr.get(), 0, sizeof(struct sockaddr_storage));
  1032. bool found = false;
  1033. #ifdef HAVE_GETIFADDRS
  1034. // First find interface in interface addresses
  1035. struct ifaddrs* ifaddr = 0;
  1036. if(getifaddrs(&ifaddr) == -1) {
  1037. throw DL_ABORT_EX
  1038. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1039. interface.c_str(), strerror(errno)).str());
  1040. } else {
  1041. auto_delete<struct ifaddrs*> ifaddrDeleter(ifaddr, freeifaddrs);
  1042. for(struct ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  1043. if(!ifa->ifa_addr) {
  1044. continue;
  1045. }
  1046. int family = ifa->ifa_addr->sa_family;
  1047. if(_protocolFamily == AF_UNSPEC) {
  1048. if(family != AF_INET && family != AF_INET6) {
  1049. continue;
  1050. }
  1051. } else if(_protocolFamily == AF_INET) {
  1052. if(family != AF_INET) {
  1053. continue;
  1054. }
  1055. } else if(_protocolFamily == AF_INET6) {
  1056. if(family != AF_INET6) {
  1057. continue;
  1058. }
  1059. } else {
  1060. continue;
  1061. }
  1062. if(std::string(ifa->ifa_name) == interface) {
  1063. bindAddrLen =
  1064. family == AF_INET?sizeof(struct sockaddr_in):
  1065. sizeof(struct sockaddr_in6);
  1066. memcpy(bindAddr.get(), ifa->ifa_addr, bindAddrLen);
  1067. found = true;
  1068. break;
  1069. }
  1070. }
  1071. }
  1072. #endif // HAVE_GETIFADDRS
  1073. if(!found) {
  1074. struct addrinfo hints;
  1075. struct addrinfo* res = 0;
  1076. memset(&hints, 0, sizeof(hints));
  1077. hints.ai_family = _protocolFamily;
  1078. hints.ai_socktype = 0;
  1079. hints.ai_flags = 0;
  1080. hints.ai_protocol = 0;
  1081. int s;
  1082. s = getaddrinfo(interface.c_str(), 0, &hints, &res);
  1083. if(s) {
  1084. throw DL_ABORT_EX
  1085. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1086. interface.c_str(), gai_strerror(s)).str());
  1087. } else {
  1088. auto_delete<struct addrinfo*> resDeleter(res, freeaddrinfo);
  1089. struct addrinfo* rp;
  1090. for(rp = res; rp; rp = rp->ai_next) {
  1091. bindAddrLen = rp->ai_addrlen;
  1092. memcpy(bindAddr.get(), rp->ai_addr, rp->ai_addrlen);
  1093. // Try to bind socket with this address. If it fails, the
  1094. // address is not for this machine.
  1095. try {
  1096. SocketCore socket;
  1097. socket.bind
  1098. (reinterpret_cast<const struct sockaddr*>(bindAddr.get()),
  1099. bindAddrLen);
  1100. } catch(RecoverableException& e) {
  1101. throw DL_ABORT_EX2
  1102. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1103. interface.c_str()).str(), e);
  1104. }
  1105. found = true;
  1106. break;
  1107. }
  1108. }
  1109. }
  1110. if(found) {
  1111. _bindAddr = bindAddr;
  1112. _bindAddrLen = bindAddrLen;
  1113. }
  1114. }
  1115. } // namespace aria2