SocketCore.cc 33 KB

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