BSocket.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  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) == 0) {
  405. return 0;
  406. }
  407. break;
  408. case BADDR_TYPE_IPV6:
  409. if (set_pktinfo6(socket) == 0) {
  410. return 0;
  411. }
  412. break;
  413. }
  414. }
  415. return 1;
  416. }
  417. static int setup_winsock_exts (int socket, BSocket *bs)
  418. {
  419. #ifdef BADVPN_USE_WINAPI
  420. DWORD out_bytes;
  421. // obtain WSASendMsg
  422. GUID guid_send = WSAID_WSASENDMSG;
  423. if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_send, sizeof(guid_send), &bs->WSASendMsg, sizeof(bs->WSASendMsg), &out_bytes, NULL, NULL) != 0) {
  424. return 0;
  425. }
  426. // obtain WSARecvMsg
  427. GUID guid_recv = WSAID_WSARECVMSG;
  428. if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_recv, sizeof(guid_recv), &bs->WSARecvMsg, sizeof(bs->WSARecvMsg), &out_bytes, NULL, NULL) != 0) {
  429. return 0;
  430. }
  431. #endif
  432. return 1;
  433. }
  434. int BSocket_GlobalInit (void)
  435. {
  436. #ifdef BADVPN_USE_WINAPI
  437. WORD requested = MAKEWORD(2, 2);
  438. WSADATA wsadata;
  439. if (WSAStartup(requested, &wsadata) != 0) {
  440. goto fail0;
  441. }
  442. if (wsadata.wVersion != requested) {
  443. goto fail1;
  444. }
  445. return 0;
  446. fail1:
  447. WSACleanup();
  448. fail0:
  449. return -1;
  450. #else
  451. return 0;
  452. #endif
  453. }
  454. int BSocket_Init (BSocket *bs, BReactor *bsys, int domain, int type)
  455. {
  456. // translate domain
  457. int sys_domain;
  458. switch (domain) {
  459. case BADDR_TYPE_IPV4:
  460. sys_domain = AF_INET;
  461. break;
  462. case BADDR_TYPE_IPV6:
  463. sys_domain = AF_INET6;
  464. break;
  465. #ifndef BADVPN_USE_WINAPI
  466. case BADDR_TYPE_UNIX:
  467. sys_domain = AF_UNIX;
  468. break;
  469. #endif
  470. default:
  471. ASSERT(0)
  472. return -1;
  473. }
  474. // translate type
  475. int sys_type;
  476. switch (type) {
  477. case BSOCKET_TYPE_STREAM:
  478. sys_type = SOCK_STREAM;
  479. break;
  480. case BSOCKET_TYPE_DGRAM:
  481. sys_type = SOCK_DGRAM;
  482. break;
  483. default:
  484. ASSERT(0)
  485. return -1;
  486. }
  487. // create socket
  488. int fd = socket(sys_domain, sys_type, 0);
  489. if (fd < 0) {
  490. DEBUG("socket() failed");
  491. goto fail0;
  492. }
  493. // set socket nonblocking
  494. if (set_nonblocking(fd) != 0) {
  495. DEBUG("set_nonblocking failed");
  496. goto fail1;
  497. }
  498. // set pktinfo if needed
  499. if (!setup_pktinfo(fd, type, domain)) {
  500. DEBUG("setup_pktinfo failed");
  501. goto fail1;
  502. }
  503. // setup winsock exts
  504. if (!setup_winsock_exts(fd, bs)) {
  505. DEBUG("setup_winsock_exts failed");
  506. goto fail1;
  507. }
  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. if (!setup_winsock_exts(fd, newsock)) {
  773. DEBUG("setup_winsock_exts failed");
  774. goto fail0;
  775. }
  776. DEAD_INIT(newsock->dead);
  777. newsock->bsys = bs->bsys;
  778. newsock->type = bs->type;
  779. newsock->domain = bs->domain;
  780. newsock->socket = fd;
  781. newsock->error = BSOCKET_ERROR_NONE;
  782. init_handlers(newsock);
  783. newsock->waitEvents = 0;
  784. newsock->connecting_status = 0;
  785. newsock->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  786. newsock->recv_num = 0;
  787. if (!init_event_backend(newsock)) {
  788. DEBUG("WARNING: init_event_backend failed");
  789. goto fail0;
  790. }
  791. // init debug object
  792. DebugObject_Init(&newsock->d_obj);
  793. }
  794. // return client address
  795. if (addr) {
  796. addr_sys_to_socket(addr, &sysaddr);
  797. }
  798. bs->error = BSOCKET_ERROR_NONE;
  799. return 0;
  800. fail0:
  801. close_socket(fd);
  802. bs->error = BSOCKET_ERROR_UNKNOWN;
  803. return -1;
  804. }
  805. int BSocket_Send (BSocket *bs, uint8_t *data, int len)
  806. {
  807. ASSERT(len >= 0)
  808. #ifdef BADVPN_USE_WINAPI
  809. int flags = 0;
  810. #else
  811. int flags = MSG_NOSIGNAL;
  812. #endif
  813. int bytes = send(bs->socket, data, len, flags);
  814. if (bytes < 0) {
  815. int error;
  816. #ifdef BADVPN_USE_WINAPI
  817. switch ((error = WSAGetLastError())) {
  818. case WSAEWOULDBLOCK:
  819. bs->error = BSOCKET_ERROR_LATER;
  820. return -1;
  821. }
  822. #else
  823. switch ((error = errno)) {
  824. case EAGAIN:
  825. #if EAGAIN != EWOULDBLOCK
  826. case EWOULDBLOCK:
  827. #endif
  828. bs->error = BSOCKET_ERROR_LATER;
  829. return -1;
  830. }
  831. #endif
  832. bs->error = translate_error(error);
  833. return -1;
  834. }
  835. bs->error = BSOCKET_ERROR_NONE;
  836. return bytes;
  837. }
  838. int BSocket_Recv (BSocket *bs, uint8_t *data, int len)
  839. {
  840. ASSERT(len >= 0)
  841. if (limit_recv(bs)) {
  842. bs->error = BSOCKET_ERROR_LATER;
  843. return -1;
  844. }
  845. int bytes = recv(bs->socket, data, len, 0);
  846. if (bytes < 0) {
  847. int error;
  848. #ifdef BADVPN_USE_WINAPI
  849. switch ((error = WSAGetLastError())) {
  850. case WSAEWOULDBLOCK:
  851. bs->error = BSOCKET_ERROR_LATER;
  852. return -1;
  853. }
  854. #else
  855. switch ((error = errno)) {
  856. case EAGAIN:
  857. #if EAGAIN != EWOULDBLOCK
  858. case EWOULDBLOCK:
  859. #endif
  860. bs->error = BSOCKET_ERROR_LATER;
  861. return -1;
  862. }
  863. #endif
  864. bs->error = translate_error(error);
  865. return -1;
  866. }
  867. bs->error = BSOCKET_ERROR_NONE;
  868. return bytes;
  869. }
  870. int BSocket_SendToFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  871. {
  872. ASSERT(len >= 0)
  873. ASSERT(addr)
  874. ASSERT(!BAddr_IsInvalid(addr))
  875. ASSERT(local_addr)
  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. union {
  883. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  884. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  885. } cdata;
  886. WSAMSG msg;
  887. memset(&msg, 0, sizeof(msg));
  888. msg.name = &remote_sysaddr.addr.generic;
  889. msg.namelen = remote_sysaddr.len;
  890. msg.lpBuffers = &buf;
  891. msg.dwBufferCount = 1;
  892. msg.Control.buf = (char *)&cdata;
  893. msg.Control.len = sizeof(cdata);
  894. int sum = 0;
  895. WSACMSGHDR *cmsg = WSA_CMSG_FIRSTHDR(&msg);
  896. switch (local_addr->type) {
  897. case BADDR_TYPE_NONE:
  898. break;
  899. case BADDR_TYPE_IPV4: {
  900. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in_pktinfo)));
  901. cmsg->cmsg_level = IPPROTO_IP;
  902. cmsg->cmsg_type = IP_PKTINFO;
  903. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in_pktinfo));
  904. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  905. pktinfo->ipi_addr.s_addr = local_addr->ipv4;
  906. sum += WSA_CMSG_SPACE(sizeof(struct in_pktinfo));
  907. } break;
  908. case BADDR_TYPE_IPV6: {
  909. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in6_pktinfo)));
  910. cmsg->cmsg_level = IPPROTO_IPV6;
  911. cmsg->cmsg_type = IPV6_PKTINFO;
  912. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in6_pktinfo));
  913. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  914. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  915. sum += WSA_CMSG_SPACE(sizeof(struct in6_pktinfo));
  916. } break;
  917. default:
  918. ASSERT(0);
  919. }
  920. msg.Control.len = sum;
  921. DWORD bytes;
  922. if (bs->WSASendMsg(bs->socket, &msg, 0, &bytes, NULL, NULL) != 0) {
  923. int error;
  924. switch ((error = WSAGetLastError())) {
  925. case WSAEWOULDBLOCK:
  926. bs->error = BSOCKET_ERROR_LATER;
  927. return -1;
  928. }
  929. bs->error = translate_error(error);
  930. return -1;
  931. }
  932. #else
  933. struct iovec iov;
  934. iov.iov_base = data;
  935. iov.iov_len = len;
  936. union {
  937. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  938. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  939. } cdata;
  940. struct msghdr msg;
  941. memset(&msg, 0, sizeof(msg));
  942. msg.msg_name = &remote_sysaddr.addr.generic;
  943. msg.msg_namelen = remote_sysaddr.len;
  944. msg.msg_iov = &iov;
  945. msg.msg_iovlen = 1;
  946. msg.msg_control = &cdata;
  947. msg.msg_controllen = sizeof(cdata);
  948. int sum = 0;
  949. struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
  950. switch (local_addr->type) {
  951. case BADDR_TYPE_NONE:
  952. break;
  953. case BADDR_TYPE_IPV4: {
  954. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_pktinfo)));
  955. cmsg->cmsg_level = IPPROTO_IP;
  956. cmsg->cmsg_type = IP_PKTINFO;
  957. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
  958. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  959. pktinfo->ipi_spec_dst.s_addr = local_addr->ipv4;
  960. sum += CMSG_SPACE(sizeof(struct in_pktinfo));
  961. } break;
  962. case BADDR_TYPE_IPV6: {
  963. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in6_pktinfo)));
  964. cmsg->cmsg_level = IPPROTO_IPV6;
  965. cmsg->cmsg_type = IPV6_PKTINFO;
  966. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
  967. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  968. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  969. sum += CMSG_SPACE(sizeof(struct in6_pktinfo));
  970. } break;
  971. default:
  972. ASSERT(0);
  973. }
  974. msg.msg_controllen = sum;
  975. int bytes = sendmsg(bs->socket, &msg, MSG_NOSIGNAL);
  976. if (bytes < 0) {
  977. int error;
  978. switch ((error = errno)) {
  979. case EAGAIN:
  980. #if EAGAIN != EWOULDBLOCK
  981. case EWOULDBLOCK:
  982. #endif
  983. bs->error = BSOCKET_ERROR_LATER;
  984. return -1;
  985. }
  986. bs->error = translate_error(error);
  987. return -1;
  988. }
  989. #endif
  990. bs->error = BSOCKET_ERROR_NONE;
  991. return bytes;
  992. }
  993. int BSocket_RecvFromTo (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  994. {
  995. ASSERT(len >= 0)
  996. ASSERT(addr)
  997. ASSERT(local_addr)
  998. if (limit_recv(bs)) {
  999. bs->error = BSOCKET_ERROR_LATER;
  1000. return -1;
  1001. }
  1002. struct sys_addr remote_sysaddr;
  1003. remote_sysaddr.len = sizeof(remote_sysaddr.addr);
  1004. #ifdef BADVPN_USE_WINAPI
  1005. WSABUF buf;
  1006. buf.len = len;
  1007. buf.buf = data;
  1008. union {
  1009. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  1010. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1011. } cdata;
  1012. WSAMSG msg;
  1013. memset(&msg, 0, sizeof(msg));
  1014. msg.name = &remote_sysaddr.addr.generic;
  1015. msg.namelen = remote_sysaddr.len;
  1016. msg.lpBuffers = &buf;
  1017. msg.dwBufferCount = 1;
  1018. msg.Control.buf = (char *)&cdata;
  1019. msg.Control.len = sizeof(cdata);
  1020. DWORD bytes;
  1021. if (bs->WSARecvMsg(bs->socket, &msg, &bytes, NULL, NULL) != 0) {
  1022. int error;
  1023. switch ((error = WSAGetLastError())) {
  1024. case WSAEWOULDBLOCK:
  1025. bs->error = BSOCKET_ERROR_LATER;
  1026. return -1;
  1027. }
  1028. bs->error = translate_error(error);
  1029. return -1;
  1030. }
  1031. remote_sysaddr.len = msg.namelen;
  1032. #else
  1033. struct iovec iov;
  1034. iov.iov_base = data;
  1035. iov.iov_len = len;
  1036. union {
  1037. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  1038. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1039. } cdata;
  1040. struct msghdr msg;
  1041. memset(&msg, 0, sizeof(msg));
  1042. msg.msg_name = &remote_sysaddr.addr.generic;
  1043. msg.msg_namelen = remote_sysaddr.len;
  1044. msg.msg_iov = &iov;
  1045. msg.msg_iovlen = 1;
  1046. msg.msg_control = &cdata;
  1047. msg.msg_controllen = sizeof(cdata);
  1048. int bytes = recvmsg(bs->socket, &msg, 0);
  1049. if (bytes < 0) {
  1050. int error;
  1051. switch ((error = errno)) {
  1052. case EAGAIN:
  1053. #if EAGAIN != EWOULDBLOCK
  1054. case EWOULDBLOCK:
  1055. #endif
  1056. bs->error = BSOCKET_ERROR_LATER;
  1057. return -1;
  1058. }
  1059. bs->error = translate_error(error);
  1060. return -1;
  1061. }
  1062. remote_sysaddr.len = msg.msg_namelen;
  1063. #endif
  1064. addr_sys_to_socket(addr, &remote_sysaddr);
  1065. BIPAddr_InitInvalid(local_addr);
  1066. #ifdef BADVPN_USE_WINAPI
  1067. WSACMSGHDR *cmsg;
  1068. for (cmsg = WSA_CMSG_FIRSTHDR(&msg); cmsg; cmsg = WSA_CMSG_NXTHDR(&msg, cmsg)) {
  1069. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1070. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  1071. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1072. }
  1073. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1074. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  1075. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1076. }
  1077. }
  1078. #else
  1079. struct cmsghdr *cmsg;
  1080. for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
  1081. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1082. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  1083. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1084. }
  1085. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1086. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  1087. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1088. }
  1089. }
  1090. #endif
  1091. bs->error = BSOCKET_ERROR_NONE;
  1092. return bytes;
  1093. }
  1094. int BSocket_GetPeerName (BSocket *bs, BAddr *addr)
  1095. {
  1096. ASSERT(addr)
  1097. struct sys_addr sysaddr;
  1098. sysaddr.len = sizeof(sysaddr.addr);
  1099. if (getpeername(bs->socket, &sysaddr.addr.generic, &sysaddr.len) < 0) {
  1100. bs->error = BSOCKET_ERROR_UNKNOWN;
  1101. return -1;
  1102. }
  1103. addr_sys_to_socket(addr, &sysaddr);
  1104. bs->error = BSOCKET_ERROR_NONE;
  1105. return 0;
  1106. }
  1107. #ifndef BADVPN_USE_WINAPI
  1108. static int create_unix_sysaddr (struct sockaddr_un *addr, size_t *addr_len, const char *path)
  1109. {
  1110. size_t path_len = strlen(path);
  1111. if (path_len == 0) {
  1112. DEBUG("path empty");
  1113. return 0;
  1114. }
  1115. addr->sun_family = AF_UNIX;
  1116. if (path_len >= sizeof(addr->sun_path)) {
  1117. DEBUG("path too long");
  1118. return 0;
  1119. }
  1120. strcpy(addr->sun_path, path);
  1121. *addr_len = offsetof(struct sockaddr_un, sun_path) + path_len + 1;
  1122. return 1;
  1123. }
  1124. int BSocket_BindUnix (BSocket *bs, const char *path)
  1125. {
  1126. struct sockaddr_un sys_addr;
  1127. size_t addr_len;
  1128. if (!create_unix_sysaddr(&sys_addr, &addr_len, path)) {
  1129. bs->error = BSOCKET_ERROR_UNKNOWN;
  1130. return -1;
  1131. }
  1132. if (bind(bs->socket, (struct sockaddr *)&sys_addr, addr_len) < 0) {
  1133. bs->error = translate_error(errno);
  1134. return -1;
  1135. }
  1136. bs->error = BSOCKET_ERROR_NONE;
  1137. return 0;
  1138. }
  1139. int BSocket_ConnectUnix (BSocket *bs, const char *path)
  1140. {
  1141. struct sockaddr_un sys_addr;
  1142. size_t addr_len;
  1143. if (!create_unix_sysaddr(&sys_addr, &addr_len, path)) {
  1144. bs->error = BSOCKET_ERROR_UNKNOWN;
  1145. return -1;
  1146. }
  1147. if (connect(bs->socket, (struct sockaddr *)&sys_addr, addr_len) < 0) {
  1148. bs->error = translate_error(errno);
  1149. return -1;
  1150. }
  1151. bs->error = BSOCKET_ERROR_NONE;
  1152. return 0;
  1153. }
  1154. #endif