diff options
author | iphydf <iphydf@users.noreply.github.com> | 2018-02-27 02:07:59 +0000 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2018-05-20 15:42:42 +0000 |
commit | be797d4b039b40d2c876f0a71cd1e48454a74065 (patch) | |
tree | c759c0f15a3ac0285e0bd941dc3edad06ade015d /toxcore/TCP_server.c | |
parent | 291a849a5a0afb4450bcd0d0c50b7aeccaac04f5 (diff) |
Move system header includes from network.h to network.c
Diffstat (limited to 'toxcore/TCP_server.c')
-rw-r--r-- | toxcore/TCP_server.c | 94 |
1 files changed, 43 insertions, 51 deletions
diff --git a/toxcore/TCP_server.c b/toxcore/TCP_server.c index 4541fce0..28a441ad 100644 --- a/toxcore/TCP_server.c +++ b/toxcore/TCP_server.c | |||
@@ -27,12 +27,20 @@ | |||
27 | 27 | ||
28 | #include "TCP_server.h" | 28 | #include "TCP_server.h" |
29 | 29 | ||
30 | #include "util.h" | 30 | #include <stdio.h> |
31 | 31 | #include <stdlib.h> | |
32 | #include <string.h> | ||
32 | #if !defined(_WIN32) && !defined(__WIN32__) && !defined (WIN32) | 33 | #if !defined(_WIN32) && !defined(__WIN32__) && !defined (WIN32) |
33 | #include <sys/ioctl.h> | 34 | #include <sys/ioctl.h> |
34 | #endif | 35 | #endif |
35 | 36 | ||
37 | #ifdef TCP_SERVER_USE_EPOLL | ||
38 | #include <sys/epoll.h> | ||
39 | #include <unistd.h> | ||
40 | #endif | ||
41 | |||
42 | #include "util.h" | ||
43 | |||
36 | typedef struct TCP_Secure_Connection { | 44 | typedef struct TCP_Secure_Connection { |
37 | Socket sock; | 45 | Socket sock; |
38 | uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; | 46 | uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; |
@@ -231,22 +239,6 @@ static int del_accepted(TCP_Server *TCP_server, int index) | |||
231 | return 0; | 239 | return 0; |
232 | } | 240 | } |
233 | 241 | ||
234 | /* return the amount of data in the tcp recv buffer. | ||
235 | * return 0 on failure. | ||
236 | */ | ||
237 | unsigned int TCP_socket_data_recv_buffer(Socket sock) | ||
238 | { | ||
239 | #if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) | ||
240 | unsigned long count = 0; | ||
241 | ioctlsocket(sock, FIONREAD, &count); | ||
242 | #else | ||
243 | int count = 0; | ||
244 | ioctl(sock, FIONREAD, &count); | ||
245 | #endif | ||
246 | |||
247 | return count; | ||
248 | } | ||
249 | |||
250 | /* Read the next two bytes in TCP stream then convert them to | 242 | /* Read the next two bytes in TCP stream then convert them to |
251 | * length (host byte order). | 243 | * length (host byte order). |
252 | * | 244 | * |
@@ -256,11 +248,11 @@ unsigned int TCP_socket_data_recv_buffer(Socket sock) | |||
256 | */ | 248 | */ |
257 | uint16_t read_TCP_length(Socket sock) | 249 | uint16_t read_TCP_length(Socket sock) |
258 | { | 250 | { |
259 | unsigned int count = TCP_socket_data_recv_buffer(sock); | 251 | const unsigned int count = net_socket_data_recv_buffer(sock); |
260 | 252 | ||
261 | if (count >= sizeof(uint16_t)) { | 253 | if (count >= sizeof(uint16_t)) { |
262 | uint16_t length; | 254 | uint16_t length; |
263 | int len = recv(sock, (char *)&length, sizeof(uint16_t), MSG_NOSIGNAL); | 255 | const int len = net_recv(sock, &length, sizeof(uint16_t)); |
264 | 256 | ||
265 | if (len != sizeof(uint16_t)) { | 257 | if (len != sizeof(uint16_t)) { |
266 | fprintf(stderr, "FAIL recv packet\n"); | 258 | fprintf(stderr, "FAIL recv packet\n"); |
@@ -286,10 +278,10 @@ uint16_t read_TCP_length(Socket sock) | |||
286 | */ | 278 | */ |
287 | int read_TCP_packet(Socket sock, uint8_t *data, uint16_t length) | 279 | int read_TCP_packet(Socket sock, uint8_t *data, uint16_t length) |
288 | { | 280 | { |
289 | unsigned int count = TCP_socket_data_recv_buffer(sock); | 281 | unsigned int count = net_socket_data_recv_buffer(sock); |
290 | 282 | ||
291 | if (count >= length) { | 283 | if (count >= length) { |
292 | int len = recv(sock, (char *)data, length, MSG_NOSIGNAL); | 284 | const int len = net_recv(sock, data, length); |
293 | 285 | ||
294 | if (len != length) { | 286 | if (len != length) { |
295 | fprintf(stderr, "FAIL recv packet\n"); | 287 | fprintf(stderr, "FAIL recv packet\n"); |
@@ -356,8 +348,8 @@ static int send_pending_data_nonpriority(TCP_Secure_Connection *con) | |||
356 | return 0; | 348 | return 0; |
357 | } | 349 | } |
358 | 350 | ||
359 | uint16_t left = con->last_packet_length - con->last_packet_sent; | 351 | const uint16_t left = con->last_packet_length - con->last_packet_sent; |
360 | int len = send(con->sock, (const char *)(con->last_packet + con->last_packet_sent), left, MSG_NOSIGNAL); | 352 | const int len = net_send(con->sock, con->last_packet + con->last_packet_sent, left); |
361 | 353 | ||
362 | if (len <= 0) { | 354 | if (len <= 0) { |
363 | return -1; | 355 | return -1; |
@@ -386,8 +378,8 @@ static int send_pending_data(TCP_Secure_Connection *con) | |||
386 | TCP_Priority_List *p = con->priority_queue_start; | 378 | TCP_Priority_List *p = con->priority_queue_start; |
387 | 379 | ||
388 | while (p) { | 380 | while (p) { |
389 | uint16_t left = p->size - p->sent; | 381 | const uint16_t left = p->size - p->sent; |
390 | int len = send(con->sock, (const char *)(p->data + p->sent), left, MSG_NOSIGNAL); | 382 | const int len = net_send(con->sock, p->data + p->sent, left); |
391 | 383 | ||
392 | if (len != left) { | 384 | if (len != left) { |
393 | if (len > 0) { | 385 | if (len > 0) { |
@@ -462,7 +454,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const | |||
462 | 454 | ||
463 | VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE); | 455 | VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE); |
464 | 456 | ||
465 | uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE); | 457 | const uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE); |
466 | memcpy(packet, &c_length, sizeof(uint16_t)); | 458 | memcpy(packet, &c_length, sizeof(uint16_t)); |
467 | int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t)); | 459 | int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t)); |
468 | 460 | ||
@@ -471,7 +463,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const | |||
471 | } | 463 | } |
472 | 464 | ||
473 | if (priority) { | 465 | if (priority) { |
474 | len = sendpriority ? send(con->sock, (const char *)packet, SIZEOF_VLA(packet), MSG_NOSIGNAL) : 0; | 466 | len = sendpriority ? net_send(con->sock, packet, SIZEOF_VLA(packet)) : 0; |
475 | 467 | ||
476 | if (len <= 0) { | 468 | if (len <= 0) { |
477 | len = 0; | 469 | len = 0; |
@@ -486,7 +478,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const | |||
486 | return add_priority(con, packet, SIZEOF_VLA(packet), len); | 478 | return add_priority(con, packet, SIZEOF_VLA(packet), len); |
487 | } | 479 | } |
488 | 480 | ||
489 | len = send(con->sock, (const char *)packet, SIZEOF_VLA(packet), MSG_NOSIGNAL); | 481 | len = net_send(con->sock, packet, SIZEOF_VLA(packet)); |
490 | 482 | ||
491 | if (len <= 0) { | 483 | if (len <= 0) { |
492 | return 0; | 484 | return 0; |
@@ -583,7 +575,7 @@ static int handle_TCP_handshake(TCP_Secure_Connection *con, const uint8_t *data, | |||
583 | return -1; | 575 | return -1; |
584 | } | 576 | } |
585 | 577 | ||
586 | if (TCP_SERVER_HANDSHAKE_SIZE != send(con->sock, (const char *)response, TCP_SERVER_HANDSHAKE_SIZE, MSG_NOSIGNAL)) { | 578 | if (TCP_SERVER_HANDSHAKE_SIZE != net_send(con->sock, response, TCP_SERVER_HANDSHAKE_SIZE)) { |
587 | return -1; | 579 | return -1; |
588 | } | 580 | } |
589 | 581 | ||
@@ -1005,12 +997,12 @@ static int accept_connection(TCP_Server *TCP_server, Socket sock) | |||
1005 | return index; | 997 | return index; |
1006 | } | 998 | } |
1007 | 999 | ||
1008 | static Socket new_listening_TCP_socket(int family, uint16_t port) | 1000 | static Socket new_listening_TCP_socket(Family family, uint16_t port) |
1009 | { | 1001 | { |
1010 | Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP); | 1002 | Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP); |
1011 | 1003 | ||
1012 | if (!sock_valid(sock)) { | 1004 | if (!sock_valid(sock)) { |
1013 | return ~0; | 1005 | return net_invalid_socket; |
1014 | } | 1006 | } |
1015 | 1007 | ||
1016 | int ok = set_socket_nonblock(sock); | 1008 | int ok = set_socket_nonblock(sock); |
@@ -1023,11 +1015,11 @@ static Socket new_listening_TCP_socket(int family, uint16_t port) | |||
1023 | ok = set_socket_reuseaddr(sock); | 1015 | ok = set_socket_reuseaddr(sock); |
1024 | } | 1016 | } |
1025 | 1017 | ||
1026 | ok = ok && bind_to_port(sock, family, port) && (listen(sock, TCP_MAX_BACKLOG) == 0); | 1018 | ok = ok && bind_to_port(sock, family, port) && (net_listen(sock, TCP_MAX_BACKLOG) == 0); |
1027 | 1019 | ||
1028 | if (!ok) { | 1020 | if (!ok) { |
1029 | kill_sock(sock); | 1021 | kill_sock(sock); |
1030 | return ~0; | 1022 | return net_invalid_socket; |
1031 | } | 1023 | } |
1032 | 1024 | ||
1033 | return sock; | 1025 | return sock; |
@@ -1087,9 +1079,9 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin | |||
1087 | if (sock_valid(sock)) { | 1079 | if (sock_valid(sock)) { |
1088 | #ifdef TCP_SERVER_USE_EPOLL | 1080 | #ifdef TCP_SERVER_USE_EPOLL |
1089 | ev.events = EPOLLIN | EPOLLET; | 1081 | ev.events = EPOLLIN | EPOLLET; |
1090 | ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32); | 1082 | ev.data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_LISTENING << 32); |
1091 | 1083 | ||
1092 | if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock, &ev) == -1) { | 1084 | if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock.socket, &ev) == -1) { |
1093 | continue; | 1085 | continue; |
1094 | } | 1086 | } |
1095 | 1087 | ||
@@ -1119,20 +1111,20 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin | |||
1119 | return temp; | 1111 | return temp; |
1120 | } | 1112 | } |
1121 | 1113 | ||
1114 | #ifndef TCP_SERVER_USE_EPOLL | ||
1122 | static void do_TCP_accept_new(TCP_Server *TCP_server) | 1115 | static void do_TCP_accept_new(TCP_Server *TCP_server) |
1123 | { | 1116 | { |
1124 | uint32_t i; | 1117 | uint32_t i; |
1125 | 1118 | ||
1126 | for (i = 0; i < TCP_server->num_listening_socks; ++i) { | 1119 | for (i = 0; i < TCP_server->num_listening_socks; ++i) { |
1127 | struct sockaddr_storage addr; | ||
1128 | socklen_t addrlen = sizeof(addr); | ||
1129 | Socket sock; | 1120 | Socket sock; |
1130 | 1121 | ||
1131 | do { | 1122 | do { |
1132 | sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen); | 1123 | sock = net_accept(TCP_server->socks_listening[i]); |
1133 | } while (accept_connection(TCP_server, sock) != -1); | 1124 | } while (accept_connection(TCP_server, sock) != -1); |
1134 | } | 1125 | } |
1135 | } | 1126 | } |
1127 | #endif | ||
1136 | 1128 | ||
1137 | static int do_incoming(TCP_Server *TCP_server, uint32_t i) | 1129 | static int do_incoming(TCP_Server *TCP_server, uint32_t i) |
1138 | { | 1130 | { |
@@ -1208,6 +1200,7 @@ static void do_confirmed_recv(TCP_Server *TCP_server, uint32_t i) | |||
1208 | } | 1200 | } |
1209 | } | 1201 | } |
1210 | 1202 | ||
1203 | #ifndef TCP_SERVER_USE_EPOLL | ||
1211 | static void do_TCP_incoming(TCP_Server *TCP_server) | 1204 | static void do_TCP_incoming(TCP_Server *TCP_server) |
1212 | { | 1205 | { |
1213 | uint32_t i; | 1206 | uint32_t i; |
@@ -1225,6 +1218,7 @@ static void do_TCP_unconfirmed(TCP_Server *TCP_server) | |||
1225 | do_unconfirmed(TCP_server, i); | 1218 | do_unconfirmed(TCP_server, i); |
1226 | } | 1219 | } |
1227 | } | 1220 | } |
1221 | #endif | ||
1228 | 1222 | ||
1229 | static void do_TCP_confirmed(TCP_Server *TCP_server) | 1223 | static void do_TCP_confirmed(TCP_Server *TCP_server) |
1230 | { | 1224 | { |
@@ -1294,8 +1288,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1294 | int n; | 1288 | int n; |
1295 | 1289 | ||
1296 | for (n = 0; n < nfds; ++n) { | 1290 | for (n = 0; n < nfds; ++n) { |
1297 | Socket sock = events[n].data.u64 & 0xFFFFFFFF; | 1291 | const Socket sock = {(int)(events[n].data.u64 & 0xFFFFFFFF)}; |
1298 | int status = (events[n].data.u64 >> 32) & 0xFF, index = (events[n].data.u64 >> 40); | 1292 | const int status = (events[n].data.u64 >> 32) & 0xFF; |
1293 | const int index = events[n].data.u64 >> 40; | ||
1299 | 1294 | ||
1300 | if ((events[n].events & EPOLLERR) || (events[n].events & EPOLLHUP) || (events[n].events & EPOLLRDHUP)) { | 1295 | if ((events[n].events & EPOLLERR) || (events[n].events & EPOLLHUP) || (events[n].events & EPOLLRDHUP)) { |
1301 | switch (status) { | 1296 | switch (status) { |
@@ -1331,11 +1326,8 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1331 | switch (status) { | 1326 | switch (status) { |
1332 | case TCP_SOCKET_LISTENING: { | 1327 | case TCP_SOCKET_LISTENING: { |
1333 | //socket is from socks_listening, accept connection | 1328 | //socket is from socks_listening, accept connection |
1334 | struct sockaddr_storage addr; | ||
1335 | socklen_t addrlen = sizeof(addr); | ||
1336 | |||
1337 | while (1) { | 1329 | while (1) { |
1338 | Socket sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen); | 1330 | Socket sock_new = net_accept(sock); |
1339 | 1331 | ||
1340 | if (!sock_valid(sock_new)) { | 1332 | if (!sock_valid(sock_new)) { |
1341 | break; | 1333 | break; |
@@ -1349,10 +1341,10 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1349 | 1341 | ||
1350 | struct epoll_event ev = { | 1342 | struct epoll_event ev = { |
1351 | .events = EPOLLIN | EPOLLET | EPOLLRDHUP, | 1343 | .events = EPOLLIN | EPOLLET | EPOLLRDHUP, |
1352 | .data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 40) | 1344 | .data.u64 = sock_new.socket | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 40) |
1353 | }; | 1345 | }; |
1354 | 1346 | ||
1355 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) { | 1347 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new.socket, &ev) == -1) { |
1356 | kill_TCP_secure_connection(&TCP_server->incoming_connection_queue[index_new]); | 1348 | kill_TCP_secure_connection(&TCP_server->incoming_connection_queue[index_new]); |
1357 | continue; | 1349 | continue; |
1358 | } | 1350 | } |
@@ -1366,9 +1358,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1366 | 1358 | ||
1367 | if ((index_new = do_incoming(TCP_server, index)) != -1) { | 1359 | if ((index_new = do_incoming(TCP_server, index)) != -1) { |
1368 | events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; | 1360 | events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; |
1369 | events[n].data.u64 = sock | ((uint64_t)TCP_SOCKET_UNCONFIRMED << 32) | ((uint64_t)index_new << 40); | 1361 | events[n].data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_UNCONFIRMED << 32) | ((uint64_t)index_new << 40); |
1370 | 1362 | ||
1371 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock, &events[n]) == -1) { | 1363 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock.socket, &events[n]) == -1) { |
1372 | kill_TCP_secure_connection(&TCP_server->unconfirmed_connection_queue[index_new]); | 1364 | kill_TCP_secure_connection(&TCP_server->unconfirmed_connection_queue[index_new]); |
1373 | break; | 1365 | break; |
1374 | } | 1366 | } |
@@ -1382,9 +1374,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1382 | 1374 | ||
1383 | if ((index_new = do_unconfirmed(TCP_server, index)) != -1) { | 1375 | if ((index_new = do_unconfirmed(TCP_server, index)) != -1) { |
1384 | events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; | 1376 | events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; |
1385 | events[n].data.u64 = sock | ((uint64_t)TCP_SOCKET_CONFIRMED << 32) | ((uint64_t)index_new << 40); | 1377 | events[n].data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_CONFIRMED << 32) | ((uint64_t)index_new << 40); |
1386 | 1378 | ||
1387 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock, &events[n]) == -1) { | 1379 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock.socket, &events[n]) == -1) { |
1388 | //remove from confirmed connections | 1380 | //remove from confirmed connections |
1389 | kill_accepted(TCP_server, index_new); | 1381 | kill_accepted(TCP_server, index_new); |
1390 | break; | 1382 | break; |