SocketCore.cc 38 KB

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