SocketCore.cc 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369
  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::setIpDscp(int32_t dscp)
  493. {
  494. setSockOpt(IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp));
  495. }
  496. void SocketCore::setNonBlockingMode()
  497. {
  498. #ifdef __MINGW32__
  499. static u_long flag = 1;
  500. if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) {
  501. int errNum = SOCKET_ERRNO;
  502. throw DL_ABORT_EX(fmt(EX_SOCKET_NONBLOCKING, errorMsg(errNum).c_str()));
  503. }
  504. #else
  505. int flags;
  506. while((flags = fcntl(sockfd_, F_GETFL, 0)) == -1 && errno == EINTR);
  507. // TODO add error handling
  508. while(fcntl(sockfd_, F_SETFL, flags|O_NONBLOCK) == -1 && errno == EINTR);
  509. #endif // __MINGW32__
  510. blocking_ = false;
  511. }
  512. void SocketCore::setBlockingMode()
  513. {
  514. #ifdef __MINGW32__
  515. static u_long flag = 0;
  516. if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) {
  517. int errNum = SOCKET_ERRNO;
  518. throw DL_ABORT_EX(fmt(EX_SOCKET_BLOCKING, errorMsg(errNum).c_str()));
  519. }
  520. #else
  521. int flags;
  522. while((flags = fcntl(sockfd_, F_GETFL, 0)) == -1 && errno == EINTR);
  523. // TODO add error handling
  524. while(fcntl(sockfd_, F_SETFL, flags&(~O_NONBLOCK)) == -1 && errno == EINTR);
  525. #endif // __MINGW32__
  526. blocking_ = true;
  527. }
  528. void SocketCore::closeConnection()
  529. {
  530. #ifdef ENABLE_SSL
  531. if(tlsSession_) {
  532. tlsSession_->closeConnection();
  533. tlsSession_.reset();
  534. }
  535. #endif // ENABLE_SSL
  536. if(sockfd_ != (sock_t) -1) {
  537. shutdown(sockfd_, SHUT_WR);
  538. CLOSE(sockfd_);
  539. sockfd_ = -1;
  540. }
  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. }
  562. if(r == 0) {
  563. return false;
  564. }
  565. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_WRITABLE, errorMsg(errNum).c_str()));
  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, nullptr, &fds, nullptr, &tv);
  577. int errNum = SOCKET_ERRNO;
  578. if(r == 1) {
  579. return true;
  580. }
  581. if(r == 0) {
  582. // time out
  583. return false;
  584. }
  585. if(errNum == A2_EINPROGRESS || errNum == A2_EINTR) {
  586. return false;
  587. }
  588. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_WRITABLE, errorMsg(errNum).c_str()));
  589. #endif // !HAVE_POLL
  590. }
  591. bool SocketCore::isReadable(time_t timeout)
  592. {
  593. #ifdef HAVE_POLL
  594. struct pollfd p;
  595. p.fd = sockfd_;
  596. p.events = POLLIN;
  597. int r;
  598. while((r = poll(&p, 1, timeout*1000)) == -1 && errno == EINTR);
  599. int errNum = SOCKET_ERRNO;
  600. if(r > 0) {
  601. return p.revents&(POLLIN|POLLHUP|POLLERR);
  602. }
  603. if(r == 0) {
  604. return false;
  605. }
  606. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_READABLE, errorMsg(errNum).c_str()));
  607. #else // !HAVE_POLL
  608. # ifndef __MINGW32__
  609. CHECK_FD(sockfd_);
  610. # endif // !__MINGW32__
  611. fd_set fds;
  612. FD_ZERO(&fds);
  613. FD_SET(sockfd_, &fds);
  614. struct timeval tv;
  615. tv.tv_sec = timeout;
  616. tv.tv_usec = 0;
  617. int r = select(sockfd_+1, &fds, nullptr, nullptr, &tv);
  618. int errNum = SOCKET_ERRNO;
  619. if(r == 1) {
  620. return true;
  621. }
  622. if(r == 0) {
  623. // time out
  624. return false;
  625. }
  626. if(errNum == A2_EINPROGRESS || errNum == A2_EINTR) {
  627. return false;
  628. }
  629. throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_READABLE, errorMsg(errNum).c_str()));
  630. #endif // !HAVE_POLL
  631. }
  632. ssize_t SocketCore::writeVector(a2iovec *iov, size_t iovcnt)
  633. {
  634. ssize_t ret = 0;
  635. wantRead_ = false;
  636. wantWrite_ = false;
  637. if(!secure_) {
  638. #ifdef __MINGW32__
  639. DWORD nsent;
  640. int rv = WSASend(sockfd_, iov, iovcnt, &nsent, 0, 0, 0);
  641. if(rv == 0) {
  642. ret = nsent;
  643. } else {
  644. ret = -1;
  645. }
  646. #else // !__MINGW32__
  647. while((ret = writev(sockfd_, iov, iovcnt)) == -1 &&
  648. SOCKET_ERRNO == A2_EINTR);
  649. #endif // !__MINGW32__
  650. int errNum = SOCKET_ERRNO;
  651. if(ret == -1) {
  652. if(!A2_WOULDBLOCK(errNum)) {
  653. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  654. }
  655. wantWrite_ = true;
  656. ret = 0;
  657. }
  658. } else {
  659. // For SSL/TLS, we could not use writev, so just iterate vector
  660. // and write the data in normal way.
  661. for(size_t i = 0; i < iovcnt; ++i) {
  662. ssize_t rv = writeData(iov[i].A2IOVEC_BASE, iov[i].A2IOVEC_LEN);
  663. if(rv == 0) {
  664. break;
  665. }
  666. ret += rv;
  667. }
  668. }
  669. return ret;
  670. }
  671. ssize_t SocketCore::writeData(const void* data, size_t len)
  672. {
  673. ssize_t ret = 0;
  674. wantRead_ = false;
  675. wantWrite_ = false;
  676. if(!secure_) {
  677. // Cast for Windows send()
  678. while((ret = send(sockfd_, reinterpret_cast<const char*>(data),
  679. len, 0)) == -1 && SOCKET_ERRNO == A2_EINTR);
  680. int errNum = SOCKET_ERRNO;
  681. if(ret == -1) {
  682. if(!A2_WOULDBLOCK(errNum)) {
  683. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  684. }
  685. wantWrite_ = true;
  686. ret = 0;
  687. }
  688. } else {
  689. #ifdef ENABLE_SSL
  690. ret = tlsSession_->writeData(data, len);
  691. if(ret < 0) {
  692. if(ret != TLS_ERR_WOULDBLOCK) {
  693. throw DL_RETRY_EX(fmt(EX_SOCKET_SEND,
  694. tlsSession_->getLastErrorString().c_str()));
  695. }
  696. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  697. wantRead_ = true;
  698. } else {
  699. wantWrite_ = true;
  700. }
  701. ret = 0;
  702. }
  703. #endif // ENABLE_SSL
  704. }
  705. return ret;
  706. }
  707. void SocketCore::readData(void* data, size_t& len)
  708. {
  709. ssize_t ret = 0;
  710. wantRead_ = false;
  711. wantWrite_ = false;
  712. if(!secure_) {
  713. // Cast for Windows recv()
  714. while((ret = recv(sockfd_, reinterpret_cast<char*>(data), len, 0)) == -1 &&
  715. SOCKET_ERRNO == A2_EINTR);
  716. int errNum = SOCKET_ERRNO;
  717. if(ret == -1) {
  718. if(!A2_WOULDBLOCK(errNum)) {
  719. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV, errorMsg(errNum).c_str()));
  720. }
  721. wantRead_ = true;
  722. ret = 0;
  723. }
  724. } else {
  725. #ifdef ENABLE_SSL
  726. ret = tlsSession_->readData(data, len);
  727. if(ret < 0) {
  728. if(ret != TLS_ERR_WOULDBLOCK) {
  729. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV,
  730. tlsSession_->getLastErrorString().c_str()));
  731. }
  732. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  733. wantRead_ = true;
  734. } else {
  735. wantWrite_ = true;
  736. }
  737. ret = 0;
  738. }
  739. #endif // ENABLE_SSL
  740. }
  741. len = ret;
  742. }
  743. #ifdef ENABLE_SSL
  744. bool SocketCore::tlsAccept()
  745. {
  746. return tlsHandshake(svTlsContext_.get(), A2STR::NIL);
  747. }
  748. bool SocketCore::tlsConnect(const std::string& hostname)
  749. {
  750. return tlsHandshake(clTlsContext_.get(), hostname);
  751. }
  752. bool SocketCore::tlsHandshake(TLSContext* tlsctx, const std::string& hostname)
  753. {
  754. int rv = 0;
  755. std::string handshakeError;
  756. wantRead_ = false;
  757. wantWrite_ = false;
  758. switch(secure_) {
  759. case A2_TLS_NONE:
  760. A2_LOG_DEBUG("Creating TLS session");
  761. tlsSession_.reset(TLSSession::make(tlsctx));
  762. rv = tlsSession_->init(sockfd_);
  763. if(rv != TLS_ERR_OK) {
  764. std::string error = tlsSession_->getLastErrorString();
  765. tlsSession_.reset();
  766. throw DL_ABORT_EX(fmt(EX_SSL_INIT_FAILURE, error.c_str()));
  767. }
  768. // Check hostname is not numeric and it includes ".". Setting
  769. // "localhost" will produce TLS alert with GNUTLS.
  770. if(tlsctx->getSide() == TLS_CLIENT &&
  771. !util::isNumericHost(hostname) &&
  772. hostname.find(".") != std::string::npos) {
  773. rv = tlsSession_->setSNIHostname(hostname);
  774. if(rv != TLS_ERR_OK) {
  775. throw DL_ABORT_EX(fmt(EX_SSL_INIT_FAILURE,
  776. tlsSession_->getLastErrorString().c_str()));
  777. }
  778. }
  779. secure_ = A2_TLS_HANDSHAKING;
  780. A2_LOG_DEBUG("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. break;
  791. }
  792. if(rv != TLS_ERR_WOULDBLOCK) {
  793. throw DL_ABORT_EX(fmt("SSL/TLS handshake failure: %s",
  794. handshakeError.empty() ?
  795. tlsSession_->getLastErrorString().c_str() :
  796. handshakeError.c_str()));
  797. }
  798. if(tlsSession_->checkDirection() == TLS_WANT_READ) {
  799. wantRead_ = true;
  800. } else {
  801. wantWrite_ = true;
  802. }
  803. return false;
  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. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  823. (res, freeaddrinfo);
  824. struct addrinfo* rp;
  825. ssize_t r = -1;
  826. int errNum = 0;
  827. for(rp = res; rp; rp = rp->ai_next) {
  828. // Cast for Windows sendto()
  829. while((r = sendto(sockfd_, reinterpret_cast<const char*>(data), len, 0,
  830. rp->ai_addr, rp->ai_addrlen)) == -1
  831. && A2_EINTR == SOCKET_ERRNO);
  832. errNum = SOCKET_ERRNO;
  833. if(r == static_cast<ssize_t>(len)) {
  834. break;
  835. }
  836. if(r == -1 && A2_WOULDBLOCK(errNum)) {
  837. wantWrite_ = true;
  838. r = 0;
  839. break;
  840. }
  841. }
  842. if(r == -1) {
  843. throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
  844. }
  845. return r;
  846. }
  847. ssize_t SocketCore::readDataFrom(void* data, size_t len,
  848. std::pair<std::string /* numerichost */,
  849. uint16_t /* port */>& sender)
  850. {
  851. wantRead_ = false;
  852. wantWrite_ = false;
  853. sockaddr_union sockaddr;
  854. socklen_t sockaddrlen = sizeof(sockaddr);
  855. ssize_t r;
  856. // Cast for Windows recvfrom()
  857. while((r = recvfrom(sockfd_, reinterpret_cast<char*>(data), len, 0,
  858. &sockaddr.sa, &sockaddrlen)) == -1
  859. && A2_EINTR == SOCKET_ERRNO);
  860. int errNum = SOCKET_ERRNO;
  861. if(r == -1) {
  862. if(!A2_WOULDBLOCK(errNum)) {
  863. throw DL_RETRY_EX(fmt(EX_SOCKET_RECV, errorMsg(errNum).c_str()));
  864. }
  865. wantRead_ = true;
  866. r = 0;
  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. }
  885. return "";
  886. }
  887. bool SocketCore::wantRead() const
  888. {
  889. return wantRead_;
  890. }
  891. bool SocketCore::wantWrite() const
  892. {
  893. return wantWrite_;
  894. }
  895. void SocketCore::bindAddress(const std::string& iface)
  896. {
  897. std::vector<std::pair<sockaddr_union, socklen_t> > bindAddrs;
  898. getInterfaceAddress(bindAddrs, iface, protocolFamily_);
  899. if(bindAddrs.empty()) {
  900. throw DL_ABORT_EX(fmt(MSG_INTERFACE_NOT_FOUND, iface.c_str(),
  901. "not available"));
  902. }
  903. bindAddrs_.swap(bindAddrs);
  904. for (const auto& a: bindAddrs_) {
  905. char host[NI_MAXHOST];
  906. int s;
  907. s = getnameinfo(&a.first.sa, a.second, host, NI_MAXHOST, nullptr, 0,
  908. NI_NUMERICHOST);
  909. if(s == 0) {
  910. A2_LOG_DEBUG(fmt("Sockets will bind to %s", host));
  911. }
  912. }
  913. }
  914. void getInterfaceAddress
  915. (std::vector<std::pair<sockaddr_union, socklen_t> >& ifAddrs,
  916. const std::string& iface, int family, int aiFlags)
  917. {
  918. A2_LOG_DEBUG(fmt("Finding interface %s", iface.c_str()));
  919. #ifdef HAVE_GETIFADDRS
  920. // First find interface in interface addresses
  921. struct ifaddrs* ifaddr = nullptr;
  922. if(getifaddrs(&ifaddr) == -1) {
  923. int errNum = SOCKET_ERRNO;
  924. A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND,
  925. iface.c_str(), errorMsg(errNum).c_str()));
  926. } else {
  927. std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
  928. (ifaddr, freeifaddrs);
  929. for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  930. if(!ifa->ifa_addr) {
  931. continue;
  932. }
  933. int iffamily = ifa->ifa_addr->sa_family;
  934. if(family == AF_UNSPEC) {
  935. if(iffamily != AF_INET && iffamily != AF_INET6) {
  936. continue;
  937. }
  938. } else if(family == AF_INET) {
  939. if(iffamily != AF_INET) {
  940. continue;
  941. }
  942. } else if(family == AF_INET6) {
  943. if(iffamily != AF_INET6) {
  944. continue;
  945. }
  946. } else {
  947. continue;
  948. }
  949. if(strcmp(iface.c_str(), ifa->ifa_name) == 0) {
  950. socklen_t bindAddrLen =
  951. iffamily == AF_INET ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);
  952. sockaddr_union bindAddr;
  953. memset(&bindAddr, 0, sizeof(bindAddr));
  954. memcpy(&bindAddr.storage, ifa->ifa_addr, bindAddrLen);
  955. ifAddrs.push_back(std::make_pair(bindAddr, bindAddrLen));
  956. }
  957. }
  958. }
  959. #endif // HAVE_GETIFADDRS
  960. if(ifAddrs.empty()) {
  961. addrinfo* res;
  962. int s;
  963. s = callGetaddrinfo(&res, iface.c_str(), nullptr, family, SOCK_STREAM, aiFlags,0);
  964. if(s) {
  965. A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND, iface.c_str(), gai_strerror(s)));
  966. } else {
  967. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  968. (res, freeaddrinfo);
  969. addrinfo* rp;
  970. for(rp = res; rp; rp = rp->ai_next) {
  971. // Try to bind socket with this address. If it fails, the
  972. // address is not for this machine.
  973. try {
  974. SocketCore socket;
  975. socket.bind(rp->ai_addr, rp->ai_addrlen);
  976. sockaddr_union bindAddr;
  977. memset(&bindAddr, 0, sizeof(bindAddr));
  978. memcpy(&bindAddr.storage, rp->ai_addr, rp->ai_addrlen);
  979. ifAddrs.push_back(std::make_pair(bindAddr, rp->ai_addrlen));
  980. } catch(RecoverableException& e) {
  981. continue;
  982. }
  983. }
  984. }
  985. }
  986. }
  987. namespace {
  988. int defaultAIFlags = DEFAULT_AI_FLAGS;
  989. int getDefaultAIFlags()
  990. {
  991. return defaultAIFlags;
  992. }
  993. } // namespace
  994. void setDefaultAIFlags(int flags)
  995. {
  996. defaultAIFlags = flags;
  997. }
  998. int callGetaddrinfo
  999. (struct addrinfo** resPtr, const char* host, const char* service, int family,
  1000. int sockType, int flags, int protocol)
  1001. {
  1002. struct addrinfo hints;
  1003. memset(&hints, 0, sizeof(hints));
  1004. hints.ai_family = family;
  1005. hints.ai_socktype = sockType;
  1006. hints.ai_flags = getDefaultAIFlags();
  1007. hints.ai_flags |= flags;
  1008. hints.ai_protocol = protocol;
  1009. return getaddrinfo(host, service, &hints, resPtr);
  1010. }
  1011. int inetNtop(int af, const void* src, char* dst, socklen_t size)
  1012. {
  1013. sockaddr_union su;
  1014. memset(&su, 0, sizeof(su));
  1015. if(af == AF_INET) {
  1016. su.in.sin_family = AF_INET;
  1017. #ifdef HAVE_SOCKADDR_IN_SIN_LEN
  1018. su.in.sin_len = sizeof(su.in);
  1019. #endif // HAVE_SOCKADDR_IN_SIN_LEN
  1020. memcpy(&su.in.sin_addr, src, sizeof(su.in.sin_addr));
  1021. return getnameinfo(&su.sa, sizeof(su.in), dst, size, nullptr, 0,
  1022. NI_NUMERICHOST);
  1023. }
  1024. if(af == AF_INET6) {
  1025. su.in6.sin6_family = AF_INET6;
  1026. #ifdef HAVE_SOCKADDR_IN6_SIN6_LEN
  1027. su.in6.sin6_len = sizeof(su.in6);
  1028. #endif // HAVE_SOCKADDR_IN6_SIN6_LEN
  1029. memcpy(&su.in6.sin6_addr, src, sizeof(su.in6.sin6_addr));
  1030. return getnameinfo(&su.sa, sizeof(su.in6), dst, size, nullptr, 0,
  1031. NI_NUMERICHOST);
  1032. }
  1033. return EAI_FAMILY;
  1034. }
  1035. int inetPton(int af, const char* src, void* dst)
  1036. {
  1037. union {
  1038. uint32_t ipv4_addr;
  1039. unsigned char ipv6_addr[16];
  1040. } binaddr;
  1041. size_t len = net::getBinAddr(binaddr.ipv6_addr, src);
  1042. if(af == AF_INET) {
  1043. if(len != 4) {
  1044. return -1;
  1045. }
  1046. in_addr* addr = reinterpret_cast<in_addr*>(dst);
  1047. addr->s_addr = binaddr.ipv4_addr;
  1048. return 0;
  1049. }
  1050. if(af == AF_INET6) {
  1051. if(len != 16) {
  1052. return -1;
  1053. }
  1054. in6_addr* addr = reinterpret_cast<in6_addr*>(dst);
  1055. memcpy(addr->s6_addr, binaddr.ipv6_addr, sizeof(addr->s6_addr));
  1056. return 0;
  1057. }
  1058. return -1;
  1059. }
  1060. namespace net {
  1061. size_t getBinAddr(void* dest, const std::string& ip)
  1062. {
  1063. size_t len = 0;
  1064. addrinfo* res;
  1065. if(callGetaddrinfo(&res, ip.c_str(), nullptr, AF_UNSPEC,
  1066. 0, AI_NUMERICHOST, 0) != 0) {
  1067. return len;
  1068. }
  1069. std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
  1070. (res, freeaddrinfo);
  1071. for(addrinfo* rp = res; rp; rp = rp->ai_next) {
  1072. sockaddr_union su;
  1073. memcpy(&su, rp->ai_addr, rp->ai_addrlen);
  1074. if(rp->ai_family == AF_INET) {
  1075. len = sizeof(in_addr);
  1076. memcpy(dest, &(su.in.sin_addr), len);
  1077. break;
  1078. } else if(rp->ai_family == AF_INET6) {
  1079. len = sizeof(in6_addr);
  1080. memcpy(dest, &(su.in6.sin6_addr), len);
  1081. break;
  1082. }
  1083. }
  1084. return len;
  1085. }
  1086. bool verifyHostname(const std::string& hostname,
  1087. const std::vector<std::string>& dnsNames,
  1088. const std::vector<std::string>& ipAddrs,
  1089. const std::string& commonName)
  1090. {
  1091. if(util::isNumericHost(hostname)) {
  1092. if(ipAddrs.empty()) {
  1093. return commonName == hostname;
  1094. }
  1095. // We need max 16 bytes to store IPv6 address.
  1096. unsigned char binAddr[16];
  1097. size_t addrLen = getBinAddr(binAddr, hostname);
  1098. if(addrLen == 0) {
  1099. return false;
  1100. }
  1101. for(auto& ipAddr : ipAddrs) {
  1102. if(addrLen == ipAddr.size() &&
  1103. memcmp(binAddr, ipAddr.c_str(), addrLen) == 0) {
  1104. return true;
  1105. }
  1106. }
  1107. return false;
  1108. }
  1109. if(dnsNames.empty()) {
  1110. return util::tlsHostnameMatch(commonName, hostname);
  1111. }
  1112. for(auto& dnsName : dnsNames) {
  1113. if(util::tlsHostnameMatch(dnsName, hostname)) {
  1114. return true;
  1115. }
  1116. }
  1117. return false;
  1118. }
  1119. namespace {
  1120. bool ipv4AddrConfigured = true;
  1121. bool ipv6AddrConfigured = true;
  1122. } // namespace
  1123. #ifdef __MINGW32__
  1124. namespace {
  1125. const uint32_t APIPA_IPV4_BEGIN = 2851995649u; // 169.254.0.1
  1126. const uint32_t APIPA_IPV4_END = 2852061183u; // 169.254.255.255
  1127. } // namespace
  1128. #endif // __MINGW32__
  1129. void checkAddrconfig()
  1130. {
  1131. #ifdef HAVE_IPHLPAPI_H
  1132. A2_LOG_INFO("Checking configured addresses");
  1133. ULONG bufsize = 15*1024;
  1134. ULONG retval = 0;
  1135. IP_ADAPTER_ADDRESSES* buf = 0;
  1136. int numTry = 0;
  1137. const int MAX_TRY = 3;
  1138. do {
  1139. buf = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(malloc(bufsize));
  1140. retval = GetAdaptersAddresses(AF_UNSPEC, 0, 0, buf, &bufsize);
  1141. if(retval != ERROR_BUFFER_OVERFLOW) {
  1142. break;
  1143. }
  1144. free(buf);
  1145. buf = 0;
  1146. } while(retval == ERROR_BUFFER_OVERFLOW && numTry < MAX_TRY);
  1147. if(retval != NO_ERROR) {
  1148. A2_LOG_INFO("GetAdaptersAddresses failed. Assume both IPv4 and IPv6 "
  1149. " addresses are configured.");
  1150. return;
  1151. }
  1152. ipv4AddrConfigured = false;
  1153. ipv6AddrConfigured = false;
  1154. char host[NI_MAXHOST];
  1155. sockaddr_union ad;
  1156. int rv;
  1157. for(IP_ADAPTER_ADDRESSES* p = buf; p; p = p->Next) {
  1158. if(p->IfType == IF_TYPE_TUNNEL) {
  1159. // Skip tunnel interface because Windows7 automatically setup
  1160. // this for IPv6.
  1161. continue;
  1162. }
  1163. PIP_ADAPTER_UNICAST_ADDRESS ucaddr = p->FirstUnicastAddress;
  1164. if(!ucaddr) {
  1165. continue;
  1166. }
  1167. for(PIP_ADAPTER_UNICAST_ADDRESS i = ucaddr; i; i = i->Next) {
  1168. bool found = false;
  1169. switch(i->Address.iSockaddrLength) {
  1170. case sizeof(sockaddr_in): {
  1171. memcpy(&ad.storage, i->Address.lpSockaddr,
  1172. i->Address.iSockaddrLength);
  1173. uint32_t haddr = ntohl(ad.in.sin_addr.s_addr);
  1174. if(haddr != INADDR_LOOPBACK &&
  1175. (haddr < APIPA_IPV4_BEGIN || APIPA_IPV4_END <= haddr)) {
  1176. ipv4AddrConfigured = true;
  1177. found = true;
  1178. }
  1179. break;
  1180. }
  1181. case sizeof(sockaddr_in6):
  1182. memcpy(&ad.storage, i->Address.lpSockaddr,
  1183. i->Address.iSockaddrLength);
  1184. if(!IN6_IS_ADDR_LOOPBACK(&ad.in6.sin6_addr) &&
  1185. !IN6_IS_ADDR_LINKLOCAL(&ad.in6.sin6_addr)) {
  1186. ipv6AddrConfigured = true;
  1187. found = true;
  1188. }
  1189. break;
  1190. }
  1191. rv = getnameinfo(i->Address.lpSockaddr, i->Address.iSockaddrLength,
  1192. host, NI_MAXHOST, 0, 0, NI_NUMERICHOST);
  1193. if(rv == 0) {
  1194. if(found) {
  1195. A2_LOG_INFO(fmt("Found configured address: %s", host));
  1196. } else {
  1197. A2_LOG_INFO(fmt("Not considered: %s", host));
  1198. }
  1199. }
  1200. }
  1201. }
  1202. free(buf);
  1203. A2_LOG_INFO(fmt("IPv4 configured=%d, IPv6 configured=%d",
  1204. ipv4AddrConfigured, ipv6AddrConfigured));
  1205. #elif defined(HAVE_GETIFADDRS)
  1206. A2_LOG_INFO("Checking configured addresses");
  1207. ipv4AddrConfigured = false;
  1208. ipv6AddrConfigured = false;
  1209. ifaddrs* ifaddr = nullptr;
  1210. int rv;
  1211. rv = getifaddrs(&ifaddr);
  1212. if(rv == -1) {
  1213. int errNum = SOCKET_ERRNO;
  1214. A2_LOG_INFO(fmt("getifaddrs failed. Cause: %s", errorMsg(errNum).c_str()));
  1215. return;
  1216. }
  1217. std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
  1218. (ifaddr, freeifaddrs);
  1219. char host[NI_MAXHOST];
  1220. sockaddr_union ad;
  1221. for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
  1222. if(!ifa->ifa_addr) {
  1223. continue;
  1224. }
  1225. bool found = false;
  1226. size_t addrlen = 0;
  1227. switch(ifa->ifa_addr->sa_family) {
  1228. case AF_INET: {
  1229. addrlen = sizeof(sockaddr_in);
  1230. memcpy(&ad.storage, ifa->ifa_addr, addrlen);
  1231. if(ad.in.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
  1232. ipv4AddrConfigured = true;
  1233. found = true;
  1234. }
  1235. break;
  1236. }
  1237. case AF_INET6: {
  1238. addrlen = sizeof(sockaddr_in6);
  1239. memcpy(&ad.storage, ifa->ifa_addr, addrlen);
  1240. if(!IN6_IS_ADDR_LOOPBACK(&ad.in6.sin6_addr) &&
  1241. !IN6_IS_ADDR_LINKLOCAL(&ad.in6.sin6_addr)) {
  1242. ipv6AddrConfigured = true;
  1243. found = true;
  1244. }
  1245. break;
  1246. }
  1247. default:
  1248. continue;
  1249. }
  1250. rv = getnameinfo(ifa->ifa_addr, addrlen, host, NI_MAXHOST, nullptr, 0,
  1251. NI_NUMERICHOST);
  1252. if(rv == 0) {
  1253. if(found) {
  1254. A2_LOG_INFO(fmt("Found configured address: %s", host));
  1255. } else {
  1256. A2_LOG_INFO(fmt("Not considered: %s", host));
  1257. }
  1258. }
  1259. }
  1260. A2_LOG_INFO(fmt("IPv4 configured=%d, IPv6 configured=%d",
  1261. ipv4AddrConfigured, ipv6AddrConfigured));
  1262. #else // !HAVE_GETIFADDRS
  1263. A2_LOG_INFO("getifaddrs is not available. Assume IPv4 and IPv6 addresses"
  1264. " are configured.");
  1265. #endif // !HAVE_GETIFADDRS
  1266. }
  1267. bool getIPv4AddrConfigured()
  1268. {
  1269. return ipv4AddrConfigured;
  1270. }
  1271. bool getIPv6AddrConfigured()
  1272. {
  1273. return ipv6AddrConfigured;
  1274. }
  1275. } // namespace net
  1276. } // namespace aria2