#include "donar_server.h" void create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count) { 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); } void init_tcp_servers(struct donar_server_ctx* ctx) { char url[1024]; struct evt_core_cat cat = {0}; struct evt_core_fdinfo fdinfo = {0}; fdinfo.cat = &cat; fdinfo.url = url; char buffer[6]; int err, sock = 0; for (int i = 0; i < PORT_SIZE; i++) { sprintf (buffer, "%d", ctx->ports[i]); sock = create_tcp_server (buffer); if (sock < 0) goto socket_create_err; err = listen(sock, SOMAXCONN); if (err != 0) goto socket_create_err; fdinfo.cat->name = "tcp-listen"; fdinfo.fd = sock; sprintf(fdinfo.url, "tcp:listen:127.0.0.1:%d", ctx->ports[i]); evt_core_add_fd(&(ctx->evts), &fdinfo); } return; socket_create_err: fprintf(stderr, "Unable to create a TCP socket\n"); exit(EXIT_FAILURE); } void donar_server(struct donar_server_ctx* ctx, struct algo_skel* algo, GPtrArray* exposed_ports, GPtrArray* remote_ports) { evt_core_init (&(ctx->evts)); evt_core_add_cat (&(ctx->evts), &(algo->on_tcp_co)); 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)); printf("--- Categories created\n"); for (uint16_t i = 0; i < PORT_SIZE ; i++) { ctx->ports[i] = 7500 + i; } create_onion_services (&(ctx->tos), &(ctx->tctl), ctx->ports, PORT_SIZE); printf("--- Onion services created\n"); init_tcp_servers(ctx); printf("--- TCP servers are listening\n"); g_ptr_array_foreach (remote_ports, (void(*)(void*, void*))init_udp_remote, &(ctx->evts)); printf("--- Remote ports are binded locally\n"); g_ptr_array_foreach (exposed_ports, (void(*)(void*, void*))init_udp_exposed, &(ctx->evts)); printf("--- Local UDP services are exposed\n"); evt_core_loop (&(ctx->evts)); destroy_resources (&(ctx->tos), &(ctx->tctl)); }