BSocket.c 37 KB

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