SocketCore.cc 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  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. #ifdef HAVE_IPHLPAPI_H
  37. # include <iphlpapi.h>
  38. #endif // HAVE_IPHLPAPI_H
  39. #include <unistd.h>
  40. #ifdef HAVE_IFADDRS_H
  41. # include <ifaddrs.h>
  42. #endif // HAVE_IFADDRS_H
  43. #include <cerrno>
  44. #include <cstring>
  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. # include "TLSSession.h"
  57. #endif // ENABLE_SSL
  58. namespace aria2 {
  59. #ifndef __MINGW32__
  60. # define SOCKET_ERRNO (errno)
  61. #else
  62. # define SOCKET_ERRNO (WSAGetLastError())
  63. #endif // __MINGW32__
  64. #ifdef __MINGW32__
  65. # define A2_EINPROGRESS WSAEWOULDBLOCK
  66. # define A2_EWOULDBLOCK WSAEWOULDBLOCK
  67. # define A2_EINTR WSAEINTR
  68. # define A2_WOULDBLOCK(e) (e == WSAEWOULDBLOCK)
  69. #else // !__MINGW32__
  70. # define A2_EINPROGRESS EINPROGRESS
  71. # ifndef EWOULDBLOCK
  72. # define EWOULDBLOCK EAGAIN
  73. # endif // EWOULDBLOCK
  74. # define A2_EWOULDBLOCK EWOULDBLOCK
  75. # define A2_EINTR EINTR
  76. # if EWOULDBLOCK == EAGAIN
  77. # define A2_WOULDBLOCK(e) (e == EWOULDBLOCK)
  78. # else // EWOULDBLOCK != EAGAIN
  79. # define A2_WOULDBLOCK(e) (e == EWOULDBLOCK || e == EAGAIN)
  80. # endif // EWOULDBLOCK != EAGAIN
  81. #endif // !__MINGW32__
  82. #ifdef __MINGW32__
  83. # define CLOSE(X) ::closesocket(X)
  84. #else
  85. # define CLOSE(X) close(X)
  86. #endif // __MINGW32__
  87. namespace {
  88. std::string errorMsg(int errNum)
  89. {
  90. #ifndef __MINGW32__
  91. return util::safeStrerror(errNum);
  92. #else
  93. static char buf[256];
  94. if (FormatMessage(
  95. FORMAT_MESSAGE_FROM_SYSTEM |
  96. FORMAT_MESSAGE_IGNORE_INSERTS,
  97. nullptr,
  98. errNum,
  99. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  100. (LPTSTR) &buf,
  101. sizeof(buf),
  102. nullptr
  103. ) == 0) {
  104. snprintf(buf, sizeof(buf), EX_SOCKET_UNKNOWN_ERROR, errNum, errNum);
  105. }
  106. return buf;
  107. #endif // __MINGW32__
  108. }
  109. } // namespace
  110. namespace {
  111. enum TlsState {
  112. // TLS object is not initialized.
  113. A2_TLS_NONE = 0,
  114. // TLS object is now handshaking.
  115. A2_TLS_HANDSHAKING = 2,
  116. // TLS object is now connected.
  117. A2_TLS_CONNECTED = 3
  118. };
  119. } // namespace
  120. int SocketCore::protocolFamily_ = AF_UNSPEC;
  121. std::vector<std::pair<sockaddr_union, socklen_t> >
  122. SocketCore::bindAddrs_;
  123. #ifdef ENABLE_SSL
  124. std::shared_ptr<TLSContext> SocketCore::clTlsContext_;
  125. std::shared_ptr<TLSContext> SocketCore::svTlsContext_;
  126. void SocketCore::setClientTLSContext
  127. (const std::shared_ptr<TLSContext>& tlsContext)
  128. {
  129. clTlsContext_ = tlsContext;
  130. }
  131. void SocketCore::setServerTLSContext
  132. (const std::shared_ptr<TLSContext>& tlsContext)
  133. {
  134. svTlsContext_ = tlsContext;
  135. }
  136. #endif // ENABLE_SSL
  137. SocketCore::SocketCore(int sockType)
  138. : sockType_(sockType),
  139. sockfd_(-1)
  140. {
  141. init();
  142. }
  143. SocketCore::SocketCore(sock_t sockfd, int sockType)
  144. : sockType_(sockType),
  145. sockfd_(sockfd)
  146. {
  147. init();
  148. }
  149. void SocketCore::init()
  150. {
  151. blocking_ = true;
  152. secure_ = A2_TLS_NONE;
  153. wantRead_ = false;
  154. wantWrite_ = false;
  155. }
  156. SocketCore::~SocketCore() {
  157. closeConnection();
  158. }
  159. void SocketCore::create(int family, int protocol)
  160. {
  161. int errNum;
  162. closeConnection();
  163. sock_t fd = socket(family, sockType_, protocol);
  164. errNum = SOCKET_ERRNO;
  165. if(fd == (sock_t) -1) {
  166. throw DL_ABORT_EX
  167. (fmt("Failed to create socket. Cause:%s", errorMsg(errNum).c_str()));
  168. }
  169. int sockopt = 1;
  170. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
  171. (a2_sockopt_t) &sockopt, sizeof(sockopt)) < 0) {
  172. errNum = SOCKET_ERRNO;
  173. CLOSE(fd);
  174. throw DL_ABORT_EX
  175. (fmt("Failed to create socket. Cause:%s", errorMsg(errNum).c_str()));
  176. }
  177. sockfd_ = fd;
  178. }
  179. static sock_t bindInternal
  180. (int family, int socktype, int protocol,
  181. const struct sockaddr* addr, socklen_t addrlen,
  182. std::string& error)
  183. {
  184. int errNum;
  185. sock_t fd = socket(family, socktype, protocol);
  186. errNum = SOCKET_ERRNO;
  187. if(fd == (sock_t) -1) {
  188. error = errorMsg(errNum);
  189. return -1;
  190. }
  191. int sockopt = 1;
  192. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (a2_sockopt_t) &sockopt,
  193. sizeof(sockopt)) < 0) {
  194. errNum = SOCKET_ERRNO;
  195. error = errorMsg(errNum);
  196. CLOSE(fd);
  197. return -1;
  198. }
  199. #ifdef IPV6_V6ONLY
  200. if(family == AF_INET6) {
  201. int sockopt = 1;
  202. if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (a2_sockopt_t) &sockopt,
  203. sizeof(sockopt)) < 0) {
  204. errNum = SOCKET_ERRNO;
  205. error = errorMsg(errNum);
  206. CLOSE(fd);
  207. return -1;
  208. }
  209. }
  210. #endif // IPV6_V6ONLY
  211. if(::bind(fd, addr, addrlen) == -1) {
  212. errNum = SOCKET_ERRNO;
  213. error = errorMsg(errNum);
  214. CLOSE(fd);
  215. return -1;
  216. }
  217. return fd;
  218. }
  219. static sock_t bindTo
  220. (const char* host, uint16_t port, int family, int sockType,
  221. int getaddrinfoFlags, std::string& error)
  222. {
  223. struct addrinfo* res;
  224. int s = callGetaddrinfo(&res, host, util::uitos(port).c_str(),
  225. family, sockType, getaddrinfoFlags, 0);
  226. if(s) {
  227. error = gai_strerror(s);
  228. return -1;
  229. }
  230. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  231. (res, freeaddrinfo);
  232. struct addrinfo* rp;
  233. for(rp = res; rp; rp = rp->ai_next) {
  234. sock_t fd = bindInternal(rp->ai_family, rp->ai_socktype, rp->ai_protocol,
  235. rp->ai_addr, rp->ai_addrlen, error);
  236. if(fd != (sock_t)-1) {
  237. return fd;
  238. }
  239. }
  240. return -1;
  241. }
  242. void SocketCore::bindWithFamily(uint16_t port, int family, int flags)
  243. {
  244. closeConnection();
  245. std::string error;
  246. sock_t fd = bindTo(nullptr, port, family, sockType_, flags, error);
  247. if(fd == (sock_t) -1) {
  248. throw DL_ABORT_EX(fmt(EX_SOCKET_BIND, error.c_str()));
  249. }
  250. sockfd_ = fd;
  251. }
  252. void SocketCore::bind
  253. (const char* addr, uint16_t port, int family, int flags)
  254. {
  255. closeConnection();
  256. std::string error;
  257. const char* addrp;
  258. if(addr && addr[0]) {
  259. addrp = addr;
  260. } else {
  261. addrp = nullptr;
  262. }
  263. if(!(flags&AI_PASSIVE) || bindAddrs_.empty()) {
  264. sock_t fd = bindTo(addrp, port, family, sockType_, flags, error);
  265. if(fd == (sock_t) -1) {
  266. throw DL_ABORT_EX(fmt(EX_SOCKET_BIND, error.c_str()));
  267. }
  268. sockfd_ = fd;
  269. return;
  270. }
  271. for (const auto& a : bindAddrs_) {
  272. char host[NI_MAXHOST];
  273. int s;
  274. s = getnameinfo(&a.first.sa, a.second, host, NI_MAXHOST, nullptr, 0,
  275. NI_NUMERICHOST);
  276. if(s) {
  277. error = gai_strerror(s);
  278. continue;
  279. }
  280. if(addrp && strcmp(host, addrp) != 0) {
  281. error = "Given address and resolved address do not match.";
  282. continue;
  283. }
  284. sock_t fd = bindTo(host, port, family, sockType_, flags, error);
  285. if(fd != (sock_t)-1) {
  286. sockfd_ = fd;
  287. break;
  288. }
  289. }
  290. if(sockfd_ == (sock_t) -1) {
  291. throw DL_ABORT_EX(fmt(EX_SOCKET_BIND, error.c_str()));
  292. }
  293. }
  294. void SocketCore::bind(uint16_t port, int flags)
  295. {
  296. bind(nullptr, port, protocolFamily_, flags);
  297. }
  298. void SocketCore::bind(const struct sockaddr* addr, socklen_t addrlen)
  299. {
  300. closeConnection();
  301. std::string error;
  302. sock_t fd = bindInternal(addr->sa_family, sockType_, 0, addr, addrlen, error);
  303. if(fd == (sock_t)-1) {
  304. throw DL_ABORT_EX(fmt(EX_SOCKET_BIND, error.c_str()));
  305. }
  306. sockfd_ = fd;
  307. }
  308. void SocketCore::beginListen()
  309. {
  310. if(listen(sockfd_, 1) == -1) {
  311. int errNum = SOCKET_ERRNO;
  312. throw DL_ABORT_EX(fmt(EX_SOCKET_LISTEN, errorMsg(errNum).c_str()));
  313. }
  314. setNonBlockingMode();
  315. }
  316. std::shared_ptr<SocketCore> SocketCore::acceptConnection() const
  317. {
  318. sockaddr_union sockaddr;
  319. socklen_t len = sizeof(sockaddr);
  320. sock_t fd;
  321. while((fd = accept(sockfd_, &sockaddr.sa, &len)) == (sock_t) -1 &&
  322. SOCKET_ERRNO == A2_EINTR);
  323. int errNum = SOCKET_ERRNO;
  324. if(fd == (sock_t) -1) {
  325. throw DL_ABORT_EX(fmt(EX_SOCKET_ACCEPT, errorMsg(errNum).c_str()));
  326. }
  327. std::shared_ptr<SocketCore> sock(new SocketCore(fd, sockType_));
  328. sock->setNonBlockingMode();
  329. return sock;
  330. }
  331. int SocketCore::getAddrInfo(std::pair<std::string, uint16_t>& addrinfo) const
  332. {
  333. sockaddr_union sockaddr;
  334. socklen_t len = sizeof(sockaddr);
  335. getAddrInfo(sockaddr, len);
  336. addrinfo = util::getNumericNameInfo(&sockaddr.sa, len);
  337. return sockaddr.storage.ss_family;
  338. }
  339. void SocketCore::getAddrInfo(sockaddr_union& sockaddr, socklen_t& len) const
  340. {
  341. if(getsockname(sockfd_, &sockaddr.sa, &len) == -1) {
  342. int errNum = SOCKET_ERRNO;
  343. throw DL_ABORT_EX(fmt(EX_SOCKET_GET_NAME, errorMsg(errNum).c_str()));
  344. }
  345. }
  346. int SocketCore::getAddressFamily() const
  347. {
  348. sockaddr_union sockaddr;
  349. socklen_t len = sizeof(sockaddr);
  350. getAddrInfo(sockaddr, len);
  351. return sockaddr.storage.ss_family;
  352. }
  353. int SocketCore::getPeerInfo(std::pair<std::string, uint16_t>& peerinfo) const
  354. {
  355. sockaddr_union sockaddr;
  356. socklen_t len = sizeof(sockaddr);
  357. if(getpeername(sockfd_, &sockaddr.sa, &len) == -1) {
  358. int errNum = SOCKET_ERRNO;
  359. throw DL_ABORT_EX(fmt(EX_SOCKET_GET_NAME, errorMsg(errNum).c_str()));
  360. }
  361. peerinfo = util::getNumericNameInfo(&sockaddr.sa, len);
  362. return sockaddr.storage.ss_family;
  363. }
  364. void SocketCore::establishConnection(const std::string& host, uint16_t port,
  365. bool tcpNodelay)
  366. {
  367. closeConnection();
  368. std::string error;
  369. struct addrinfo* res;
  370. int s;
  371. s = callGetaddrinfo(&res, host.c_str(), util::uitos(port).c_str(),
  372. protocolFamily_, sockType_, 0, 0);
  373. if(s) {
  374. throw DL_ABORT_EX(fmt(EX_RESOLVE_HOSTNAME, host.c_str(), gai_strerror(s)));
  375. }
  376. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  377. (res, freeaddrinfo);
  378. struct addrinfo* rp;
  379. int errNum;
  380. for(rp = res; rp; rp = rp->ai_next) {
  381. sock_t fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  382. errNum = SOCKET_ERRNO;
  383. if(fd == (sock_t) -1) {
  384. error = errorMsg(errNum);
  385. continue;
  386. }
  387. int sockopt = 1;
  388. if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (a2_sockopt_t) &sockopt,
  389. sizeof(sockopt)) < 0) {
  390. errNum = SOCKET_ERRNO;
  391. error = errorMsg(errNum);
  392. CLOSE(fd);
  393. continue;
  394. }
  395. if(!bindAddrs_.empty()) {
  396. bool bindSuccess = false;
  397. for(std::vector<std::pair<sockaddr_union, socklen_t> >::
  398. const_iterator i = bindAddrs_.begin(), eoi = bindAddrs_.end();
  399. i != eoi; ++i) {
  400. if(::bind(fd, &(*i).first.sa, (*i).second) == -1) {
  401. errNum = SOCKET_ERRNO;
  402. error = errorMsg(errNum);
  403. A2_LOG_DEBUG(fmt(EX_SOCKET_BIND, error.c_str()));
  404. } else {
  405. bindSuccess = true;
  406. break;
  407. }
  408. }
  409. if(!bindSuccess) {
  410. CLOSE(fd);
  411. continue;
  412. }
  413. }
  414. sockfd_ = fd;
  415. // make socket non-blocking mode
  416. setNonBlockingMode();
  417. if(tcpNodelay) {
  418. setTcpNodelay(true);
  419. }
  420. if(connect(fd, rp->ai_addr, rp->ai_addrlen) == -1 &&
  421. SOCKET_ERRNO != A2_EINPROGRESS) {
  422. errNum = SOCKET_ERRNO;
  423. error = errorMsg(errNum);
  424. CLOSE(sockfd_);
  425. sockfd_ = (sock_t) -1;
  426. continue;
  427. }
  428. // TODO at this point, connection may not be established and it may fail
  429. // later. In such case, next ai_addr should be tried.
  430. break;
  431. }
  432. if(sockfd_ == (sock_t) -1) {
  433. throw DL_ABORT_EX(fmt(EX_SOCKET_CONNECT, host.c_str(), error.c_str()));
  434. }
  435. }
  436. void SocketCore::setSockOpt
  437. (int level, int optname, void* optval, socklen_t optlen)
  438. {
  439. if(setsockopt(sockfd_, level, optname, (a2_sockopt_t)optval, optlen) < 0) {
  440. int errNum = SOCKET_ERRNO;
  441. throw DL_ABORT_EX(fmt(EX_SOCKET_SET_OPT, errorMsg(errNum).c_str()));
  442. }
  443. }
  444. void SocketCore::setMulticastInterface(const std::string& localAddr)
  445. {
  446. in_addr addr;
  447. if(localAddr.empty()) {
  448. addr.s_addr = htonl(INADDR_ANY);
  449. }
  450. else if(inetPton(AF_INET, localAddr.c_str(), &addr) != 0) {
  451. throw DL_ABORT_EX(fmt("%s is not valid IPv4 numeric address",
  452. localAddr.c_str()));
  453. }
  454. setSockOpt(IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr));
  455. }
  456. void SocketCore::setMulticastTtl(unsigned char ttl)
  457. {
  458. setSockOpt(IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
  459. }
  460. void SocketCore::setMulticastLoop(unsigned char loop)
  461. {
  462. setSockOpt(IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
  463. }
  464. void SocketCore::joinMulticastGroup
  465. (const std::string& multicastAddr, uint16_t multicastPort,
  466. const std::string& localAddr)
  467. {
  468. in_addr multiAddr;
  469. if(inetPton(AF_INET, multicastAddr.c_str(), &multiAddr) != 0) {
  470. throw DL_ABORT_EX(fmt("%s is not valid IPv4 numeric address",
  471. multicastAddr.c_str()));
  472. }
  473. in_addr ifAddr;
  474. if(localAddr.empty()) {
  475. ifAddr.s_addr = htonl(INADDR_ANY);
  476. }
  477. else if(inetPton(AF_INET, localAddr.c_str(), &ifAddr) != 0) {
  478. throw DL_ABORT_EX(fmt("%s is not valid IPv4 numeric address",
  479. localAddr.c_str()));
  480. }
  481. struct ip_mreq mreq;
  482. memset(&mreq, 0, sizeof(mreq));
  483. mreq.imr_multiaddr = multiAddr;
  484. mreq.imr_interface = ifAddr;
  485. setSockOpt(IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
  486. }
  487. void SocketCore::setTcpNodelay(bool f)
  488. {
  489. int val = f;
  490. setSockOpt(IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
  491. }
  492. void SocketCore::setNonBlockingMode()
  493. {
  494. #ifdef __MINGW32__
  495. static u_long flag = 1;
  496. if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) {
  497. int errNum = SOCKET_ERRNO;
  498. throw DL_ABORT_EX(fmt(EX_SOCKET_NONBLOCKING, errorMsg(errNum).c_str()));
  499. }
  500. #else
  501. int flags;
  502. while((flags = fcntl(sockfd_, F_GETFL, 0)) == -1 && errno == EINTR);
  503. // TODO add error handling
  504. while(fcntl(sockfd_, F_SETFL, flags|O_NONBLOCK) == -1 && errno == EINTR);
  505. #endif // __MINGW32__
  506. blocking_ = false;
  507. }
  508. void SocketCore::setBlockingMode()
  509. {
  510. #ifdef __MINGW32__
  511. static u_long flag = 0;
  512. if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) {
  513. int errNum = SOCKET_ERRNO;
  514. throw DL_ABORT_EX(fmt(EX_SOCKET_BLOCKING, errorMsg(errNum).c_str()));
  515. }
  516. #else
  517. int flags;
  518. while((flags = fcntl(sockfd_, F_GETFL, 0)) == -1 && errno == EINTR);
  519. // TODO add error handling
  520. while(fcntl(sockfd_, F_SETFL, flags&(~O_NONBLOCK)) == -1 && errno == EINTR);
  521. #endif // __MINGW32__
  522. blocking_ = true;
  523. }
  524. void SocketCore::closeConnection()
  525. {
  526. #ifdef ENABLE_SSL
  527. if(tlsSession_) {
  528. tlsSession_->closeConnection();
  529. tlsSession_.reset();
  530. }
  531. #endif // ENABLE_SSL
  532. if(sockfd_ != (sock_t) -1) {
  533. shutdown(sockfd_, SHUT_WR);
  534. CLOSE(sockfd_);
  535. sockfd_ = -1;
  536. }
  537. }
  538. #ifndef __MINGW32__
  539. # define CHECK_FD(fd) \
  540. if(fd < 0 || FD_SETSIZE <= fd) { \
  541. logger_->warn("Detected file descriptor >= FD_SETSIZE or < 0. " \
  542. "Download may slow down or fail."); \
  543. return false; \
  544. }
  545. #endif // !__MINGW32__
  546. bool SocketCore::isWritable(time_t timeout)
  547. {
  548. #ifdef HAVE_POLL
  549. struct pollfd p;
  550. p.fd = sockfd_;
  551. p.events = POLLOUT;
  552. int r;
  553. while((r = poll(&p, 1, timeout*1000)) == -1 && errno == EINTR);
  554. int errNum = SOCKET_ERRNO;
  555. if(r > 0) {
  556. return p.revents&(POLLOUT|POLLHUP|POLLERR);
  557. }
  558. if(r == 0) {
  559. return false;
  560. }
  561. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_WRITABLE, errorMsg(errNum).c_str()));
  562. #else // !HAVE_POLL
  563. # ifndef __MINGW32__
  564. CHECK_FD(sockfd_);
  565. # endif // !__MINGW32__
  566. fd_set fds;
  567. FD_ZERO(&fds);
  568. FD_SET(sockfd_, &fds);
  569. struct timeval tv;
  570. tv.tv_sec = timeout;
  571. tv.tv_usec = 0;
  572. int r = select(sockfd_+1, nullptr, &fds, nullptr, &tv);
  573. int errNum = SOCKET_ERRNO;
  574. if(r == 1) {
  575. return true;
  576. }
  577. if(r == 0) {
  578. // time out
  579. return false;
  580. }
  581. if(errNum == A2_EINPROGRESS || errNum == A2_EINTR) {
  582. return false;
  583. }
  584. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_WRITABLE, errorMsg(errNum).c_str()));
  585. #endif // !HAVE_POLL
  586. }
  587. bool SocketCore::isReadable(time_t timeout)
  588. {
  589. #ifdef HAVE_POLL
  590. struct pollfd p;
  591. p.fd = sockfd_;
  592. p.events = POLLIN;
  593. int r;
  594. while((r = poll(&p, 1, timeout*1000)) == -1 && errno == EINTR);
  595. int errNum = SOCKET_ERRNO;
  596. if(r > 0) {
  597. return p.revents&(POLLIN|POLLHUP|POLLERR);
  598. }
  599. if(r == 0) {
  600. return false;
  601. }
  602. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_READABLE, errorMsg(errNum).c_str()));
  603. #else // !HAVE_POLL
  604. # ifndef __MINGW32__
  605. CHECK_FD(sockfd_);
  606. # endif // !__MINGW32__
  607. fd_set fds;
  608. FD_ZERO(&fds);
  609. FD_SET(sockfd_, &fds);
  610. struct timeval tv;
  611. tv.tv_sec = timeout;
  612. tv.tv_usec = 0;
  613. int r = select(sockfd_+1, &fds, nullptr, nullptr, &tv);
  614. int errNum = SOCKET_ERRNO;
  615. if(r == 1) {
  616. return true;
  617. }
  618. if(r == 0) {
  619. // time out
  620. return false;
  621. }
  622. if(errNum == A2_EINPROGRESS || errNum == A2_EINTR) {
  623. return false;
  624. }
  625. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_READABLE, errorMsg(errNum).c_str()));
  626. #endif // !HAVE_POLL
  627. }
  628. ssize_t SocketCore::writeVector(a2iovec *iov, size_t iovcnt)
  629. {
  630. ssize_t ret = 0;
  631. wantRead_ = false;
  632. wantWrite_ = false;
  633. if(!secure_) {
  634. #ifdef __MINGW32__
  635. DWORD nsent;
  636. int rv = WSASend(sockfd_, iov, iovcnt, &nsent, 0, 0, 0);
  637. if(rv == 0) {
  638. ret = nsent;
  639. } else {
  640. ret = -1;
  641. }
  642. #else // !__MINGW32__
  643. while((ret = writev(sockfd_, iov, iovcnt)) == -1 &&
  644. SOCKET_ERRNO == A2_EINTR);
  645. #endif // !__MINGW32__
  646. int errNum = SOCKET_ERRNO;
  647. if(ret == -1) {
  648. if(!A2_WOULDBLOCK(errNum)) {
  649. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  650. }
  651. wantWrite_ = true;
  652. ret = 0;
  653. }
  654. } else {
  655. // For SSL/TLS, we could not use writev, so just iterate vector
  656. // and write the data in normal way.
  657. for(size_t i = 0; i < iovcnt; ++i) {
  658. ssize_t rv = writeData(iov[i].A2IOVEC_BASE, iov[i].A2IOVEC_LEN);
  659. if(rv == 0) {
  660. break;
  661. }
  662. ret += rv;
  663. }
  664. }
  665. return ret;
  666. }
  667. ssize_t SocketCore::writeData(const void* data, size_t len)
  668. {
  669. ssize_t ret = 0;
  670. wantRead_ = false;
  671. wantWrite_ = false;
  672. if(!secure_) {
  673. // Cast for Windows send()
  674. while((ret = send(sockfd_, reinterpret_cast<const char*>(data),
  675. len, 0)) == -1 && SOCKET_ERRNO == A2_EINTR);
  676. int errNum = SOCKET_ERRNO;
  677. if(ret == -1) {
  678. if(!A2_WOULDBLOCK(errNum)) {
  679. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  680. }
  681. wantWrite_ = true;
  682. ret = 0;
  683. }
  684. } else {
  685. #ifdef ENABLE_SSL
  686. ret = tlsSession_->writeData(data, len);
  687. if(ret < 0) {
  688. if(ret != TLS_ERR_WOULDBLOCK) {
  689. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND,
  690. tlsSession_->getLastErrorString().c_str()));
  691. }
  692. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  693. wantRead_ = true;
  694. } else {
  695. wantWrite_ = true;
  696. }
  697. ret = 0;
  698. }
  699. #endif // ENABLE_SSL
  700. }
  701. return ret;
  702. }
  703. void SocketCore::readData(void* data, size_t& len)
  704. {
  705. ssize_t ret = 0;
  706. wantRead_ = false;
  707. wantWrite_ = false;
  708. if(!secure_) {
  709. // Cast for Windows recv()
  710. while((ret = recv(sockfd_, reinterpret_cast<char*>(data), len, 0)) == -1 &&
  711. SOCKET_ERRNO == A2_EINTR);
  712. int errNum = SOCKET_ERRNO;
  713. if(ret == -1) {
  714. if(!A2_WOULDBLOCK(errNum)) {
  715. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV, errorMsg(errNum).c_str()));
  716. }
  717. wantRead_ = true;
  718. ret = 0;
  719. }
  720. } else {
  721. #ifdef ENABLE_SSL
  722. ret = tlsSession_->readData(data, len);
  723. if(ret < 0) {
  724. if(ret != TLS_ERR_WOULDBLOCK) {
  725. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV,
  726. tlsSession_->getLastErrorString().c_str()));
  727. }
  728. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  729. wantRead_ = true;
  730. } else {
  731. wantWrite_ = true;
  732. }
  733. ret = 0;
  734. }
  735. #endif // ENABLE_SSL
  736. }
  737. len = ret;
  738. }
  739. #ifdef ENABLE_SSL
  740. bool SocketCore::tlsAccept()
  741. {
  742. return tlsHandshake(svTlsContext_.get(), A2STR::NIL);
  743. }
  744. bool SocketCore::tlsConnect(const std::string& hostname)
  745. {
  746. return tlsHandshake(clTlsContext_.get(), hostname);
  747. }
  748. bool SocketCore::tlsHandshake(TLSContext* tlsctx, const std::string& hostname)
  749. {
  750. int rv = 0;
  751. std::string handshakeError;
  752. wantRead_ = false;
  753. wantWrite_ = false;
  754. switch(secure_) {
  755. case A2_TLS_NONE:
  756. A2_LOG_DEBUG("Creating TLS session");
  757. tlsSession_.reset(TLSSession::make(tlsctx));
  758. rv = tlsSession_->init(sockfd_);
  759. if(rv != TLS_ERR_OK) {
  760. std::string error = tlsSession_->getLastErrorString();
  761. tlsSession_.reset();
  762. throw DL_ABORT_EX(fmt(EX_SSL_INIT_FAILURE, error.c_str()));
  763. }
  764. // Check hostname is not numeric and it includes ".". Setting
  765. // "localhost" will produce TLS alert with GNUTLS.
  766. if(tlsctx->getSide() == TLS_CLIENT &&
  767. !util::isNumericHost(hostname) &&
  768. hostname.find(".") != std::string::npos) {
  769. rv = tlsSession_->setSNIHostname(hostname);
  770. if(rv != TLS_ERR_OK) {
  771. throw DL_ABORT_EX(fmt(EX_SSL_INIT_FAILURE,
  772. tlsSession_->getLastErrorString().c_str()));
  773. }
  774. }
  775. secure_ = A2_TLS_HANDSHAKING;
  776. A2_LOG_DEBUG("TLS Handshaking");
  777. // Fall through
  778. case A2_TLS_HANDSHAKING:
  779. if(tlsctx->getSide() == TLS_CLIENT) {
  780. rv = tlsSession_->tlsConnect(hostname, handshakeError);
  781. } else {
  782. rv = tlsSession_->tlsAccept();
  783. }
  784. if(rv == TLS_ERR_OK) {
  785. secure_ = A2_TLS_CONNECTED;
  786. break;
  787. }
  788. if(rv != TLS_ERR_WOULDBLOCK) {
  789. throw DL_ABORT_EX(fmt("SSL/TLS handshake failure: %s",
  790. handshakeError.empty() ?
  791. tlsSession_->getLastErrorString().c_str() :
  792. handshakeError.c_str()));
  793. }
  794. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  795. wantRead_ = true;
  796. } else {
  797. wantWrite_ = true;
  798. }
  799. return false;
  800. default:
  801. A2_LOG_DEBUG("TLS else");
  802. break;
  803. }
  804. return true;
  805. }
  806. #endif // ENABLE_SSL
  807. ssize_t SocketCore::writeData(const void* data, size_t len,
  808. const std::string& host, uint16_t port)
  809. {
  810. wantRead_ = false;
  811. wantWrite_ = false;
  812. struct addrinfo* res;
  813. int s;
  814. s = callGetaddrinfo(&res, host.c_str(), util::uitos(port).c_str(),
  815. protocolFamily_, sockType_, 0, 0);
  816. if(s) {
  817. throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, gai_strerror(s)));
  818. }
  819. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  820. (res, freeaddrinfo);
  821. struct addrinfo* rp;
  822. ssize_t r = -1;
  823. int errNum = 0;
  824. for(rp = res; rp; rp = rp->ai_next) {
  825. // Cast for Windows sendto()
  826. while((r = sendto(sockfd_, reinterpret_cast<const char*>(data), len, 0,
  827. rp->ai_addr, rp->ai_addrlen)) == -1
  828. && A2_EINTR == SOCKET_ERRNO);
  829. errNum = SOCKET_ERRNO;
  830. if(r == static_cast<ssize_t>(len)) {
  831. break;
  832. }
  833. if(r == -1 && A2_WOULDBLOCK(errNum)) {
  834. wantWrite_ = true;
  835. r = 0;
  836. break;
  837. }
  838. }
  839. if(r == -1) {
  840. throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  841. }
  842. return r;
  843. }
  844. ssize_t SocketCore::readDataFrom(void* data, size_t len,
  845. std::pair<std::string /* numerichost */,
  846. uint16_t /* port */>& sender)
  847. {
  848. wantRead_ = false;
  849. wantWrite_ = false;
  850. sockaddr_union sockaddr;
  851. socklen_t sockaddrlen = sizeof(sockaddr);
  852. ssize_t r;
  853. // Cast for Windows recvfrom()
  854. while((r = recvfrom(sockfd_, reinterpret_cast<char*>(data), len, 0,
  855. &sockaddr.sa, &sockaddrlen)) == -1
  856. && A2_EINTR == SOCKET_ERRNO);
  857. int errNum = SOCKET_ERRNO;
  858. if(r == -1) {
  859. if(!A2_WOULDBLOCK(errNum)) {
  860. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV, errorMsg(errNum).c_str()));
  861. }
  862. wantRead_ = true;
  863. r = 0;
  864. } else {
  865. sender = util::getNumericNameInfo(&sockaddr.sa, sockaddrlen);
  866. }
  867. return r;
  868. }
  869. std::string SocketCore::getSocketError() const
  870. {
  871. int error;
  872. socklen_t optlen = sizeof(error);
  873. if(getsockopt(sockfd_, SOL_SOCKET, SO_ERROR,
  874. (a2_sockopt_t) &error, &optlen) == -1) {
  875. int errNum = SOCKET_ERRNO;
  876. throw DL_ABORT_EX
  877. (fmt("Failed to get socket error: %s", errorMsg(errNum).c_str()));
  878. }
  879. if(error != 0) {
  880. return errorMsg(error);
  881. }
  882. return "";
  883. }
  884. bool SocketCore::wantRead() const
  885. {
  886. return wantRead_;
  887. }
  888. bool SocketCore::wantWrite() const
  889. {
  890. return wantWrite_;
  891. }
  892. void SocketCore::bindAddress(const std::string& iface)
  893. {
  894. std::vector<std::pair<sockaddr_union, socklen_t> > bindAddrs;
  895. getInterfaceAddress(bindAddrs, iface, protocolFamily_);
  896. if(bindAddrs.empty()) {
  897. throw DL_ABORT_EX(fmt(MSG_INTERFACE_NOT_FOUND, iface.c_str(),
  898. "not available"));
  899. }
  900. bindAddrs_.swap(bindAddrs);
  901. for (const auto& a: bindAddrs_) {
  902. char host[NI_MAXHOST];
  903. int s;
  904. s = getnameinfo(&a.first.sa, a.second, host, NI_MAXHOST, nullptr, 0,
  905. NI_NUMERICHOST);
  906. if(s == 0) {
  907. A2_LOG_DEBUG(fmt("Sockets will bind to %s", host));
  908. }
  909. }
  910. }
  911. void getInterfaceAddress
  912. (std::vector<std::pair<sockaddr_union, socklen_t> >& ifAddrs,
  913. const std::string& iface, int family, int aiFlags)
  914. {
  915. A2_LOG_DEBUG(fmt("Finding interface %s", iface.c_str()));
  916. #ifdef HAVE_GETIFADDRS
  917. // First find interface in interface addresses
  918. struct ifaddrs* ifaddr = nullptr;
  919. if(getifaddrs(&ifaddr) == -1) {
  920. int errNum = SOCKET_ERRNO;
  921. A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND,
  922. iface.c_str(), errorMsg(errNum).c_str()));
  923. } else {
  924. std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
  925. (ifaddr, freeifaddrs);
  926. for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  927. if(!ifa->ifa_addr) {
  928. continue;
  929. }
  930. int iffamily = ifa->ifa_addr->sa_family;
  931. if(family == AF_UNSPEC) {
  932. if(iffamily != AF_INET && iffamily != AF_INET6) {
  933. continue;
  934. }
  935. } else if(family == AF_INET) {
  936. if(iffamily != AF_INET) {
  937. continue;
  938. }
  939. } else if(family == AF_INET6) {
  940. if(iffamily != AF_INET6) {
  941. continue;
  942. }
  943. } else {
  944. continue;
  945. }
  946. if(strcmp(iface.c_str(), ifa->ifa_name) == 0) {
  947. socklen_t bindAddrLen =
  948. iffamily == AF_INET ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);
  949. sockaddr_union bindAddr;
  950. memset(&bindAddr, 0, sizeof(bindAddr));
  951. memcpy(&bindAddr.storage, ifa->ifa_addr, bindAddrLen);
  952. ifAddrs.push_back(std::make_pair(bindAddr, bindAddrLen));
  953. }
  954. }
  955. }
  956. #endif // HAVE_GETIFADDRS
  957. if(ifAddrs.empty()) {
  958. addrinfo* res;
  959. int s;
  960. s = callGetaddrinfo(&res, iface.c_str(), nullptr, family, SOCK_STREAM, aiFlags,0);
  961. if(s) {
  962. A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND, iface.c_str(), gai_strerror(s)));
  963. } else {
  964. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  965. (res, freeaddrinfo);
  966. addrinfo* rp;
  967. for(rp = res; rp; rp = rp->ai_next) {
  968. // Try to bind socket with this address. If it fails, the
  969. // address is not for this machine.
  970. try {
  971. SocketCore socket;
  972. socket.bind(rp->ai_addr, rp->ai_addrlen);
  973. sockaddr_union bindAddr;
  974. memset(&bindAddr, 0, sizeof(bindAddr));
  975. memcpy(&bindAddr.storage, rp->ai_addr, rp->ai_addrlen);
  976. ifAddrs.push_back(std::make_pair(bindAddr, rp->ai_addrlen));
  977. } catch(RecoverableException& e) {
  978. continue;
  979. }
  980. }
  981. }
  982. }
  983. }
  984. namespace {
  985. int defaultAIFlags = DEFAULT_AI_FLAGS;
  986. int getDefaultAIFlags()
  987. {
  988. return defaultAIFlags;
  989. }
  990. } // namespace
  991. void setDefaultAIFlags(int flags)
  992. {
  993. defaultAIFlags = flags;
  994. }
  995. int callGetaddrinfo
  996. (struct addrinfo** resPtr, const char* host, const char* service, int family,
  997. int sockType, int flags, int protocol)
  998. {
  999. struct addrinfo hints;
  1000. memset(&hints, 0, sizeof(hints));
  1001. hints.ai_family = family;
  1002. hints.ai_socktype = sockType;
  1003. hints.ai_flags = getDefaultAIFlags();
  1004. hints.ai_flags |= flags;
  1005. hints.ai_protocol = protocol;
  1006. return getaddrinfo(host, service, &hints, resPtr);
  1007. }
  1008. int inetNtop(int af, const void* src, char* dst, socklen_t size)
  1009. {
  1010. sockaddr_union su;
  1011. memset(&su, 0, sizeof(su));
  1012. if(af == AF_INET) {
  1013. su.in.sin_family = AF_INET;
  1014. #ifdef HAVE_SOCKADDR_IN_SIN_LEN
  1015. su.in.sin_len = sizeof(su.in);
  1016. #endif // HAVE_SOCKADDR_IN_SIN_LEN
  1017. memcpy(&su.in.sin_addr, src, sizeof(su.in.sin_addr));
  1018. return getnameinfo(&su.sa, sizeof(su.in), dst, size, nullptr, 0,
  1019. NI_NUMERICHOST);
  1020. }
  1021. if(af == AF_INET6) {
  1022. su.in6.sin6_family = AF_INET6;
  1023. #ifdef HAVE_SOCKADDR_IN6_SIN6_LEN
  1024. su.in6.sin6_len = sizeof(su.in6);
  1025. #endif // HAVE_SOCKADDR_IN6_SIN6_LEN
  1026. memcpy(&su.in6.sin6_addr, src, sizeof(su.in6.sin6_addr));
  1027. return getnameinfo(&su.sa, sizeof(su.in6), dst, size, nullptr, 0,
  1028. NI_NUMERICHOST);
  1029. }
  1030. return EAI_FAMILY;
  1031. }
  1032. int inetPton(int af, const char* src, void* dst)
  1033. {
  1034. union {
  1035. uint32_t ipv4_addr;
  1036. unsigned char ipv6_addr[16];
  1037. } binaddr;
  1038. size_t len = net::getBinAddr(binaddr.ipv6_addr, src);
  1039. if(af == AF_INET) {
  1040. if(len != 4) {
  1041. return -1;
  1042. }
  1043. in_addr* addr = reinterpret_cast<in_addr*>(dst);
  1044. addr->s_addr = binaddr.ipv4_addr;
  1045. return 0;
  1046. }
  1047. if(af == AF_INET6) {
  1048. if(len != 16) {
  1049. return -1;
  1050. }
  1051. in6_addr* addr = reinterpret_cast<in6_addr*>(dst);
  1052. memcpy(addr->s6_addr, binaddr.ipv6_addr, sizeof(addr->s6_addr));
  1053. return 0;
  1054. }
  1055. return -1;
  1056. }
  1057. namespace net {
  1058. size_t getBinAddr(void* dest, const std::string& ip)
  1059. {
  1060. size_t len = 0;
  1061. addrinfo* res;
  1062. if(callGetaddrinfo(&res, ip.c_str(), nullptr, AF_UNSPEC,
  1063. 0, AI_NUMERICHOST, 0) != 0) {
  1064. return len;
  1065. }
  1066. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  1067. (res, freeaddrinfo);
  1068. for(addrinfo* rp = res; rp; rp = rp->ai_next) {
  1069. sockaddr_union su;
  1070. memcpy(&su, rp->ai_addr, rp->ai_addrlen);
  1071. if(rp->ai_family == AF_INET) {
  1072. len = sizeof(in_addr);
  1073. memcpy(dest, &(su.in.sin_addr), len);
  1074. break;
  1075. } else if(rp->ai_family == AF_INET6) {
  1076. len = sizeof(in6_addr);
  1077. memcpy(dest, &(su.in6.sin6_addr), len);
  1078. break;
  1079. }
  1080. }
  1081. return len;
  1082. }
  1083. bool verifyHostname(const std::string& hostname,
  1084. const std::vector<std::string>& dnsNames,
  1085. const std::vector<std::string>& ipAddrs,
  1086. const std::string& commonName)
  1087. {
  1088. if(util::isNumericHost(hostname)) {
  1089. if(ipAddrs.empty()) {
  1090. return commonName == hostname;
  1091. }
  1092. // We need max 16 bytes to store IPv6 address.
  1093. unsigned char binAddr[16];
  1094. size_t addrLen = getBinAddr(binAddr, hostname);
  1095. if(addrLen == 0) {
  1096. return false;
  1097. }
  1098. for(auto& ipAddr : ipAddrs) {
  1099. if(addrLen == ipAddr.size() &&
  1100. memcmp(binAddr, ipAddr.c_str(), addrLen) == 0) {
  1101. return true;
  1102. }
  1103. }
  1104. return false;
  1105. }
  1106. if(dnsNames.empty()) {
  1107. return util::tlsHostnameMatch(commonName, hostname);
  1108. }
  1109. for(auto& dnsName : dnsNames) {
  1110. if(util::tlsHostnameMatch(dnsName, hostname)) {
  1111. return true;
  1112. }
  1113. }
  1114. return false;
  1115. }
  1116. namespace {
  1117. bool ipv4AddrConfigured = true;
  1118. bool ipv6AddrConfigured = true;
  1119. } // namespace
  1120. #ifdef __MINGW32__
  1121. namespace {
  1122. const uint32_t APIPA_IPV4_BEGIN = 2851995649u; // 169.254.0.1
  1123. const uint32_t APIPA_IPV4_END = 2852061183u; // 169.254.255.255
  1124. } // namespace
  1125. #endif // __MINGW32__
  1126. void checkAddrconfig()
  1127. {
  1128. #ifdef HAVE_IPHLPAPI_H
  1129. A2_LOG_INFO("Checking configured addresses");
  1130. ULONG bufsize = 15*1024;
  1131. ULONG retval = 0;
  1132. IP_ADAPTER_ADDRESSES* buf = 0;
  1133. int numTry = 0;
  1134. const int MAX_TRY = 3;
  1135. do {
  1136. buf = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(malloc(bufsize));
  1137. retval = GetAdaptersAddresses(AF_UNSPEC, 0, 0, buf, &bufsize);
  1138. if(retval != ERROR_BUFFER_OVERFLOW) {
  1139. break;
  1140. }
  1141. free(buf);
  1142. buf = 0;
  1143. } while(retval == ERROR_BUFFER_OVERFLOW && numTry < MAX_TRY);
  1144. if(retval != NO_ERROR) {
  1145. A2_LOG_INFO("GetAdaptersAddresses failed. Assume both IPv4 and IPv6 "
  1146. " addresses are configured.");
  1147. return;
  1148. }
  1149. ipv4AddrConfigured = false;
  1150. ipv6AddrConfigured = false;
  1151. char host[NI_MAXHOST];
  1152. sockaddr_union ad;
  1153. int rv;
  1154. for(IP_ADAPTER_ADDRESSES* p = buf; p; p = p->Next) {
  1155. if(p->IfType == IF_TYPE_TUNNEL) {
  1156. // Skip tunnel interface because Windows7 automatically setup
  1157. // this for IPv6.
  1158. continue;
  1159. }
  1160. PIP_ADAPTER_UNICAST_ADDRESS ucaddr = p->FirstUnicastAddress;
  1161. if(!ucaddr) {
  1162. continue;
  1163. }
  1164. for(PIP_ADAPTER_UNICAST_ADDRESS i = ucaddr; i; i = i->Next) {
  1165. bool found = false;
  1166. switch(i->Address.iSockaddrLength) {
  1167. case sizeof(sockaddr_in): {
  1168. memcpy(&ad.storage, i->Address.lpSockaddr,
  1169. i->Address.iSockaddrLength);
  1170. uint32_t haddr = ntohl(ad.in.sin_addr.s_addr);
  1171. if(haddr != INADDR_LOOPBACK &&
  1172. (haddr < APIPA_IPV4_BEGIN || APIPA_IPV4_END <= haddr)) {
  1173. ipv4AddrConfigured = true;
  1174. found = true;
  1175. }
  1176. break;
  1177. }
  1178. case sizeof(sockaddr_in6):
  1179. memcpy(&ad.storage, i->Address.lpSockaddr,
  1180. i->Address.iSockaddrLength);
  1181. if(!IN6_IS_ADDR_LOOPBACK(&ad.in6.sin6_addr) &&
  1182. !IN6_IS_ADDR_LINKLOCAL(&ad.in6.sin6_addr)) {
  1183. ipv6AddrConfigured = true;
  1184. found = true;
  1185. }
  1186. break;
  1187. }
  1188. rv = getnameinfo(i->Address.lpSockaddr, i->Address.iSockaddrLength,
  1189. host, NI_MAXHOST, 0, 0, NI_NUMERICHOST);
  1190. if(rv == 0) {
  1191. if(found) {
  1192. A2_LOG_INFO(fmt("Found configured address: %s", host));
  1193. } else {
  1194. A2_LOG_INFO(fmt("Not considered: %s", host));
  1195. }
  1196. }
  1197. }
  1198. }
  1199. free(buf);
  1200. A2_LOG_INFO(fmt("IPv4 configured=%d, IPv6 configured=%d",
  1201. ipv4AddrConfigured, ipv6AddrConfigured));
  1202. #elif defined(HAVE_GETIFADDRS)
  1203. A2_LOG_INFO("Checking configured addresses");
  1204. ipv4AddrConfigured = false;
  1205. ipv6AddrConfigured = false;
  1206. ifaddrs* ifaddr = nullptr;
  1207. int rv;
  1208. rv = getifaddrs(&ifaddr);
  1209. if(rv == -1) {
  1210. int errNum = SOCKET_ERRNO;
  1211. A2_LOG_INFO(fmt("getifaddrs failed. Cause: %s", errorMsg(errNum).c_str()));
  1212. return;
  1213. }
  1214. std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
  1215. (ifaddr, freeifaddrs);
  1216. char host[NI_MAXHOST];
  1217. sockaddr_union ad;
  1218. for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  1219. if(!ifa->ifa_addr) {
  1220. continue;
  1221. }
  1222. bool found = false;
  1223. size_t addrlen = 0;
  1224. switch(ifa->ifa_addr->sa_family) {
  1225. case AF_INET: {
  1226. addrlen = sizeof(sockaddr_in);
  1227. memcpy(&ad.storage, ifa->ifa_addr, addrlen);
  1228. if(ad.in.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
  1229. ipv4AddrConfigured = true;
  1230. found = true;
  1231. }
  1232. break;
  1233. }
  1234. case AF_INET6: {
  1235. addrlen = sizeof(sockaddr_in6);
  1236. memcpy(&ad.storage, ifa->ifa_addr, addrlen);
  1237. if(!IN6_IS_ADDR_LOOPBACK(&ad.in6.sin6_addr) &&
  1238. !IN6_IS_ADDR_LINKLOCAL(&ad.in6.sin6_addr)) {
  1239. ipv6AddrConfigured = true;
  1240. found = true;
  1241. }
  1242. break;
  1243. }
  1244. default:
  1245. continue;
  1246. }
  1247. rv = getnameinfo(ifa->ifa_addr, addrlen, host, NI_MAXHOST, nullptr, 0,
  1248. NI_NUMERICHOST);
  1249. if(rv == 0) {
  1250. if(found) {
  1251. A2_LOG_INFO(fmt("Found configured address: %s", host));
  1252. } else {
  1253. A2_LOG_INFO(fmt("Not considered: %s", host));
  1254. }
  1255. }
  1256. }
  1257. A2_LOG_INFO(fmt("IPv4 configured=%d, IPv6 configured=%d",
  1258. ipv4AddrConfigured, ipv6AddrConfigured));
  1259. #else // !HAVE_GETIFADDRS
  1260. A2_LOG_INFO("getifaddrs is not available. Assume IPv4 and IPv6 addresses"
  1261. " are configured.");
  1262. #endif // !HAVE_GETIFADDRS
  1263. }
  1264. bool getIPv4AddrConfigured()
  1265. {
  1266. return ipv4AddrConfigured;
  1267. }
  1268. bool getIPv6AddrConfigured()
  1269. {
  1270. return ipv6AddrConfigured;
  1271. }
  1272. } // namespace net
  1273. } // namespace aria2