SocketCore.cc 34 KB

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