SocketCore.cc 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241
  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. std::vector<std::pair<struct sockaddr_storage, socklen_t> >
  80. SocketCore::_bindAddrs;
  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(EX_SOCKET_BIND, 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 || _bindAddrs.empty()) {
  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. for(std::vector<std::pair<struct sockaddr_storage, socklen_t> >::
  189. const_iterator i = _bindAddrs.begin(); i != _bindAddrs.end(); ++i) {
  190. sock_t fd = bindInternal
  191. ((*i).first.ss_family, _sockType, 0,
  192. reinterpret_cast<const struct sockaddr*>
  193. (&(*i).first), (*i).second);
  194. if(fd != (sock_t)-1) {
  195. sockfd = fd;
  196. break;
  197. }
  198. }
  199. }
  200. if(sockfd == (sock_t) -1) {
  201. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, strerror(errno)).str());
  202. }
  203. }
  204. void SocketCore::bind(const struct sockaddr* addr, socklen_t addrlen)
  205. {
  206. closeConnection();
  207. sock_t fd = bindInternal(addr->sa_family, _sockType, 0, addr, addrlen);
  208. if(fd != (sock_t)-1) {
  209. sockfd = fd;
  210. } else {
  211. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, strerror(errno)).str());
  212. }
  213. }
  214. void SocketCore::beginListen()
  215. {
  216. if(listen(sockfd, 1) == -1) {
  217. throw DL_ABORT_EX(StringFormat(EX_SOCKET_LISTEN, errorMsg()).str());
  218. }
  219. }
  220. SocketCore* SocketCore::acceptConnection() const
  221. {
  222. struct sockaddr_storage sockaddr;
  223. socklen_t len = sizeof(sockaddr);
  224. sock_t fd;
  225. while((fd = accept(sockfd, reinterpret_cast<struct sockaddr*>(&sockaddr), &len)) == (sock_t) -1 && SOCKET_ERRNO == EINTR);
  226. if(fd == (sock_t) -1) {
  227. throw DL_ABORT_EX(StringFormat(EX_SOCKET_ACCEPT, errorMsg()).str());
  228. }
  229. return new SocketCore(fd, _sockType);
  230. }
  231. void SocketCore::getAddrInfo(std::pair<std::string, uint16_t>& addrinfo) const
  232. {
  233. struct sockaddr_storage sockaddr;
  234. socklen_t len = sizeof(sockaddr);
  235. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  236. if(getsockname(sockfd, addrp, &len) == -1) {
  237. throw DL_ABORT_EX(StringFormat(EX_SOCKET_GET_NAME, errorMsg()).str());
  238. }
  239. addrinfo = util::getNumericNameInfo(addrp, len);
  240. }
  241. void SocketCore::getPeerInfo(std::pair<std::string, uint16_t>& peerinfo) const
  242. {
  243. struct sockaddr_storage sockaddr;
  244. socklen_t len = sizeof(sockaddr);
  245. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  246. if(getpeername(sockfd, addrp, &len) == -1) {
  247. throw DL_ABORT_EX(StringFormat(EX_SOCKET_GET_NAME, errorMsg()).str());
  248. }
  249. peerinfo = util::getNumericNameInfo(addrp, len);
  250. }
  251. void SocketCore::establishConnection(const std::string& host, uint16_t port)
  252. {
  253. closeConnection();
  254. struct addrinfo hints;
  255. struct addrinfo* res;
  256. memset(&hints, 0, sizeof(hints));
  257. hints.ai_family = _protocolFamily;
  258. hints.ai_socktype = _sockType;
  259. hints.ai_flags = 0;
  260. hints.ai_protocol = 0;
  261. int s;
  262. s = getaddrinfo(host.c_str(), uitos(port).c_str(), &hints, &res);
  263. if(s) {
  264. throw DL_ABORT_EX(StringFormat(EX_RESOLVE_HOSTNAME,
  265. host.c_str(), gai_strerror(s)).str());
  266. }
  267. struct addrinfo* rp;
  268. for(rp = res; rp; rp = rp->ai_next) {
  269. sock_t fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  270. if(fd == (sock_t) -1) {
  271. continue;
  272. }
  273. int sockopt = 1;
  274. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (a2_sockopt_t) &sockopt, sizeof(sockopt)) < 0) {
  275. CLOSE(fd);
  276. continue;
  277. }
  278. if(!_bindAddrs.empty()) {
  279. bool bindSuccess = false;
  280. for(std::vector<std::pair<struct sockaddr_storage, socklen_t> >::
  281. const_iterator i = _bindAddrs.begin(); i != _bindAddrs.end(); ++i) {
  282. if(::bind(fd,reinterpret_cast<const struct sockaddr*>(&(*i).first),
  283. (*i).second) == -1) {
  284. LogFactory::getInstance()->debug(EX_SOCKET_BIND, strerror(errno));
  285. } else {
  286. bindSuccess = true;
  287. break;
  288. }
  289. }
  290. if(!bindSuccess) {
  291. CLOSE(fd);
  292. continue;
  293. }
  294. }
  295. sockfd = fd;
  296. // make socket non-blocking mode
  297. setNonBlockingMode();
  298. if(connect(fd, rp->ai_addr, rp->ai_addrlen) == -1 &&
  299. SOCKET_ERRNO != A2_EINPROGRESS) {
  300. CLOSE(sockfd);
  301. sockfd = (sock_t) -1;
  302. continue;
  303. }
  304. // TODO at this point, connection may not be established and it may fail
  305. // later. In such case, next ai_addr should be tried.
  306. break;
  307. }
  308. freeaddrinfo(res);
  309. if(sockfd == (sock_t) -1) {
  310. throw DL_ABORT_EX(StringFormat(EX_SOCKET_CONNECT, host.c_str(),
  311. strerror(errno)).str());
  312. }
  313. }
  314. void SocketCore::setNonBlockingMode()
  315. {
  316. #ifdef __MINGW32__
  317. static u_long flag = 1;
  318. if (::ioctlsocket(sockfd, FIONBIO, &flag) == -1) {
  319. throw DL_ABORT_EX(StringFormat(EX_SOCKET_NONBLOCKING, errorMsg()).str());
  320. }
  321. #else
  322. int flags;
  323. while((flags = fcntl(sockfd, F_GETFL, 0)) == -1 && errno == EINTR);
  324. // TODO add error handling
  325. while(fcntl(sockfd, F_SETFL, flags|O_NONBLOCK) == -1 && errno == EINTR);
  326. #endif // __MINGW32__
  327. blocking = false;
  328. }
  329. void SocketCore::setBlockingMode()
  330. {
  331. #ifdef __MINGW32__
  332. static u_long flag = 0;
  333. if (::ioctlsocket(sockfd, FIONBIO, &flag) == -1) {
  334. throw DL_ABORT_EX(StringFormat(EX_SOCKET_BLOCKING, errorMsg()).str());
  335. }
  336. #else
  337. int flags;
  338. while((flags = fcntl(sockfd, F_GETFL, 0)) == -1 && errno == EINTR);
  339. // TODO add error handling
  340. while(fcntl(sockfd, F_SETFL, flags&(~O_NONBLOCK)) == -1 && errno == EINTR);
  341. #endif // __MINGW32__
  342. blocking = true;
  343. }
  344. void SocketCore::closeConnection()
  345. {
  346. #ifdef HAVE_LIBSSL
  347. // for SSL
  348. if(secure) {
  349. SSL_shutdown(ssl);
  350. }
  351. #endif // HAVE_LIBSSL
  352. #ifdef HAVE_LIBGNUTLS
  353. if(secure) {
  354. gnutls_bye(sslSession, GNUTLS_SHUT_RDWR);
  355. }
  356. #endif // HAVE_LIBGNUTLS
  357. if(sockfd != (sock_t) -1) {
  358. CLOSE(sockfd);
  359. sockfd = -1;
  360. }
  361. #ifdef HAVE_LIBSSL
  362. // for SSL
  363. if(secure) {
  364. SSL_free(ssl);
  365. }
  366. #endif // HAVE_LIBSSL
  367. #ifdef HAVE_LIBGNUTLS
  368. if(secure) {
  369. gnutls_deinit(sslSession);
  370. }
  371. #endif // HAVE_LIBGNUTLS
  372. }
  373. #ifdef HAVE_EPOLL
  374. void SocketCore::initEPOLL()
  375. {
  376. if((_epfd = epoll_create(1)) == -1) {
  377. throw DL_RETRY_EX(StringFormat("epoll_create failed:%s", errorMsg()).str());
  378. }
  379. memset(&_epEvent, 0, sizeof(struct epoll_event));
  380. _epEvent.events = EPOLLIN|EPOLLOUT;
  381. _epEvent.data.fd = sockfd;
  382. if(epoll_ctl(_epfd, EPOLL_CTL_ADD, sockfd, &_epEvent) == -1) {
  383. throw DL_RETRY_EX(StringFormat("epoll_ctl failed:%s", errorMsg()).str());
  384. }
  385. }
  386. #endif // HAVE_EPOLL
  387. bool SocketCore::isWritable(time_t timeout)
  388. {
  389. #ifdef HAVE_EPOLL
  390. if(_pollMethod == SocketCore::POLL_METHOD_EPOLL) {
  391. if(_epfd == -1) {
  392. initEPOLL();
  393. }
  394. struct epoll_event epEvents[1];
  395. int r;
  396. while((r = epoll_wait(_epfd, epEvents, 1, 0)) == -1 && errno == EINTR);
  397. if(r > 0) {
  398. return epEvents[0].events&(EPOLLOUT|EPOLLHUP|EPOLLERR);
  399. } else if(r == 0) {
  400. return false;
  401. } else {
  402. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_WRITABLE, errorMsg()).str());
  403. }
  404. } else
  405. #endif // HAVE_EPOLL
  406. if(_pollMethod == SocketCore::POLL_METHOD_SELECT) {
  407. fd_set fds;
  408. FD_ZERO(&fds);
  409. FD_SET(sockfd, &fds);
  410. struct timeval tv;
  411. tv.tv_sec = timeout;
  412. tv.tv_usec = 0;
  413. int r = select(sockfd+1, NULL, &fds, NULL, &tv);
  414. if(r == 1) {
  415. return true;
  416. } else if(r == 0) {
  417. // time out
  418. return false;
  419. } else {
  420. if(SOCKET_ERRNO == A2_EINPROGRESS || SOCKET_ERRNO == EINTR) {
  421. return false;
  422. } else {
  423. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_WRITABLE, errorMsg()).str());
  424. }
  425. }
  426. } else {
  427. abort();
  428. }
  429. }
  430. bool SocketCore::isReadable(time_t timeout)
  431. {
  432. #ifdef HAVE_LIBGNUTLS
  433. if(secure && peekBufLength > 0) {
  434. return true;
  435. }
  436. #endif // HAVE_LIBGNUTLS
  437. #ifdef HAVE_EPOLL
  438. if(_pollMethod == SocketCore::POLL_METHOD_EPOLL) {
  439. if(_epfd == -1) {
  440. initEPOLL();
  441. }
  442. struct epoll_event epEvents[1];
  443. int r;
  444. while((r = epoll_wait(_epfd, epEvents, 1, 0)) == -1 && errno == EINTR);
  445. if(r > 0) {
  446. return epEvents[0].events&(EPOLLIN|EPOLLHUP|EPOLLERR);
  447. } else if(r == 0) {
  448. return false;
  449. } else {
  450. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_READABLE, errorMsg()).str());
  451. }
  452. } else
  453. #endif // HAVE_EPOLL
  454. if(_pollMethod == SocketCore::POLL_METHOD_SELECT) {
  455. fd_set fds;
  456. FD_ZERO(&fds);
  457. FD_SET(sockfd, &fds);
  458. struct timeval tv;
  459. tv.tv_sec = timeout;
  460. tv.tv_usec = 0;
  461. int r = select(sockfd+1, &fds, NULL, NULL, &tv);
  462. if(r == 1) {
  463. return true;
  464. } else if(r == 0) {
  465. // time out
  466. return false;
  467. } else {
  468. if(SOCKET_ERRNO == A2_EINPROGRESS || SOCKET_ERRNO == EINTR) {
  469. return false;
  470. } else {
  471. throw DL_RETRY_EX(StringFormat(EX_SOCKET_CHECK_READABLE, errorMsg()).str());
  472. }
  473. }
  474. } else {
  475. abort();
  476. }
  477. }
  478. #ifdef HAVE_LIBSSL
  479. int SocketCore::sslHandleEAGAIN(int ret)
  480. {
  481. int error = SSL_get_error(ssl, ret);
  482. if(error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE) {
  483. ret = 0;
  484. if(error == SSL_ERROR_WANT_READ) {
  485. _wantRead = true;
  486. } else {
  487. _wantWrite = true;
  488. }
  489. }
  490. return ret;
  491. }
  492. #endif // HAVE_LIBSSL
  493. #ifdef HAVE_LIBGNUTLS
  494. void SocketCore::gnutlsRecordCheckDirection()
  495. {
  496. int direction = gnutls_record_get_direction(sslSession);
  497. if(direction == 0) {
  498. _wantRead = true;
  499. } else { // if(direction == 1) {
  500. _wantWrite = true;
  501. }
  502. }
  503. #endif // HAVE_LIBGNUTLS
  504. ssize_t SocketCore::writeData(const char* data, size_t len)
  505. {
  506. ssize_t ret = 0;
  507. _wantRead = false;
  508. _wantWrite = false;
  509. if(!secure) {
  510. while((ret = send(sockfd, data, len, 0)) == -1 && SOCKET_ERRNO == EINTR);
  511. if(ret == -1) {
  512. if(SOCKET_ERRNO == EAGAIN) {
  513. _wantWrite = true;
  514. ret = 0;
  515. } else {
  516. throw DL_RETRY_EX(StringFormat(EX_SOCKET_SEND, errorMsg()).str());
  517. }
  518. }
  519. } else {
  520. #ifdef HAVE_LIBSSL
  521. ret = SSL_write(ssl, data, len);
  522. if(ret == 0) {
  523. throw DL_RETRY_EX
  524. (StringFormat
  525. (EX_SOCKET_SEND, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  526. }
  527. if(ret < 0) {
  528. ret = sslHandleEAGAIN(ret);
  529. }
  530. if(ret < 0) {
  531. throw DL_RETRY_EX
  532. (StringFormat
  533. (EX_SOCKET_SEND, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  534. }
  535. #endif // HAVE_LIBSSL
  536. #ifdef HAVE_LIBGNUTLS
  537. while((ret = gnutls_record_send(sslSession, data, len)) ==
  538. GNUTLS_E_INTERRUPTED);
  539. if(ret == GNUTLS_E_AGAIN) {
  540. gnutlsRecordCheckDirection();
  541. ret = 0;
  542. } else if(ret < 0) {
  543. throw DL_RETRY_EX(StringFormat(EX_SOCKET_SEND, gnutls_strerror(ret)).str());
  544. }
  545. #endif // HAVE_LIBGNUTLS
  546. }
  547. return ret;
  548. }
  549. void SocketCore::readData(char* data, size_t& len)
  550. {
  551. ssize_t ret = 0;
  552. _wantRead = false;
  553. _wantWrite = false;
  554. if(!secure) {
  555. while((ret = recv(sockfd, data, len, 0)) == -1 && SOCKET_ERRNO == EINTR);
  556. if(ret == -1) {
  557. if(SOCKET_ERRNO == EAGAIN) {
  558. _wantRead = true;
  559. ret = 0;
  560. } else {
  561. throw DL_RETRY_EX(StringFormat(EX_SOCKET_RECV, errorMsg()).str());
  562. }
  563. }
  564. } else {
  565. #ifdef HAVE_LIBSSL
  566. // for SSL
  567. // TODO handling len == 0 case required
  568. ret = SSL_read(ssl, data, len);
  569. if(ret == 0) {
  570. throw DL_RETRY_EX
  571. (StringFormat
  572. (EX_SOCKET_RECV, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  573. }
  574. if(ret < 0) {
  575. ret = sslHandleEAGAIN(ret);
  576. }
  577. if(ret < 0) {
  578. throw DL_RETRY_EX
  579. (StringFormat
  580. (EX_SOCKET_RECV, ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  581. }
  582. #endif // HAVE_LIBSSL
  583. #ifdef HAVE_LIBGNUTLS
  584. ret = gnutlsRecv(data, len);
  585. if(ret == GNUTLS_E_AGAIN) {
  586. gnutlsRecordCheckDirection();
  587. ret = 0;
  588. } else if(ret < 0) {
  589. throw DL_RETRY_EX
  590. (StringFormat(EX_SOCKET_RECV, gnutls_strerror(ret)).str());
  591. }
  592. #endif // HAVE_LIBGNUTLS
  593. }
  594. len = ret;
  595. }
  596. void SocketCore::peekData(char* data, size_t& len)
  597. {
  598. ssize_t ret = 0;
  599. _wantRead = false;
  600. _wantWrite = false;
  601. if(!secure) {
  602. while((ret = recv(sockfd, data, len, MSG_PEEK)) == -1 && SOCKET_ERRNO == EINTR);
  603. if(ret == -1) {
  604. if(SOCKET_ERRNO == EAGAIN) {
  605. _wantRead = true;
  606. ret = 0;
  607. } else {
  608. throw DL_RETRY_EX(StringFormat(EX_SOCKET_PEEK, errorMsg()).str());
  609. }
  610. }
  611. } else {
  612. #ifdef HAVE_LIBSSL
  613. // for SSL
  614. // TODO handling len == 0 case required
  615. ret = SSL_peek(ssl, data, len);
  616. if(ret == 0) {
  617. throw DL_RETRY_EX
  618. (StringFormat(EX_SOCKET_PEEK,
  619. ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  620. }
  621. if(ret < 0) {
  622. ret = sslHandleEAGAIN(ret);
  623. }
  624. if(ret < 0) {
  625. throw DL_RETRY_EX
  626. (StringFormat(EX_SOCKET_PEEK,
  627. ERR_error_string(SSL_get_error(ssl, ret), 0)).str());
  628. }
  629. #endif // HAVE_LIBSSL
  630. #ifdef HAVE_LIBGNUTLS
  631. ret = gnutlsPeek(data, len);
  632. if(ret == GNUTLS_E_AGAIN) {
  633. gnutlsRecordCheckDirection();
  634. ret = 0;
  635. } else if(ret < 0) {
  636. throw DL_RETRY_EX(StringFormat(EX_SOCKET_PEEK,
  637. gnutls_strerror(ret)).str());
  638. }
  639. #endif // HAVE_LIBGNUTLS
  640. }
  641. len = ret;
  642. }
  643. #ifdef HAVE_LIBGNUTLS
  644. size_t SocketCore::shiftPeekData(char* data, size_t len)
  645. {
  646. if(peekBufLength <= len) {
  647. memcpy(data, peekBuf, peekBufLength);
  648. size_t ret = peekBufLength;
  649. peekBufLength = 0;
  650. return ret;
  651. } else {
  652. memcpy(data, peekBuf, len);
  653. char* temp = new char[peekBufMax];
  654. memcpy(temp, peekBuf+len, peekBufLength-len);
  655. delete [] peekBuf;
  656. peekBuf = temp;
  657. peekBufLength -= len;
  658. return len;
  659. }
  660. }
  661. void SocketCore::addPeekData(char* data, size_t len)
  662. {
  663. if(peekBufLength+len > peekBufMax) {
  664. char* temp = new char[peekBufMax+len];
  665. memcpy(temp, peekBuf, peekBufLength);
  666. delete [] peekBuf;
  667. peekBuf = temp;
  668. peekBufMax = peekBufLength+len;
  669. }
  670. memcpy(peekBuf+peekBufLength, data, len);
  671. peekBufLength += len;
  672. }
  673. static ssize_t GNUTLS_RECORD_RECV_NO_INTERRUPT
  674. (gnutls_session_t sslSession, char* data, size_t len)
  675. {
  676. int ret;
  677. while((ret = gnutls_record_recv(sslSession, data, len)) ==
  678. GNUTLS_E_INTERRUPTED);
  679. if(ret < 0 && ret != GNUTLS_E_AGAIN) {
  680. throw DL_RETRY_EX
  681. (StringFormat(EX_SOCKET_RECV, gnutls_strerror(ret)).str());
  682. }
  683. return ret;
  684. }
  685. ssize_t SocketCore::gnutlsRecv(char* data, size_t len)
  686. {
  687. size_t plen = shiftPeekData(data, len);
  688. if(plen < len) {
  689. ssize_t ret = GNUTLS_RECORD_RECV_NO_INTERRUPT
  690. (sslSession, data+plen, len-plen);
  691. if(ret == GNUTLS_E_AGAIN) {
  692. return GNUTLS_E_AGAIN;
  693. }
  694. return plen+ret;
  695. } else {
  696. return plen;
  697. }
  698. }
  699. ssize_t SocketCore::gnutlsPeek(char* data, size_t len)
  700. {
  701. if(peekBufLength >= len) {
  702. memcpy(data, peekBuf, len);
  703. return len;
  704. } else {
  705. memcpy(data, peekBuf, peekBufLength);
  706. ssize_t ret = GNUTLS_RECORD_RECV_NO_INTERRUPT
  707. (sslSession, data+peekBufLength, len-peekBufLength);
  708. if(ret == GNUTLS_E_AGAIN) {
  709. return GNUTLS_E_AGAIN;
  710. }
  711. addPeekData(data+peekBufLength, ret);
  712. return peekBufLength;
  713. }
  714. }
  715. #endif // HAVE_LIBGNUTLS
  716. void SocketCore::prepareSecureConnection()
  717. {
  718. if(!secure) {
  719. #ifdef HAVE_LIBSSL
  720. // for SSL
  721. ssl = SSL_new(_tlsContext->getSSLCtx());
  722. if(!ssl) {
  723. throw DL_ABORT_EX
  724. (StringFormat(EX_SSL_INIT_FAILURE,
  725. ERR_error_string(ERR_get_error(), 0)).str());
  726. }
  727. if(SSL_set_fd(ssl, sockfd) == 0) {
  728. throw DL_ABORT_EX
  729. (StringFormat(EX_SSL_INIT_FAILURE,
  730. ERR_error_string(ERR_get_error(), 0)).str());
  731. }
  732. #endif // HAVE_LIBSSL
  733. #ifdef HAVE_LIBGNUTLS
  734. int r;
  735. gnutls_init(&sslSession, GNUTLS_CLIENT);
  736. // It seems err is not error message, but the argument string
  737. // which causes syntax error.
  738. const char* err;
  739. // Disables TLS1.1 here because there are servers that don't
  740. // understand TLS1.1.
  741. r = gnutls_priority_set_direct(sslSession, "NORMAL:!VERS-TLS1.1", &err);
  742. if(r != GNUTLS_E_SUCCESS) {
  743. throw DL_ABORT_EX
  744. (StringFormat(EX_SSL_INIT_FAILURE, gnutls_strerror(r)).str());
  745. }
  746. // put the x509 credentials to the current session
  747. gnutls_credentials_set(sslSession, GNUTLS_CRD_CERTIFICATE,
  748. _tlsContext->getCertCred());
  749. gnutls_transport_set_ptr(sslSession, (gnutls_transport_ptr_t)sockfd);
  750. #endif // HAVE_LIBGNUTLS
  751. secure = 1;
  752. }
  753. }
  754. bool SocketCore::initiateSecureConnection(const std::string& hostname)
  755. {
  756. if(secure == 1) {
  757. _wantRead = false;
  758. _wantWrite = false;
  759. #ifdef HAVE_LIBSSL
  760. int e = SSL_connect(ssl);
  761. if (e <= 0) {
  762. int ssl_error = SSL_get_error(ssl, e);
  763. switch(ssl_error) {
  764. case SSL_ERROR_NONE:
  765. break;
  766. case SSL_ERROR_WANT_READ:
  767. _wantRead = true;
  768. return false;
  769. case SSL_ERROR_WANT_WRITE:
  770. _wantWrite = true;
  771. return false;
  772. case SSL_ERROR_WANT_X509_LOOKUP:
  773. case SSL_ERROR_ZERO_RETURN:
  774. if (blocking) {
  775. throw DL_ABORT_EX
  776. (StringFormat(EX_SSL_CONNECT_ERROR, ssl_error).str());
  777. }
  778. break;
  779. case SSL_ERROR_SYSCALL:
  780. throw DL_ABORT_EX(EX_SSL_IO_ERROR);
  781. case SSL_ERROR_SSL:
  782. throw DL_ABORT_EX(EX_SSL_PROTOCOL_ERROR);
  783. default:
  784. throw DL_ABORT_EX
  785. (StringFormat(EX_SSL_UNKNOWN_ERROR, ssl_error).str());
  786. }
  787. }
  788. if(_tlsContext->peerVerificationEnabled()) {
  789. // verify peer
  790. X509* peerCert = SSL_get_peer_certificate(ssl);
  791. if(!peerCert) {
  792. throw DL_ABORT_EX(MSG_NO_CERT_FOUND);
  793. }
  794. auto_delete<X509*> certDeleter(peerCert, X509_free);
  795. long verifyResult = SSL_get_verify_result(ssl);
  796. if(verifyResult != X509_V_OK) {
  797. throw DL_ABORT_EX
  798. (StringFormat(MSG_CERT_VERIFICATION_FAILED,
  799. X509_verify_cert_error_string(verifyResult)).str());
  800. }
  801. X509_NAME* name = X509_get_subject_name(peerCert);
  802. if(!name) {
  803. throw DL_ABORT_EX("Could not get X509 name object from the certificate.");
  804. }
  805. bool hostnameOK = false;
  806. int lastpos = -1;
  807. while(true) {
  808. lastpos = X509_NAME_get_index_by_NID(name, NID_commonName, lastpos);
  809. if(lastpos == -1) {
  810. break;
  811. }
  812. X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, lastpos);
  813. unsigned char* out;
  814. int outlen = ASN1_STRING_to_UTF8(&out, X509_NAME_ENTRY_get_data(entry));
  815. if(outlen < 0) {
  816. continue;
  817. }
  818. std::string commonName(&out[0], &out[outlen]);
  819. OPENSSL_free(out);
  820. if(commonName == hostname) {
  821. hostnameOK = true;
  822. break;
  823. }
  824. }
  825. if(!hostnameOK) {
  826. throw DL_ABORT_EX(MSG_HOSTNAME_NOT_MATCH);
  827. }
  828. }
  829. #endif // HAVE_LIBSSL
  830. #ifdef HAVE_LIBGNUTLS
  831. int ret = gnutls_handshake(sslSession);
  832. if(ret == GNUTLS_E_AGAIN) {
  833. gnutlsRecordCheckDirection();
  834. return false;
  835. } else if(ret < 0) {
  836. throw DL_ABORT_EX
  837. (StringFormat(EX_SSL_INIT_FAILURE, gnutls_strerror(ret)).str());
  838. }
  839. if(_tlsContext->peerVerificationEnabled()) {
  840. // verify peer
  841. unsigned int status;
  842. ret = gnutls_certificate_verify_peers2(sslSession, &status);
  843. if(ret < 0) {
  844. throw DL_ABORT_EX
  845. (StringFormat("gnutls_certificate_verify_peer2() failed. Cause: %s",
  846. gnutls_strerror(ret)).str());
  847. }
  848. if(status) {
  849. std::string errors;
  850. if(status & GNUTLS_CERT_INVALID) {
  851. errors += " `not signed by known authorities or invalid'";
  852. }
  853. if(status & GNUTLS_CERT_REVOKED) {
  854. errors += " `revoked by its CA'";
  855. }
  856. if(status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
  857. errors += " `issuer is not known'";
  858. }
  859. if(!errors.empty()) {
  860. throw DL_ABORT_EX
  861. (StringFormat(MSG_CERT_VERIFICATION_FAILED, errors.c_str()).str());
  862. }
  863. }
  864. // certificate type: only X509 is allowed.
  865. if(gnutls_certificate_type_get(sslSession) != GNUTLS_CRT_X509) {
  866. throw DL_ABORT_EX("Certificate type is not X509.");
  867. }
  868. unsigned int peerCertsLength;
  869. const gnutls_datum_t* peerCerts = gnutls_certificate_get_peers
  870. (sslSession, &peerCertsLength);
  871. if(!peerCerts) {
  872. throw DL_ABORT_EX(MSG_NO_CERT_FOUND);
  873. }
  874. Time now;
  875. for(unsigned int i = 0; i < peerCertsLength; ++i) {
  876. gnutls_x509_crt_t cert;
  877. ret = gnutls_x509_crt_init(&cert);
  878. if(ret < 0) {
  879. throw DL_ABORT_EX
  880. (StringFormat("gnutls_x509_crt_init() failed. Cause: %s",
  881. gnutls_strerror(ret)).str());
  882. }
  883. auto_delete<gnutls_x509_crt_t> certDeleter
  884. (cert, gnutls_x509_crt_deinit);
  885. ret = gnutls_x509_crt_import(cert, &peerCerts[i], GNUTLS_X509_FMT_DER);
  886. if(ret < 0) {
  887. throw DL_ABORT_EX
  888. (StringFormat("gnutls_x509_crt_import() failed. Cause: %s",
  889. gnutls_strerror(ret)).str());
  890. }
  891. if(i == 0) {
  892. if(!gnutls_x509_crt_check_hostname(cert, hostname.c_str())) {
  893. throw DL_ABORT_EX(MSG_HOSTNAME_NOT_MATCH);
  894. }
  895. }
  896. time_t activationTime = gnutls_x509_crt_get_activation_time(cert);
  897. if(activationTime == -1) {
  898. throw DL_ABORT_EX("Could not get activation time from certificate.");
  899. }
  900. if(now.getTime() < activationTime) {
  901. throw DL_ABORT_EX("Certificate is not activated yet.");
  902. }
  903. time_t expirationTime = gnutls_x509_crt_get_expiration_time(cert);
  904. if(expirationTime == -1) {
  905. throw DL_ABORT_EX("Could not get expiration time from certificate.");
  906. }
  907. if(expirationTime < now.getTime()) {
  908. throw DL_ABORT_EX("Certificate has expired.");
  909. }
  910. }
  911. }
  912. peekBuf = new char[peekBufMax];
  913. #endif // HAVE_LIBGNUTLS
  914. secure = 2;
  915. return true;
  916. } else {
  917. return true;
  918. }
  919. }
  920. /* static */ int SocketCore::error()
  921. {
  922. return SOCKET_ERRNO;
  923. }
  924. /* static */ const char *SocketCore::errorMsg()
  925. {
  926. return errorMsg(SOCKET_ERRNO);
  927. }
  928. /* static */ const char *SocketCore::errorMsg(const int err)
  929. {
  930. #ifndef __MINGW32__
  931. return strerror(err);
  932. #else
  933. static char buf[256];
  934. if (FormatMessage(
  935. FORMAT_MESSAGE_FROM_SYSTEM |
  936. FORMAT_MESSAGE_IGNORE_INSERTS,
  937. NULL,
  938. err,
  939. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  940. (LPTSTR) &buf,
  941. sizeof(buf),
  942. NULL
  943. ) == 0) {
  944. snprintf(buf, sizeof(buf), EX_SOCKET_UNKNOWN_ERROR, err, err);
  945. }
  946. return buf;
  947. #endif // __MINGW32__
  948. }
  949. ssize_t SocketCore::writeData(const char* data, size_t len,
  950. const std::string& host, uint16_t port)
  951. {
  952. _wantRead = false;
  953. _wantWrite = false;
  954. struct addrinfo hints;
  955. struct addrinfo* res;
  956. memset(&hints, 0, sizeof(hints));
  957. hints.ai_family = _protocolFamily;
  958. hints.ai_socktype = _sockType;
  959. hints.ai_flags = 0;
  960. hints.ai_protocol = 0;
  961. int s;
  962. s = getaddrinfo(host.c_str(), uitos(port).c_str(), &hints, &res);
  963. if(s) {
  964. throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, gai_strerror(s)).str());
  965. }
  966. struct addrinfo* rp;
  967. ssize_t r = -1;
  968. for(rp = res; rp; rp = rp->ai_next) {
  969. while((r = sendto(sockfd, data, len, 0, rp->ai_addr, rp->ai_addrlen)) == -1 && EINTR == SOCKET_ERRNO);
  970. if(r == static_cast<ssize_t>(len)) {
  971. break;
  972. }
  973. if(r == -1 && SOCKET_ERRNO == EAGAIN) {
  974. _wantWrite = true;
  975. r = 0;
  976. break;
  977. }
  978. }
  979. freeaddrinfo(res);
  980. if(r == -1) {
  981. throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, errorMsg()).str());
  982. }
  983. return r;
  984. }
  985. ssize_t SocketCore::readDataFrom(char* data, size_t len,
  986. std::pair<std::string /* numerichost */,
  987. uint16_t /* port */>& sender)
  988. {
  989. _wantRead = false;
  990. _wantWrite = false;
  991. struct sockaddr_storage sockaddr;
  992. socklen_t sockaddrlen = sizeof(struct sockaddr_storage);
  993. struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
  994. ssize_t r;
  995. while((r = recvfrom(sockfd, data, len, 0, addrp, &sockaddrlen)) == -1 &&
  996. EINTR == SOCKET_ERRNO);
  997. if(r == -1) {
  998. if(SOCKET_ERRNO == EAGAIN) {
  999. _wantRead = true;
  1000. r = 0;
  1001. } else {
  1002. throw DL_RETRY_EX(StringFormat(EX_SOCKET_RECV, errorMsg()).str());
  1003. }
  1004. } else {
  1005. sender = util::getNumericNameInfo(addrp, sockaddrlen);
  1006. }
  1007. return r;
  1008. }
  1009. std::string SocketCore::getSocketError() const
  1010. {
  1011. int error;
  1012. socklen_t optlen = sizeof(error);
  1013. if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (a2_sockopt_t) &error, &optlen) == -1) {
  1014. throw DL_ABORT_EX(StringFormat("Failed to get socket error: %s",
  1015. errorMsg()).str());
  1016. }
  1017. if(error != 0) {
  1018. return errorMsg(error);
  1019. } else {
  1020. return "";
  1021. }
  1022. }
  1023. bool SocketCore::wantRead() const
  1024. {
  1025. return _wantRead;
  1026. }
  1027. bool SocketCore::wantWrite() const
  1028. {
  1029. return _wantWrite;
  1030. }
  1031. #ifdef HAVE_EPOLL
  1032. void SocketCore::useEpoll()
  1033. {
  1034. _pollMethod = SocketCore::POLL_METHOD_EPOLL;
  1035. }
  1036. #endif // HAVE_EPOLL
  1037. void SocketCore::useSelect()
  1038. {
  1039. _pollMethod = SocketCore::POLL_METHOD_SELECT;
  1040. }
  1041. void SocketCore::bindAddress(const std::string& interface)
  1042. {
  1043. std::vector<std::pair<struct sockaddr_storage, socklen_t> > bindAddrs;
  1044. LogFactory::getInstance()->debug("Finding interface %s", interface.c_str());
  1045. #ifdef HAVE_GETIFADDRS
  1046. // First find interface in interface addresses
  1047. struct ifaddrs* ifaddr = 0;
  1048. if(getifaddrs(&ifaddr) == -1) {
  1049. throw DL_ABORT_EX
  1050. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1051. interface.c_str(), strerror(errno)).str());
  1052. } else {
  1053. auto_delete<struct ifaddrs*> ifaddrDeleter(ifaddr, freeifaddrs);
  1054. for(struct ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  1055. if(!ifa->ifa_addr) {
  1056. continue;
  1057. }
  1058. int family = ifa->ifa_addr->sa_family;
  1059. if(_protocolFamily == AF_UNSPEC) {
  1060. if(family != AF_INET && family != AF_INET6) {
  1061. continue;
  1062. }
  1063. } else if(_protocolFamily == AF_INET) {
  1064. if(family != AF_INET) {
  1065. continue;
  1066. }
  1067. } else if(_protocolFamily == AF_INET6) {
  1068. if(family != AF_INET6) {
  1069. continue;
  1070. }
  1071. } else {
  1072. continue;
  1073. }
  1074. if(std::string(ifa->ifa_name) == interface) {
  1075. socklen_t bindAddrLen =
  1076. family == AF_INET?sizeof(struct sockaddr_in):
  1077. sizeof(struct sockaddr_in6);
  1078. struct sockaddr_storage bindAddr;
  1079. memset(&bindAddr, 0, sizeof(bindAddr));
  1080. memcpy(&bindAddr, ifa->ifa_addr, bindAddrLen);
  1081. bindAddrs.push_back(std::make_pair(bindAddr, bindAddrLen));
  1082. }
  1083. }
  1084. }
  1085. #endif // HAVE_GETIFADDRS
  1086. if(bindAddrs.empty()) {
  1087. struct addrinfo hints;
  1088. struct addrinfo* res = 0;
  1089. memset(&hints, 0, sizeof(hints));
  1090. hints.ai_family = _protocolFamily;
  1091. hints.ai_socktype = SOCK_STREAM;
  1092. hints.ai_flags = 0;
  1093. hints.ai_protocol = 0;
  1094. int s;
  1095. s = getaddrinfo(interface.c_str(), 0, &hints, &res);
  1096. if(s) {
  1097. throw DL_ABORT_EX
  1098. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1099. interface.c_str(), gai_strerror(s)).str());
  1100. } else {
  1101. auto_delete<struct addrinfo*> resDeleter(res, freeaddrinfo);
  1102. struct addrinfo* rp;
  1103. for(rp = res; rp; rp = rp->ai_next) {
  1104. socklen_t bindAddrLen = rp->ai_addrlen;
  1105. struct sockaddr_storage bindAddr;
  1106. memset(&bindAddr, 0, sizeof(bindAddr));
  1107. memcpy(&bindAddr, rp->ai_addr, rp->ai_addrlen);
  1108. // Try to bind socket with this address. If it fails, the
  1109. // address is not for this machine.
  1110. try {
  1111. SocketCore socket;
  1112. socket.bind
  1113. (reinterpret_cast<const struct sockaddr*>(&bindAddr), bindAddrLen);
  1114. bindAddrs.push_back(std::make_pair(bindAddr, bindAddrLen));
  1115. } catch(RecoverableException& e) {
  1116. continue;
  1117. }
  1118. }
  1119. }
  1120. }
  1121. if(bindAddrs.empty()) {
  1122. throw DL_ABORT_EX
  1123. (StringFormat(MSG_INTERFACE_NOT_FOUND,
  1124. interface.c_str(), "not available").str());
  1125. } else {
  1126. _bindAddrs = bindAddrs;
  1127. for(std::vector<std::pair<struct sockaddr_storage, socklen_t> >::
  1128. const_iterator i = _bindAddrs.begin(); i != _bindAddrs.end(); ++i) {
  1129. char host[NI_MAXHOST];
  1130. int s;
  1131. s = getnameinfo(reinterpret_cast<const struct sockaddr*>(&(*i).first),
  1132. (*i).second,
  1133. host, NI_MAXHOST, 0, NI_MAXSERV,
  1134. NI_NUMERICHOST);
  1135. if(s == 0) {
  1136. LogFactory::getInstance()->debug("Sockets will bind to %s", host);
  1137. }
  1138. }
  1139. }
  1140. }
  1141. } // namespace aria2