Reimplement UDP client + fix cb signature
This commit is contained in:
parent
5e291f21a7
commit
fc039b6045
6 changed files with 35 additions and 20 deletions
|
@ -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)
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
22
src/packet.c
22
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;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
/*
|
||||
* man 7 udp about receive operation on UDP sockets:
|
||||
|
|
Loading…
Reference in a new issue