From fc039b6045aaccaedcde422f887b6a41081fcaa9 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 19 Feb 2019 10:32:33 +0100 Subject: [PATCH] Reimplement UDP client + fix cb signature --- CMakeLists.txt | 2 ++ src/algo_naive.c | 7 +------ src/algo_skel.h | 1 + src/donar_client.c | 22 +++++++++++----------- src/packet.c | 22 +++++++++++++++++++--- src/packet.h | 1 + 6 files changed, 35 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df58272..4def587 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,8 @@ list(APPEND CSOURCES src/utils.c src/packet.h src/packet.c + src/url.h + src/url.c ) add_executable(donar ${CSOURCES} src/donar.c) diff --git a/src/algo_naive.c b/src/algo_naive.c index 0f9d8f8..571da9e 100644 --- a/src/algo_naive.c +++ b/src/algo_naive.c @@ -25,11 +25,6 @@ void free_naive(void* app_ctx) { free(ctx); } -char* get_port(char* out, char* in) { - sscanf(in, "%*[a-z]:%*[a-z]:%*[a-zA-Z0-9.]:%[0-9]", out); - return out; -} - void on_tcp_co(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { int conn_sock1, conn_sock2; struct sockaddr_in addr; @@ -48,7 +43,7 @@ void on_tcp_co(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { if (conn_sock2 == -1) goto co_error; //printf("fd=%d accepts, creating fds=%d,%d\n", fd, conn_sock1, conn_sock2); - get_port(port, fdinfo->url); + url_get_port(port, fdinfo->url); to_fdinfo.fd = conn_sock1; to_fdinfo.cat->name = "tcp-read"; diff --git a/src/algo_skel.h b/src/algo_skel.h index e4a21ef..a8e6b28 100644 --- a/src/algo_skel.h +++ b/src/algo_skel.h @@ -6,6 +6,7 @@ #include "packet.h" #include "evt_core.h" #include "utils.h" +#include "url.h" struct algo_skel { struct evt_core_cat on_udp_read; diff --git a/src/donar_client.c b/src/donar_client.c index f21f1eb..3151fc5 100644 --- a/src/donar_client.c +++ b/src/donar_client.c @@ -35,13 +35,13 @@ failed_socks5: } } -void configure_tcp_clients(struct evt_core_ctx* ctx, struct evt_core_cat* cat, int fd) { +void configure_tcp_clients(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { int err, pos; - struct donar_client_ctx* app_ctx = (struct donar_client_ctx*) cat->app_ctx; + struct donar_client_ctx* app_ctx = (struct donar_client_ctx*) fdinfo->cat->app_ctx; pos = -1; for (int i = 0; i < CLIENT_PORT_SIZE; i++) { - if (app_ctx->client_sock[i].fd == fd) { + if (app_ctx->client_sock[i].fd == fdinfo->fd) { pos = i; } } @@ -56,24 +56,24 @@ void configure_tcp_clients(struct evt_core_ctx* ctx, struct evt_core_cat* cat, i switch (app_ctx->client_sock[pos].state) { case SOCKS5_STATE_NEW: //@FIXME: We suppose that we will be able to do the whole read at once which is wrong - err = socks5_handshake_ack (fd); + err = socks5_handshake_ack (fdinfo->fd); if (err < 0) goto on_socks5_err; //@FIXME: We suppose that we will be able to do the whole write at once which is wrong too - err = socks5_connect_dns(fd, target_host, app_ctx->ports[pos]); + err = socks5_connect_dns(fdinfo->fd, target_host, app_ctx->ports[pos]); if (err < 0) goto on_socks5_err; app_ctx->client_sock[pos].state = SOCKS5_STATE_ACK; printf("Socket %d/%d %s:%d is connecting...\n", pos+1, CLIENT_PORT_SIZE, target_host, app_ctx->ports[pos]); break; case SOCKS5_STATE_ACK: //@FIXME: We suppose that we will be able to do the whole read at once which is wrong too - err = socks5_reply (fd); + err = socks5_reply (fdinfo->fd); if (err < 0) goto on_socks5_err; app_ctx->client_sock[pos].state = SOCKS5_STATE_RDY; int sock1, sock2; - sock1 = dup(fd); - sock2 = dup(fd); + sock1 = dup(fdinfo->fd); + sock2 = dup(fdinfo->fd); if (sock1 < 0 || sock2 < 0) goto on_socks5_err; - void* fdcat = evt_core_rm_fd (ctx, fd); + void* fdcat = evt_core_rm_fd (ctx, fdinfo->fd); if (fdcat == NULL) goto on_socks5_err; struct evt_core_fdinfo fdinfo = {0}; @@ -106,7 +106,7 @@ void configure_tcp_clients(struct evt_core_ctx* ctx, struct evt_core_cat* cat, i on_socks5_err: perror("An error occured while connecting to an Onion Service"); app_ctx->client_sock[pos].state = SOCKS5_STATE_ERR; - evt_core_rm_fd (ctx, fd); + evt_core_rm_fd (ctx, fdinfo->fd); init_tcp_client (app_ctx, pos); } @@ -118,7 +118,7 @@ void init_udp_socket(char* port, struct donar_client_ctx* ctx) { fdinfo.cat = &cat; fdinfo.url = url; - sock1 = create_udp_client ("127.0.0.1", port); + sock1 = create_udp_server (port); if (sock1 < 0) goto socket_failed; sock2 = dup(sock1); if (sock2 < 0) goto socket_failed; diff --git a/src/packet.c b/src/packet.c index e89ad8f..676c7ab 100644 --- a/src/packet.c +++ b/src/packet.c @@ -48,14 +48,22 @@ enum FD_STATE write_packet_to_udp(int fd, struct buffer_packet* bp) { ssize_t nwrite; size_t bytes_to_send; size_t pkt_header_size = sizeof(bp->ip.ap.str) - sizeof(char); + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(bp->ip.ap.str.port), + }; + inet_aton("127.0.0.1", &addr.sin_addr); + socklen_t addr_len = sizeof(addr); if (bp->mode != BP_WRITING) return FDS_ERR; bytes_to_send = bp->ip.ap.str.size - pkt_header_size; - nwrite = send(fd, + nwrite = sendto(fd, &(bp->ip.ap.str.payload), bytes_to_send, - 0); + 0, + (struct sockaddr*)&addr, + addr_len); if (nwrite == -1 && errno == EAGAIN) return FDS_AGAIN; if (nwrite != bytes_to_send) return FDS_ERR; @@ -70,15 +78,23 @@ enum FD_STATE read_packet_from_udp (int fd, struct buffer_packet* bp) { ssize_t nread; if (bp->mode != BP_READING) return FDS_ERR; + struct sockaddr_in addr = {0}; + socklen_t addr_len = sizeof(addr); size_t pkt_header_size = sizeof(bp->ip.ap.str) - sizeof(char); // We remove the payload size_t udp_packet_size = sizeof(struct internet_packet) - pkt_header_size; - nread = recv(fd, &(bp->ip.ap.str.payload), udp_packet_size, MSG_TRUNC); + nread = recvfrom(fd, + &(bp->ip.ap.str.payload), + udp_packet_size, + MSG_TRUNC, + (struct sockaddr*)&addr, + &addr_len); if ((int)nread > (int)udp_packet_size) return FDS_ERR; if (nread == -1 && errno == EAGAIN) return FDS_AGAIN; if (nread == -1) return FDS_ERR; + bp->ip.ap.str.port = ntohs(addr.sin_port); bp->ip.ap.str.size = nread + pkt_header_size; bp->mode = BP_WRITING; diff --git a/src/packet.h b/src/packet.h index f8d1f8f..49044a5 100644 --- a/src/packet.h +++ b/src/packet.h @@ -7,6 +7,7 @@ #include #include #include +#include /* * man 7 udp about receive operation on UDP sockets: