SocketCore.cc 37 KB

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