tor_multipath_voip/src/donar_server.c

74 lines
2.3 KiB
C
Raw Normal View History

2019-02-11 09:23:38 +00:00
#include "donar_server.h"
2019-02-11 15:23:20 +00:00
void create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count) {
2019-02-11 09:23:38 +00:00
tor_os_create (tos, "onion_services.pub", "onion_services.txt", ports_count);
tor_os_read (tos);
int err = 0;
err = tor_ctl_connect (tctl, "127.0.0.1", "9051");
if (err < 0) {
fprintf(stderr, "Unable to open Tor Socket\n");
exit(EXIT_FAILURE);
}
err = tor_ctl_add_onion (tctl, tos, ports);
if (err != 0) {
fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err);
exit(EXIT_FAILURE);
}
}
void destroy_resources(struct tor_os_str* tos, struct tor_ctl* tctl) {
tor_ctl_close (tctl);
tor_os_free (tos);
}
2019-02-11 15:23:20 +00:00
void init_tcp_servers(struct donar_server_ctx* ctx) {
char buffer[6];
2019-02-11 21:40:00 +00:00
int err, sock = 0;
for (int i = 0; i < PORT_SIZE; i++) {
2019-02-11 15:23:20 +00:00
sprintf (buffer, "%d", ctx->ports[i]);
2019-02-11 21:40:00 +00:00
sock = create_tcp_server (buffer);
if (sock < 0) goto socket_create_err;
err = listen(sock, SOMAXCONN);
2019-02-11 15:23:20 +00:00
if (err != 0) goto socket_create_err;
2019-02-11 21:40:00 +00:00
evt_core_add_fd(&(ctx->evts), "tcp-listen", sock);
2019-02-11 15:23:20 +00:00
}
return;
2019-02-11 09:23:38 +00:00
2019-02-11 15:23:20 +00:00
socket_create_err:
fprintf(stderr, "Unable to create a TCP socket\n");
exit(EXIT_FAILURE);
}
2019-02-11 22:40:37 +00:00
void donar_server(struct donar_server_ctx* ctx, struct algo_skel* algo, char* udp_host, char* udp_port) {
2019-02-11 21:40:00 +00:00
evt_core_init (&(ctx->evts));
evt_core_add_cat (&(ctx->evts), &(algo->on_tcp_co));
2019-02-12 10:17:37 +00:00
evt_core_add_cat (&(ctx->evts), &(algo->on_udp_read));
evt_core_add_cat (&(ctx->evts), &(algo->on_tcp_read));
evt_core_add_cat (&(ctx->evts), &(algo->on_udp_write));
evt_core_add_cat (&(ctx->evts), &(algo->on_tcp_write));
2019-02-11 21:40:00 +00:00
2019-02-12 16:12:20 +00:00
printf("--- Categories created\n");
2019-02-11 22:40:37 +00:00
int sock = create_udp_client (udp_host, udp_port);
2019-02-12 16:12:20 +00:00
if (sock < 0) {
fprintf(stderr, "Unable to create a UDP client socket\n");
exit(EXIT_FAILURE);
}
2019-02-12 10:17:37 +00:00
evt_core_add_fd (&(ctx->evts), "udp-read", sock);
2019-02-12 16:12:20 +00:00
evt_core_add_fd (&(ctx->evts), "udp-write", dup(sock));
printf("--- UDP client is connected\n");
2019-02-11 22:40:37 +00:00
2019-02-11 21:40:00 +00:00
for (uint16_t i = 0; i < PORT_SIZE ; i++) {
2019-02-11 15:23:20 +00:00
ctx->ports[i] = 7500 + i;
}
2019-02-11 21:40:00 +00:00
create_onion_services (&(ctx->tos), &(ctx->tctl), ctx->ports, PORT_SIZE);
2019-02-11 15:23:20 +00:00
printf("--- Onion services created\n");
init_tcp_servers(ctx);
2019-02-12 16:12:20 +00:00
printf("--- TCP servers are listening\n");
2019-02-11 15:23:20 +00:00
2019-02-11 21:40:00 +00:00
evt_core_loop (&(ctx->evts));
2019-02-11 15:23:20 +00:00
destroy_resources (&(ctx->tos), &(ctx->tctl));
2019-02-11 09:23:38 +00:00
}