From 54374082f4bc3e58edf14dc3eece0939194404a8 Mon Sep 17 00:00:00 2001 From: Rockingcool Date: Fri, 24 Feb 2023 08:11:46 -0600 Subject: [PATCH] Started IPv6 support [WIP] --- main.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index 2d75c87..b950f07 100644 --- a/main.c +++ b/main.c @@ -12,6 +12,18 @@ void forward_data(int from_fd, int to_fd) { } } +int check_ip_ver(char* address) { + char buffer[16]; /* 16 chars - 128 bits - is enough to hold an ipv6 address */ + if (inet_pton(AF_INET,address,buffer) == 1) { + return 4; + } else if (inet_pton(AF_INET6,address,buffer) == 1) { + return 6; + } else { + return -1; + } +} + + int main(int argc,char* argv[]) { /* argv[1] = local address @@ -24,10 +36,17 @@ int main(int argc,char* argv[]) { char* remote_addr = argv[3]; int remote_port = strtol(argv[4],NULL,10); - int preferred_network = 4; + int preferred_local_network = check_ip_ver(local_addr); + int preferred_remote_network = check_ip_ver(remote_addr); + printf("Using %d for local\nUsing %d for remote\n",preferred_local_network,preferred_remote_network); + + if ((preferred_local_network == -1) && (preferred_remote_network == -1)) { + exit(-7); + } + char preferred_transport = 'T'; struct sockaddr addr_struct; - int server_sock = create_local(preferred_network,preferred_transport,local_addr,local_port,&addr_struct); + int server_sock = create_local(preferred_local_network,preferred_transport,local_addr,local_port,&addr_struct); int addrlen = sizeof(addr_struct); listen(server_sock,50); /* Arbitrary number, change later */ @@ -35,7 +54,7 @@ int main(int argc,char* argv[]) { printf("Listening on %s:%d\n",local_addr,local_port); while (1) { int from_client = accept(server_sock,&addr_struct,(socklen_t *)&addrlen); - int to_server = create_remote(preferred_network,preferred_transport,remote_addr,remote_port); + int to_server = create_remote(preferred_remote_network,preferred_transport,remote_addr,remote_port); printf("Connection established to %s:%d\n",remote_addr,remote_port); if (fork() == 0) {