#include #include #include #include #include #include #include "algo_skel.h" #include "donar_client.h" #include "donar_server.h" int main(int argc, char** argv) { setvbuf(stdout, NULL, _IONBF, 0); printf("~ Donar ~\n"); struct donar_params dp; donar_init_params (&dp); while ((dp.opt = getopt(argc, argv, "csh:e:r:o:a:b:h:")) != -1) { switch(dp.opt) { case 's': dp.is_server = 1; break; case 'e': dp.port = strdup(optarg); if (dp.port == NULL) goto terminate; g_ptr_array_add (dp.exposed_ports, dp.port); break; case 'r': dp.port = strdup(optarg); if (dp.port == NULL) goto terminate; g_ptr_array_add (dp.remote_ports, dp.port); break; case 'o': dp.onion_file = strdup(optarg); break; case 'c': dp.is_client = 1; break; case 'a': dp.algo = strdup(optarg); break; case 'h': dp.is_healing = 1; break; case 'b': dp.is_waiting_bootstrap = 1; break; default: goto in_error; } } if (!(dp.is_server ^ dp.is_client)) goto in_error; if (dp.algo == NULL) goto in_error; if (dp.is_server) { struct donar_server_ctx ctx; if (dp.exposed_ports->len < 1 && dp.remote_ports->len < 1) goto in_error; donar_server(&ctx, &dp); } else if (dp.is_client) { struct donar_client_ctx ctx; if ((dp.exposed_ports->len < 1 && dp.remote_ports->len < 1) || dp.onion_file == NULL) goto in_error; donar_client(&ctx, &dp); } goto terminate; in_error: dp.errored = 1; fprintf(stderr, "Usage as client : %s -c -a [-h] [-b] -o -e [-e ...]* -r [-r ...]*\n", argv[0]); fprintf(stderr, "Usage as server : %s -s -a [-h] [-b] -e [-e ...]* -r [-r ...]*\n\n", argv[0]); fprintf(stderr, "Passed parameters: client=%d, server=%d, algo=%s, exposed_ports=%d, remote_ports=%d, onion_file=%s\n", dp.is_client, dp.is_server, dp.algo, dp.exposed_ports->len, dp.remote_ports->len, dp.onion_file); terminate: if (dp.onion_file != NULL) free(dp.onion_file); if (dp.algo != NULL) free(dp.algo); g_ptr_array_free(dp.exposed_ports, TRUE); g_ptr_array_free(dp.remote_ports, TRUE); return dp.errored; }