BSocket.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431
  1. /**
  2. * @file BSocket.c
  3. * @author Ambroz Bizjak <ambrop7@gmail.com>
  4. *
  5. * @section LICENSE
  6. *
  7. * This file is part of BadVPN.
  8. *
  9. * BadVPN is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * BadVPN is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. #ifdef BADVPN_USE_WINAPI
  23. #include <winsock2.h>
  24. #include <misc/mswsock.h>
  25. #else
  26. #define _GNU_SOURCE
  27. #include <sys/types.h>
  28. #include <sys/socket.h>
  29. #include <netinet/in.h>
  30. #include <netinet/tcp.h>
  31. #include <arpa/inet.h>
  32. #include <unistd.h>
  33. #include <fcntl.h>
  34. #include <errno.h>
  35. #endif
  36. #include <stdlib.h>
  37. #include <string.h>
  38. #include <misc/debug.h>
  39. #include <system/BSocket.h>
  40. #define HANDLER_READ 0
  41. #define HANDLER_WRITE 1
  42. #define HANDLER_ACCEPT 2
  43. #define HANDLER_CONNECT 3
  44. static void init_handlers (BSocket *bs)
  45. {
  46. bs->global_handler = NULL;
  47. int i;
  48. for (i = 0; i < 4; i++) {
  49. bs->handlers[i] = NULL;
  50. }
  51. }
  52. static int set_nonblocking (int s)
  53. {
  54. #ifdef BADVPN_USE_WINAPI
  55. unsigned long bl = 1;
  56. int res = ioctlsocket(s, FIONBIO, &bl);
  57. #else
  58. int res = fcntl(s, F_SETFL, O_NONBLOCK);
  59. #endif
  60. return res;
  61. }
  62. static int set_pktinfo (int s)
  63. {
  64. #ifdef BADVPN_USE_WINAPI
  65. DWORD opt = 1;
  66. int res = setsockopt(s, IPPROTO_IP, IP_PKTINFO, (char *)&opt, sizeof(opt));
  67. #else
  68. int opt = 1;
  69. int res = setsockopt(s, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt));
  70. #endif
  71. return res;
  72. }
  73. static int set_pktinfo6 (int s)
  74. {
  75. #ifdef BADVPN_USE_WINAPI
  76. DWORD opt = 1;
  77. int res = setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, (char *)&opt, sizeof(opt));
  78. #else
  79. int opt = 1;
  80. int res = setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opt, sizeof(opt));
  81. #endif
  82. return res;
  83. }
  84. static void close_socket (int fd)
  85. {
  86. #ifdef BADVPN_USE_WINAPI
  87. int res = closesocket(fd);
  88. #else
  89. int res = close(fd);
  90. #endif
  91. ASSERT_FORCE(res == 0)
  92. }
  93. struct sys_addr {
  94. #ifdef BADVPN_USE_WINAPI
  95. int len;
  96. #else
  97. socklen_t len;
  98. #endif
  99. union {
  100. struct sockaddr generic;
  101. struct sockaddr_in ipv4;
  102. struct sockaddr_in6 ipv6;
  103. } addr;
  104. };
  105. static void addr_socket_to_sys (struct sys_addr *out, BAddr *addr)
  106. {
  107. switch (addr->type) {
  108. case BADDR_TYPE_IPV4:
  109. out->len = sizeof(out->addr.ipv4);
  110. memset(&out->addr.ipv4, 0, sizeof(out->addr.ipv4));
  111. out->addr.ipv4.sin_family = AF_INET;
  112. out->addr.ipv4.sin_port = addr->ipv4.port;
  113. out->addr.ipv4.sin_addr.s_addr = addr->ipv4.ip;
  114. break;
  115. case BADDR_TYPE_IPV6:
  116. out->len = sizeof(out->addr.ipv6);
  117. memset(&out->addr.ipv6, 0, sizeof(out->addr.ipv6));
  118. out->addr.ipv6.sin6_family = AF_INET6;
  119. out->addr.ipv6.sin6_port = addr->ipv6.port;
  120. out->addr.ipv6.sin6_flowinfo = 0;
  121. memcpy(out->addr.ipv6.sin6_addr.s6_addr, addr->ipv6.ip, 16);
  122. out->addr.ipv6.sin6_scope_id = 0;
  123. break;
  124. default:
  125. ASSERT(0)
  126. break;
  127. }
  128. }
  129. static void addr_sys_to_socket (BAddr *out, struct sys_addr *addr)
  130. {
  131. switch (addr->addr.generic.sa_family) {
  132. case AF_INET:
  133. ASSERT(addr->len == sizeof(struct sockaddr_in))
  134. out->type = BADDR_TYPE_IPV4;
  135. out->ipv4.ip = addr->addr.ipv4.sin_addr.s_addr;
  136. out->ipv4.port = addr->addr.ipv4.sin_port;
  137. break;
  138. case AF_INET6:
  139. ASSERT(addr->len == sizeof(struct sockaddr_in6))
  140. out->type = BADDR_TYPE_IPV6;
  141. memcpy(out->ipv6.ip, addr->addr.ipv6.sin6_addr.s6_addr, 16);
  142. out->ipv6.port = addr->addr.ipv6.sin6_port;
  143. break;
  144. default:
  145. ASSERT(0)
  146. break;
  147. }
  148. }
  149. static int get_event_index (int event)
  150. {
  151. switch (event) {
  152. case BSOCKET_READ:
  153. return HANDLER_READ;
  154. case BSOCKET_WRITE:
  155. return HANDLER_WRITE;
  156. case BSOCKET_ACCEPT:
  157. return HANDLER_ACCEPT;
  158. case BSOCKET_CONNECT:
  159. return HANDLER_CONNECT;
  160. default:
  161. ASSERT(0)
  162. return 42;
  163. }
  164. }
  165. static void call_handlers (BSocket *bs, int returned_events)
  166. {
  167. // reset recv number
  168. bs->recv_num = 0;
  169. if (bs->global_handler) {
  170. bs->global_handler(bs->global_handler_user, returned_events);
  171. return;
  172. }
  173. if (returned_events&BSOCKET_READ) {
  174. ASSERT(bs->handlers[HANDLER_READ])
  175. DEAD_ENTER(bs->dead)
  176. bs->handlers[HANDLER_READ](bs->handlers_user[HANDLER_READ], BSOCKET_READ);
  177. if (DEAD_LEAVE(bs->dead)) {
  178. return;
  179. }
  180. }
  181. if (returned_events&BSOCKET_WRITE) {
  182. ASSERT(bs->handlers[HANDLER_WRITE])
  183. DEAD_ENTER(bs->dead)
  184. bs->handlers[HANDLER_WRITE](bs->handlers_user[HANDLER_WRITE], BSOCKET_WRITE);
  185. if (DEAD_LEAVE(bs->dead)) {
  186. return;
  187. }
  188. }
  189. if (returned_events&BSOCKET_ACCEPT) {
  190. ASSERT(bs->handlers[HANDLER_ACCEPT])
  191. DEAD_ENTER(bs->dead)
  192. bs->handlers[HANDLER_ACCEPT](bs->handlers_user[HANDLER_ACCEPT], BSOCKET_ACCEPT);
  193. if (DEAD_LEAVE(bs->dead)) {
  194. return;
  195. }
  196. }
  197. if (returned_events&BSOCKET_CONNECT) {
  198. ASSERT(bs->handlers[HANDLER_CONNECT])
  199. DEAD_ENTER(bs->dead)
  200. bs->handlers[HANDLER_CONNECT](bs->handlers_user[HANDLER_CONNECT], BSOCKET_CONNECT);
  201. if (DEAD_LEAVE(bs->dead)) {
  202. return;
  203. }
  204. }
  205. }
  206. #ifdef BADVPN_USE_WINAPI
  207. static long get_wsa_events (int sock_events)
  208. {
  209. long res = 0;
  210. if ((sock_events&BSOCKET_READ)) {
  211. res |= FD_READ | FD_CLOSE;
  212. }
  213. if ((sock_events&BSOCKET_WRITE)) {
  214. res |= FD_WRITE | FD_CLOSE;
  215. }
  216. if ((sock_events&BSOCKET_ACCEPT)) {
  217. res |= FD_ACCEPT;
  218. }
  219. if ((sock_events&BSOCKET_CONNECT)) {
  220. res |= FD_CONNECT;
  221. }
  222. return res;
  223. }
  224. static void handle_handler (BSocket *bs)
  225. {
  226. // enumerate network events and reset event
  227. WSANETWORKEVENTS events;
  228. int res = WSAEnumNetworkEvents(bs->socket, bs->event, &events);
  229. ASSERT_FORCE(res == 0)
  230. int returned_events = 0;
  231. if (bs->waitEvents&BSOCKET_READ) {
  232. if ((events.lNetworkEvents&FD_READ) || (events.lNetworkEvents&FD_CLOSE)) {
  233. returned_events |= BSOCKET_READ;
  234. }
  235. }
  236. if (bs->waitEvents&BSOCKET_WRITE) {
  237. if ((events.lNetworkEvents&FD_WRITE) || (events.lNetworkEvents&FD_CLOSE)) {
  238. returned_events |= BSOCKET_WRITE;
  239. }
  240. }
  241. if (bs->waitEvents&BSOCKET_ACCEPT) {
  242. if (events.lNetworkEvents&FD_ACCEPT) {
  243. returned_events |= BSOCKET_ACCEPT;
  244. }
  245. }
  246. if (bs->waitEvents&BSOCKET_CONNECT) {
  247. if (events.lNetworkEvents&FD_CONNECT) {
  248. // read connection attempt result
  249. ASSERT(bs->connecting_status == 1)
  250. bs->connecting_status = 2;
  251. switch (events.iErrorCode[FD_CONNECT_BIT]) {
  252. case 0:
  253. bs->connecting_result = BSOCKET_ERROR_NONE;
  254. break;
  255. case WSAETIMEDOUT:
  256. bs->connecting_result = BSOCKET_ERROR_CONNECTION_TIMED_OUT;
  257. break;
  258. case WSAECONNREFUSED:
  259. bs->connecting_result = BSOCKET_ERROR_CONNECTION_REFUSED;
  260. break;
  261. default:
  262. bs->connecting_result = BSOCKET_ERROR_UNKNOWN;
  263. }
  264. returned_events |= BSOCKET_CONNECT;
  265. }
  266. }
  267. call_handlers(bs, returned_events);
  268. }
  269. #else
  270. static int get_reactor_fd_events (int sock_events)
  271. {
  272. int res = 0;
  273. if ((sock_events&BSOCKET_READ) || (sock_events&BSOCKET_ACCEPT)) {
  274. res |= BREACTOR_READ;
  275. }
  276. if ((sock_events&BSOCKET_WRITE) || (sock_events&BSOCKET_CONNECT)) {
  277. res |= BREACTOR_WRITE;
  278. }
  279. return res;
  280. }
  281. static void file_descriptor_handler (BSocket *bs, int events)
  282. {
  283. int returned_events = 0;
  284. if ((bs->waitEvents&BSOCKET_READ) && (events&BREACTOR_READ)) {
  285. returned_events |= BSOCKET_READ;
  286. }
  287. if ((bs->waitEvents&BSOCKET_WRITE) && (events&BREACTOR_WRITE)) {
  288. returned_events |= BSOCKET_WRITE;
  289. }
  290. if ((bs->waitEvents&BSOCKET_ACCEPT) && (events&BREACTOR_READ)) {
  291. returned_events |= BSOCKET_ACCEPT;
  292. }
  293. if ((bs->waitEvents&BSOCKET_CONNECT) && (events&BREACTOR_WRITE)) {
  294. returned_events |= BSOCKET_CONNECT;
  295. // read connection attempt result
  296. ASSERT(bs->connecting_status == 1)
  297. bs->connecting_status = 2;
  298. int result;
  299. socklen_t result_len = sizeof(result);
  300. int res = getsockopt(bs->socket, SOL_SOCKET, SO_ERROR, &result, &result_len);
  301. ASSERT_FORCE(res == 0)
  302. switch (result) {
  303. case 0:
  304. bs->connecting_result = BSOCKET_ERROR_NONE;
  305. break;
  306. case ETIMEDOUT:
  307. bs->connecting_result = BSOCKET_ERROR_CONNECTION_TIMED_OUT;
  308. break;
  309. case ECONNREFUSED:
  310. bs->connecting_result = BSOCKET_ERROR_CONNECTION_REFUSED;
  311. break;
  312. default:
  313. bs->connecting_result = BSOCKET_ERROR_UNKNOWN;
  314. }
  315. }
  316. call_handlers(bs, returned_events);
  317. }
  318. #endif
  319. static int init_event_backend (BSocket *bs)
  320. {
  321. #ifdef BADVPN_USE_WINAPI
  322. if ((bs->event = WSACreateEvent()) == WSA_INVALID_EVENT) {
  323. return 0;
  324. }
  325. BHandle_Init(&bs->bhandle, bs->event, (BHandle_handler)handle_handler, bs);
  326. if (!BReactor_AddHandle(bs->bsys, &bs->bhandle)) {
  327. ASSERT_FORCE(WSACloseEvent(bs->event))
  328. return 0;
  329. }
  330. BReactor_EnableHandle(bs->bsys, &bs->bhandle);
  331. #else
  332. BFileDescriptor_Init(&bs->fd, bs->socket, (BFileDescriptor_handler)file_descriptor_handler, bs);
  333. if (!BReactor_AddFileDescriptor(bs->bsys, &bs->fd)) {
  334. return 0;
  335. }
  336. #endif
  337. return 1;
  338. }
  339. static void free_event_backend (BSocket *bs)
  340. {
  341. #ifdef BADVPN_USE_WINAPI
  342. BReactor_RemoveHandle(bs->bsys, &bs->bhandle);
  343. ASSERT_FORCE(WSACloseEvent(bs->event))
  344. #else
  345. BReactor_RemoveFileDescriptor(bs->bsys, &bs->fd);
  346. #endif
  347. }
  348. static void update_event_backend (BSocket *bs)
  349. {
  350. #ifdef BADVPN_USE_WINAPI
  351. ASSERT_FORCE(WSAEventSelect(bs->socket, bs->event, get_wsa_events(bs->waitEvents)) == 0)
  352. #else
  353. BReactor_SetFileDescriptorEvents(bs->bsys, &bs->fd, get_reactor_fd_events(bs->waitEvents));
  354. #endif
  355. }
  356. static int limit_recv (BSocket *bs)
  357. {
  358. if (bs->recv_max > 0) {
  359. if (bs->recv_num >= bs->recv_max) {
  360. return 1;
  361. }
  362. bs->recv_num++;
  363. }
  364. return 0;
  365. }
  366. int BSocket_GlobalInit (void)
  367. {
  368. #ifdef BADVPN_USE_WINAPI
  369. WORD requested = MAKEWORD(2, 2);
  370. WSADATA wsadata;
  371. if (WSAStartup(requested, &wsadata) != 0) {
  372. goto fail0;
  373. }
  374. if (wsadata.wVersion != requested) {
  375. goto fail1;
  376. }
  377. return 0;
  378. fail1:
  379. WSACleanup();
  380. fail0:
  381. return -1;
  382. #else
  383. return 0;
  384. #endif
  385. }
  386. int BSocket_Init (BSocket *bs, BReactor *bsys, int domain, int type)
  387. {
  388. // translate domain
  389. int sys_domain;
  390. switch (domain) {
  391. case BADDR_TYPE_IPV4:
  392. sys_domain = AF_INET;
  393. break;
  394. case BADDR_TYPE_IPV6:
  395. sys_domain = AF_INET6;
  396. break;
  397. default:
  398. ASSERT(0)
  399. return -1;
  400. }
  401. // translate type
  402. int sys_type;
  403. switch (type) {
  404. case BSOCKET_TYPE_STREAM:
  405. sys_type = SOCK_STREAM;
  406. break;
  407. case BSOCKET_TYPE_DGRAM:
  408. sys_type = SOCK_DGRAM;
  409. break;
  410. default:
  411. ASSERT(0)
  412. return -1;
  413. }
  414. // create socket
  415. int fd = socket(sys_domain, sys_type, 0);
  416. if (fd < 0) {
  417. DEBUG("socket() failed");
  418. goto fail0;
  419. }
  420. // set socket nonblocking
  421. if (set_nonblocking(fd) != 0) {
  422. DEBUG("set_nonblocking failed");
  423. goto fail1;
  424. }
  425. // set pktinfo option
  426. int have_pktinfo = 0;
  427. if (type == BSOCKET_TYPE_DGRAM) {
  428. switch (domain) {
  429. case BADDR_TYPE_IPV4:
  430. have_pktinfo = (set_pktinfo(fd) == 0);
  431. break;
  432. case BADDR_TYPE_IPV6:
  433. have_pktinfo = (set_pktinfo6(fd) == 0);
  434. break;
  435. }
  436. if (!have_pktinfo) {
  437. DEBUG("WARNING: no pktinfo");
  438. }
  439. }
  440. // initialize variables
  441. DEAD_INIT(bs->dead);
  442. bs->bsys = bsys;
  443. bs->type = type;
  444. bs->socket = fd;
  445. bs->have_pktinfo = have_pktinfo;
  446. bs->error = BSOCKET_ERROR_NONE;
  447. init_handlers(bs);
  448. bs->waitEvents = 0;
  449. bs->connecting_status = 0;
  450. bs->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  451. bs->recv_num = 0;
  452. // initialize event backend
  453. if (!init_event_backend(bs)) {
  454. DEBUG("WARNING: init_event_backend failed");
  455. goto fail1;
  456. }
  457. // init debug object
  458. DebugObject_Init(&bs->d_obj);
  459. return 0;
  460. fail1:
  461. close_socket(fd);
  462. fail0:
  463. return -1;
  464. }
  465. void BSocket_Free (BSocket *bs)
  466. {
  467. // free debug object
  468. DebugObject_Free(&bs->d_obj);
  469. // free event backend
  470. free_event_backend(bs);
  471. // close socket
  472. close_socket(bs->socket);
  473. // if we're being called indirectly from a socket event handler,
  474. // allow the function invoking the handler to know that the socket was freed
  475. DEAD_KILL(bs->dead);
  476. }
  477. void BSocket_SetRecvMax (BSocket *bs, int max)
  478. {
  479. ASSERT(max > 0 || max == -1)
  480. bs->recv_max = max;
  481. bs->recv_num = 0;
  482. }
  483. int BSocket_GetError (BSocket *bs)
  484. {
  485. return bs->error;
  486. }
  487. void BSocket_AddGlobalEventHandler (BSocket *bs, BSocket_handler handler, void *user)
  488. {
  489. ASSERT(handler)
  490. ASSERT(!bs->global_handler)
  491. ASSERT(!bs->handlers[0])
  492. ASSERT(!bs->handlers[1])
  493. ASSERT(!bs->handlers[2])
  494. ASSERT(!bs->handlers[3])
  495. bs->global_handler = handler;
  496. bs->global_handler_user = user;
  497. }
  498. void BSocket_RemoveGlobalEventHandler (BSocket *bs)
  499. {
  500. ASSERT(bs->global_handler)
  501. bs->global_handler = NULL;
  502. bs->waitEvents = 0;
  503. }
  504. void BSocket_SetGlobalEvents (BSocket *bs, int events)
  505. {
  506. ASSERT(bs->global_handler)
  507. // update events
  508. bs->waitEvents = events;
  509. // give new events to event backend
  510. update_event_backend(bs);
  511. }
  512. void BSocket_AddEventHandler (BSocket *bs, uint8_t event, BSocket_handler handler, void *user)
  513. {
  514. ASSERT(handler)
  515. ASSERT(!bs->global_handler)
  516. // get index
  517. int i = get_event_index(event);
  518. // event must not have handler
  519. ASSERT(!bs->handlers[i])
  520. // change handler
  521. bs->handlers[i] = handler;
  522. bs->handlers_user[i] = user;
  523. }
  524. void BSocket_RemoveEventHandler (BSocket *bs, uint8_t event)
  525. {
  526. // get table index
  527. int i = get_event_index(event);
  528. // event must have handler
  529. ASSERT(bs->handlers[i])
  530. // disable event if enabled
  531. if (bs->waitEvents&event) {
  532. BSocket_DisableEvent(bs, event);
  533. }
  534. // change handler
  535. bs->handlers[i] = NULL;
  536. }
  537. void BSocket_EnableEvent (BSocket *bs, uint8_t event)
  538. {
  539. #ifndef NDEBUG
  540. // check event and incompatible events
  541. switch (event) {
  542. case BSOCKET_READ:
  543. case BSOCKET_WRITE:
  544. ASSERT(!(bs->waitEvents&BSOCKET_ACCEPT))
  545. ASSERT(!(bs->waitEvents&BSOCKET_CONNECT))
  546. break;
  547. case BSOCKET_ACCEPT:
  548. ASSERT(!(bs->waitEvents&BSOCKET_READ))
  549. ASSERT(!(bs->waitEvents&BSOCKET_WRITE))
  550. ASSERT(!(bs->waitEvents&BSOCKET_CONNECT))
  551. break;
  552. case BSOCKET_CONNECT:
  553. ASSERT(!(bs->waitEvents&BSOCKET_READ))
  554. ASSERT(!(bs->waitEvents&BSOCKET_WRITE))
  555. ASSERT(!(bs->waitEvents&BSOCKET_ACCEPT))
  556. break;
  557. default:
  558. ASSERT(0)
  559. break;
  560. }
  561. #endif
  562. // event must have handler
  563. ASSERT(bs->handlers[get_event_index(event)])
  564. // event must not be enabled
  565. ASSERT(!(bs->waitEvents&event))
  566. // update events
  567. bs->waitEvents |= event;
  568. // give new events to event backend
  569. update_event_backend(bs);
  570. }
  571. void BSocket_DisableEvent (BSocket *bs, uint8_t event)
  572. {
  573. // check event and get index
  574. int index = get_event_index(event);
  575. // event must have handler
  576. ASSERT(bs->handlers[index])
  577. // event must be enabled
  578. ASSERT(bs->waitEvents&event)
  579. // update events
  580. bs->waitEvents &= ~event;
  581. // give new events to event backend
  582. update_event_backend(bs);
  583. }
  584. int BSocket_Connect (BSocket *bs, BAddr *addr)
  585. {
  586. ASSERT(bs->connecting_status == 0)
  587. struct sys_addr sysaddr;
  588. addr_socket_to_sys(&sysaddr, addr);
  589. if (connect(bs->socket, &sysaddr.addr.generic, sysaddr.len) < 0) {
  590. #ifdef BADVPN_USE_WINAPI
  591. switch (WSAGetLastError()) {
  592. case WSAEWOULDBLOCK:
  593. bs->connecting_status = 1;
  594. bs->error = BSOCKET_ERROR_IN_PROGRESS;
  595. return -1;
  596. }
  597. #else
  598. switch (errno) {
  599. case EINPROGRESS:
  600. bs->connecting_status = 1;
  601. bs->error = BSOCKET_ERROR_IN_PROGRESS;
  602. return -1;
  603. }
  604. #endif
  605. bs->error = BSOCKET_ERROR_UNKNOWN;
  606. return -1;
  607. }
  608. bs->error = BSOCKET_ERROR_NONE;
  609. return 0;
  610. }
  611. int BSocket_GetConnectResult (BSocket *bs)
  612. {
  613. ASSERT(bs->connecting_status == 2)
  614. bs->connecting_status = 0;
  615. return bs->connecting_result;
  616. }
  617. int BSocket_Bind (BSocket *bs, BAddr *addr)
  618. {
  619. struct sys_addr sysaddr;
  620. addr_socket_to_sys(&sysaddr, addr);
  621. if (bs->type == BSOCKET_TYPE_STREAM) {
  622. #ifdef BADVPN_USE_WINAPI
  623. BOOL optval = TRUE;
  624. #else
  625. int optval = 1;
  626. #endif
  627. if (setsockopt(bs->socket, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(optval)) < 0) {
  628. DEBUG("WARNING: setsockopt failed");
  629. }
  630. }
  631. if (bind(bs->socket, &sysaddr.addr.generic, sysaddr.len) < 0) {
  632. #ifdef BADVPN_USE_WINAPI
  633. switch (WSAGetLastError()) {
  634. case WSAEADDRNOTAVAIL:
  635. bs->error = BSOCKET_ERROR_ADDRESS_NOT_AVAILABLE;
  636. return -1;
  637. case WSAEADDRINUSE:
  638. bs->error = BSOCKET_ERROR_ADDRESS_IN_USE;
  639. return -1;
  640. }
  641. #else
  642. switch (errno) {
  643. case EADDRNOTAVAIL:
  644. bs->error = BSOCKET_ERROR_ADDRESS_NOT_AVAILABLE;
  645. return -1;
  646. case EADDRINUSE:
  647. bs->error = BSOCKET_ERROR_ADDRESS_IN_USE;
  648. return -1;
  649. case EACCES:
  650. bs->error = BSOCKET_ERROR_ACCESS_DENIED;
  651. return -1;
  652. }
  653. #endif
  654. bs->error = BSOCKET_ERROR_UNKNOWN;
  655. return -1;
  656. }
  657. bs->error = BSOCKET_ERROR_NONE;
  658. return 0;
  659. }
  660. int BSocket_Listen (BSocket *bs, int backlog)
  661. {
  662. if (backlog < 0) {
  663. backlog = BSOCKET_DEFAULT_BACKLOG;
  664. }
  665. if (listen(bs->socket, backlog) < 0) {
  666. #ifdef BADVPN_USE_WINAPI
  667. switch (WSAGetLastError()) {
  668. case WSAEADDRINUSE:
  669. bs->error = BSOCKET_ERROR_ADDRESS_IN_USE;
  670. return -1;
  671. }
  672. #else
  673. switch (errno) {
  674. case EADDRINUSE:
  675. bs->error = BSOCKET_ERROR_ADDRESS_IN_USE;
  676. return -1;
  677. }
  678. #endif
  679. bs->error = BSOCKET_ERROR_UNKNOWN;
  680. return -1;
  681. }
  682. bs->error = BSOCKET_ERROR_NONE;
  683. return 0;
  684. }
  685. int BSocket_Accept (BSocket *bs, BSocket *newsock, BAddr *addr)
  686. {
  687. struct sys_addr sysaddr;
  688. sysaddr.len = sizeof(sysaddr.addr);
  689. int fd = accept(bs->socket, &sysaddr.addr.generic, &sysaddr.len);
  690. if (fd < 0) {
  691. #ifdef BADVPN_USE_WINAPI
  692. switch (WSAGetLastError()) {
  693. case WSAEWOULDBLOCK:
  694. bs->error = BSOCKET_ERROR_LATER;
  695. return -1;
  696. }
  697. #else
  698. switch (errno) {
  699. case EAGAIN:
  700. #if EAGAIN != EWOULDBLOCK
  701. case EWOULDBLOCK:
  702. #endif
  703. bs->error = BSOCKET_ERROR_LATER;
  704. return -1;
  705. }
  706. #endif
  707. bs->error = BSOCKET_ERROR_UNKNOWN;
  708. return -1;
  709. }
  710. if (!newsock) {
  711. close_socket(fd);
  712. } else {
  713. // set nonblocking
  714. if (set_nonblocking(fd) != 0) {
  715. DEBUG("WARNING: set_nonblocking failed");
  716. goto fail0;
  717. }
  718. DEAD_INIT(newsock->dead);
  719. newsock->bsys = bs->bsys;
  720. newsock->type = bs->type;
  721. newsock->socket = fd;
  722. newsock->have_pktinfo = 0;
  723. newsock->error = BSOCKET_ERROR_NONE;
  724. init_handlers(newsock);
  725. newsock->waitEvents = 0;
  726. newsock->connecting_status = 0;
  727. newsock->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  728. newsock->recv_num = 0;
  729. if (!init_event_backend(newsock)) {
  730. DEBUG("WARNING: init_event_backend failed");
  731. goto fail0;
  732. }
  733. // init debug object
  734. DebugObject_Init(&newsock->d_obj);
  735. }
  736. // return client addres
  737. if (addr) {
  738. addr_sys_to_socket(addr, &sysaddr);
  739. }
  740. bs->error = BSOCKET_ERROR_NONE;
  741. return 0;
  742. fail0:
  743. close_socket(fd);
  744. bs->error = BSOCKET_ERROR_UNKNOWN;
  745. return -1;
  746. }
  747. int BSocket_Send (BSocket *bs, uint8_t *data, int len)
  748. {
  749. ASSERT(len >= 0)
  750. #ifdef BADVPN_USE_WINAPI
  751. int flags = 0;
  752. #else
  753. int flags = MSG_NOSIGNAL;
  754. #endif
  755. int bytes = send(bs->socket, data, len, flags);
  756. if (bytes < 0) {
  757. #ifdef BADVPN_USE_WINAPI
  758. switch (WSAGetLastError()) {
  759. case WSAEWOULDBLOCK:
  760. bs->error = BSOCKET_ERROR_LATER;
  761. return -1;
  762. case WSAECONNRESET:
  763. if (bs->type == BSOCKET_TYPE_DGRAM) {
  764. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  765. } else {
  766. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  767. }
  768. return -1;
  769. }
  770. #else
  771. switch (errno) {
  772. case EAGAIN:
  773. #if EAGAIN != EWOULDBLOCK
  774. case EWOULDBLOCK:
  775. #endif
  776. bs->error = BSOCKET_ERROR_LATER;
  777. return -1;
  778. case ECONNREFUSED:
  779. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  780. return -1;
  781. case ECONNRESET:
  782. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  783. return -1;
  784. }
  785. #endif
  786. bs->error = BSOCKET_ERROR_UNKNOWN;
  787. return -1;
  788. }
  789. bs->error = BSOCKET_ERROR_NONE;
  790. return bytes;
  791. }
  792. int BSocket_Recv (BSocket *bs, uint8_t *data, int len)
  793. {
  794. ASSERT(len >= 0)
  795. if (limit_recv(bs)) {
  796. bs->error = BSOCKET_ERROR_LATER;
  797. return -1;
  798. }
  799. int bytes = recv(bs->socket, data, len, 0);
  800. if (bytes < 0) {
  801. #ifdef BADVPN_USE_WINAPI
  802. switch (WSAGetLastError()) {
  803. case WSAEWOULDBLOCK:
  804. bs->error = BSOCKET_ERROR_LATER;
  805. return -1;
  806. case WSAECONNRESET:
  807. if (bs->type == BSOCKET_TYPE_DGRAM) {
  808. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  809. } else {
  810. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  811. }
  812. return -1;
  813. }
  814. #else
  815. switch (errno) {
  816. case EAGAIN:
  817. #if EAGAIN != EWOULDBLOCK
  818. case EWOULDBLOCK:
  819. #endif
  820. bs->error = BSOCKET_ERROR_LATER;
  821. return -1;
  822. case ECONNREFUSED:
  823. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  824. return -1;
  825. case ECONNRESET:
  826. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  827. return -1;
  828. }
  829. #endif
  830. bs->error = BSOCKET_ERROR_UNKNOWN;
  831. return -1;
  832. }
  833. bs->error = BSOCKET_ERROR_NONE;
  834. return bytes;
  835. }
  836. int BSocket_SendTo (BSocket *bs, uint8_t *data, int len, BAddr *addr)
  837. {
  838. ASSERT(len >= 0)
  839. ASSERT(addr)
  840. struct sys_addr remote_sysaddr;
  841. addr_socket_to_sys(&remote_sysaddr, addr);
  842. #ifdef BADVPN_USE_WINAPI
  843. int flags = 0;
  844. #else
  845. int flags = MSG_NOSIGNAL;
  846. #endif
  847. int bytes = sendto(bs->socket, data, len, flags, &remote_sysaddr.addr.generic, remote_sysaddr.len);
  848. if (bytes < 0) {
  849. #ifdef BADVPN_USE_WINAPI
  850. switch (WSAGetLastError()) {
  851. case WSAEWOULDBLOCK:
  852. bs->error = BSOCKET_ERROR_LATER;
  853. return -1;
  854. case WSAECONNRESET:
  855. if (bs->type == BSOCKET_TYPE_DGRAM) {
  856. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  857. } else {
  858. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  859. }
  860. return -1;
  861. }
  862. #else
  863. switch (errno) {
  864. case EAGAIN:
  865. #if EAGAIN != EWOULDBLOCK
  866. case EWOULDBLOCK:
  867. #endif
  868. bs->error = BSOCKET_ERROR_LATER;
  869. return -1;
  870. case ECONNREFUSED:
  871. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  872. return -1;
  873. case ECONNRESET:
  874. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  875. return -1;
  876. }
  877. #endif
  878. bs->error = BSOCKET_ERROR_UNKNOWN;
  879. return -1;
  880. }
  881. bs->error = BSOCKET_ERROR_NONE;
  882. return bytes;
  883. }
  884. int BSocket_RecvFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr)
  885. {
  886. ASSERT(len >= 0)
  887. ASSERT(addr)
  888. if (limit_recv(bs)) {
  889. bs->error = BSOCKET_ERROR_LATER;
  890. return -1;
  891. }
  892. struct sys_addr remote_sysaddr;
  893. remote_sysaddr.len = sizeof(remote_sysaddr.addr);
  894. int bytes = recvfrom(bs->socket, data, len, 0, &remote_sysaddr.addr.generic, &remote_sysaddr.len);
  895. if (bytes < 0) {
  896. #ifdef BADVPN_USE_WINAPI
  897. switch (WSAGetLastError()) {
  898. case WSAEWOULDBLOCK:
  899. bs->error = BSOCKET_ERROR_LATER;
  900. return -1;
  901. case WSAECONNRESET:
  902. if (bs->type == BSOCKET_TYPE_DGRAM) {
  903. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  904. } else {
  905. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  906. }
  907. return -1;
  908. }
  909. #else
  910. switch (errno) {
  911. case EAGAIN:
  912. #if EAGAIN != EWOULDBLOCK
  913. case EWOULDBLOCK:
  914. #endif
  915. bs->error = BSOCKET_ERROR_LATER;
  916. return -1;
  917. case ECONNREFUSED:
  918. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  919. return -1;
  920. case ECONNRESET:
  921. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  922. return -1;
  923. }
  924. #endif
  925. bs->error = BSOCKET_ERROR_UNKNOWN;
  926. return -1;
  927. }
  928. addr_sys_to_socket(addr, &remote_sysaddr);
  929. bs->error = BSOCKET_ERROR_NONE;
  930. return bytes;
  931. }
  932. int BSocket_SendToFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  933. {
  934. ASSERT(len >= 0)
  935. ASSERT(addr)
  936. ASSERT(local_addr)
  937. if (!bs->have_pktinfo) {
  938. return BSocket_SendTo(bs, data, len, addr);
  939. }
  940. #ifdef BADVPN_USE_WINAPI
  941. // obtain WSASendMsg
  942. GUID guid = WSAID_WSASENDMSG;
  943. LPFN_WSASENDMSG WSASendMsg;
  944. DWORD out_bytes;
  945. if (WSAIoctl(bs->socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &WSASendMsg, sizeof(WSASendMsg), &out_bytes, NULL, NULL) != 0) {
  946. return BSocket_SendTo(bs, data, len, addr);
  947. }
  948. #endif
  949. struct sys_addr remote_sysaddr;
  950. addr_socket_to_sys(&remote_sysaddr, addr);
  951. #ifdef BADVPN_USE_WINAPI
  952. WSABUF buf;
  953. buf.len = len;
  954. buf.buf = data;
  955. union {
  956. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  957. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  958. } cdata;
  959. WSAMSG msg;
  960. memset(&msg, 0, sizeof(msg));
  961. msg.name = &remote_sysaddr.addr.generic;
  962. msg.namelen = remote_sysaddr.len;
  963. msg.lpBuffers = &buf;
  964. msg.dwBufferCount = 1;
  965. msg.Control.buf = (char *)&cdata;
  966. msg.Control.len = sizeof(cdata);
  967. int sum = 0;
  968. WSACMSGHDR *cmsg = WSA_CMSG_FIRSTHDR(&msg);
  969. switch (local_addr->type) {
  970. case BADDR_TYPE_NONE:
  971. break;
  972. case BADDR_TYPE_IPV4: {
  973. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in_pktinfo)));
  974. cmsg->cmsg_level = IPPROTO_IP;
  975. cmsg->cmsg_type = IP_PKTINFO;
  976. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in_pktinfo));
  977. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  978. pktinfo->ipi_addr.s_addr = local_addr->ipv4;
  979. sum += WSA_CMSG_SPACE(sizeof(struct in_pktinfo));
  980. } break;
  981. case BADDR_TYPE_IPV6: {
  982. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in6_pktinfo)));
  983. cmsg->cmsg_level = IPPROTO_IPV6;
  984. cmsg->cmsg_type = IPV6_PKTINFO;
  985. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in6_pktinfo));
  986. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  987. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  988. sum += WSA_CMSG_SPACE(sizeof(struct in6_pktinfo));
  989. } break;
  990. default:
  991. ASSERT(0);
  992. }
  993. msg.Control.len = sum;
  994. DWORD bytes;
  995. if (WSASendMsg(bs->socket, &msg, 0, &bytes, NULL, NULL) != 0) {
  996. switch (WSAGetLastError()) {
  997. case WSAEWOULDBLOCK:
  998. bs->error = BSOCKET_ERROR_LATER;
  999. return -1;
  1000. case WSAECONNRESET:
  1001. if (bs->type == BSOCKET_TYPE_DGRAM) {
  1002. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  1003. } else {
  1004. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  1005. }
  1006. return -1;
  1007. default:
  1008. bs->error = BSOCKET_ERROR_UNKNOWN;
  1009. return -1;
  1010. }
  1011. }
  1012. #else
  1013. struct iovec iov;
  1014. iov.iov_base = data;
  1015. iov.iov_len = len;
  1016. union {
  1017. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  1018. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1019. } cdata;
  1020. struct msghdr msg;
  1021. memset(&msg, 0, sizeof(msg));
  1022. msg.msg_name = &remote_sysaddr.addr.generic;
  1023. msg.msg_namelen = remote_sysaddr.len;
  1024. msg.msg_iov = &iov;
  1025. msg.msg_iovlen = 1;
  1026. msg.msg_control = &cdata;
  1027. msg.msg_controllen = sizeof(cdata);
  1028. int sum = 0;
  1029. struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
  1030. switch (local_addr->type) {
  1031. case BADDR_TYPE_NONE:
  1032. break;
  1033. case BADDR_TYPE_IPV4: {
  1034. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_pktinfo)));
  1035. cmsg->cmsg_level = IPPROTO_IP;
  1036. cmsg->cmsg_type = IP_PKTINFO;
  1037. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
  1038. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  1039. pktinfo->ipi_spec_dst.s_addr = local_addr->ipv4;
  1040. sum += CMSG_SPACE(sizeof(struct in_pktinfo));
  1041. } break;
  1042. case BADDR_TYPE_IPV6: {
  1043. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in6_pktinfo)));
  1044. cmsg->cmsg_level = IPPROTO_IPV6;
  1045. cmsg->cmsg_type = IPV6_PKTINFO;
  1046. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
  1047. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  1048. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  1049. sum += CMSG_SPACE(sizeof(struct in6_pktinfo));
  1050. } break;
  1051. default:
  1052. ASSERT(0);
  1053. }
  1054. msg.msg_controllen = sum;
  1055. int bytes = sendmsg(bs->socket, &msg, MSG_NOSIGNAL);
  1056. if (bytes < 0) {
  1057. switch (errno) {
  1058. case EAGAIN:
  1059. #if EAGAIN != EWOULDBLOCK
  1060. case EWOULDBLOCK:
  1061. #endif
  1062. bs->error = BSOCKET_ERROR_LATER;
  1063. return -1;
  1064. case ECONNREFUSED:
  1065. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  1066. return -1;
  1067. case ECONNRESET:
  1068. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  1069. return -1;
  1070. default:
  1071. bs->error = BSOCKET_ERROR_UNKNOWN;
  1072. return -1;
  1073. }
  1074. }
  1075. #endif
  1076. bs->error = BSOCKET_ERROR_NONE;
  1077. return bytes;
  1078. }
  1079. static int recvfromto_fallback (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  1080. {
  1081. int res = BSocket_RecvFrom(bs, data, len, addr);
  1082. if (res >= 0) {
  1083. BIPAddr_InitInvalid(local_addr);
  1084. }
  1085. return res;
  1086. }
  1087. int BSocket_RecvFromTo (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  1088. {
  1089. ASSERT(len >= 0)
  1090. ASSERT(addr)
  1091. ASSERT(local_addr)
  1092. if (!bs->have_pktinfo) {
  1093. return recvfromto_fallback(bs, data, len, addr, local_addr);
  1094. }
  1095. #ifdef BADVPN_USE_WINAPI
  1096. // obtain WSARecvMsg
  1097. GUID guid = WSAID_WSARECVMSG;
  1098. LPFN_WSARECVMSG WSARecvMsg;
  1099. DWORD out_bytes;
  1100. if (WSAIoctl(bs->socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &WSARecvMsg, sizeof(WSARecvMsg), &out_bytes, NULL, NULL) != 0) {
  1101. return recvfromto_fallback(bs, data, len, addr, local_addr);
  1102. }
  1103. #endif
  1104. if (limit_recv(bs)) {
  1105. bs->error = BSOCKET_ERROR_LATER;
  1106. return -1;
  1107. }
  1108. struct sys_addr remote_sysaddr;
  1109. remote_sysaddr.len = sizeof(remote_sysaddr.addr);
  1110. #ifdef BADVPN_USE_WINAPI
  1111. WSABUF buf;
  1112. buf.len = len;
  1113. buf.buf = data;
  1114. union {
  1115. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  1116. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1117. } cdata;
  1118. WSAMSG msg;
  1119. memset(&msg, 0, sizeof(msg));
  1120. msg.name = &remote_sysaddr.addr.generic;
  1121. msg.namelen = remote_sysaddr.len;
  1122. msg.lpBuffers = &buf;
  1123. msg.dwBufferCount = 1;
  1124. msg.Control.buf = (char *)&cdata;
  1125. msg.Control.len = sizeof(cdata);
  1126. DWORD bytes;
  1127. if (WSARecvMsg(bs->socket, &msg, &bytes, NULL, NULL) != 0) {
  1128. switch (WSAGetLastError()) {
  1129. case WSAEWOULDBLOCK:
  1130. bs->error = BSOCKET_ERROR_LATER;
  1131. return -1;
  1132. case WSAECONNRESET:
  1133. if (bs->type == BSOCKET_TYPE_DGRAM) {
  1134. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  1135. } else {
  1136. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  1137. }
  1138. return -1;
  1139. default:
  1140. bs->error = BSOCKET_ERROR_UNKNOWN;
  1141. return -1;
  1142. }
  1143. }
  1144. remote_sysaddr.len = msg.namelen;
  1145. #else
  1146. struct iovec iov;
  1147. iov.iov_base = data;
  1148. iov.iov_len = len;
  1149. union {
  1150. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  1151. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1152. } cdata;
  1153. struct msghdr msg;
  1154. memset(&msg, 0, sizeof(msg));
  1155. msg.msg_name = &remote_sysaddr.addr.generic;
  1156. msg.msg_namelen = remote_sysaddr.len;
  1157. msg.msg_iov = &iov;
  1158. msg.msg_iovlen = 1;
  1159. msg.msg_control = &cdata;
  1160. msg.msg_controllen = sizeof(cdata);
  1161. int bytes = recvmsg(bs->socket, &msg, 0);
  1162. if (bytes < 0) {
  1163. switch (errno) {
  1164. case EAGAIN:
  1165. #if EAGAIN != EWOULDBLOCK
  1166. case EWOULDBLOCK:
  1167. #endif
  1168. bs->error = BSOCKET_ERROR_LATER;
  1169. return -1;
  1170. case ECONNREFUSED:
  1171. bs->error = BSOCKET_ERROR_CONNECTION_REFUSED;
  1172. return -1;
  1173. case ECONNRESET:
  1174. bs->error = BSOCKET_ERROR_CONNECTION_RESET;
  1175. return -1;
  1176. default:
  1177. bs->error = BSOCKET_ERROR_UNKNOWN;
  1178. return -1;
  1179. }
  1180. }
  1181. remote_sysaddr.len = msg.msg_namelen;
  1182. #endif
  1183. addr_sys_to_socket(addr, &remote_sysaddr);
  1184. BIPAddr_InitInvalid(local_addr);
  1185. #ifdef BADVPN_USE_WINAPI
  1186. WSACMSGHDR *cmsg;
  1187. for (cmsg = WSA_CMSG_FIRSTHDR(&msg); cmsg; cmsg = WSA_CMSG_NXTHDR(&msg, cmsg)) {
  1188. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1189. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  1190. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1191. }
  1192. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1193. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  1194. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1195. }
  1196. }
  1197. #else
  1198. struct cmsghdr *cmsg;
  1199. for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
  1200. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1201. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  1202. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1203. }
  1204. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1205. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  1206. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1207. }
  1208. }
  1209. #endif
  1210. bs->error = BSOCKET_ERROR_NONE;
  1211. return bytes;
  1212. }
  1213. int BSocket_GetPeerName (BSocket *bs, BAddr *addr)
  1214. {
  1215. ASSERT(addr)
  1216. struct sys_addr sysaddr;
  1217. sysaddr.len = sizeof(sysaddr.addr);
  1218. if (getpeername(bs->socket, &sysaddr.addr.generic, &sysaddr.len) < 0) {
  1219. bs->error = BSOCKET_ERROR_UNKNOWN;
  1220. return -1;
  1221. }
  1222. addr_sys_to_socket(addr, &sysaddr);
  1223. bs->error = BSOCKET_ERROR_NONE;
  1224. return 0;
  1225. }