diff --git a/src/chat/main/client.c b/src/chat/main/client.c index 60f8ffd..a45c3ac 100644 --- a/src/chat/main/client.c +++ b/src/chat/main/client.c @@ -24,6 +24,7 @@ along with this program. If not, see . #include #include #include +#include #include @@ -93,6 +94,51 @@ void invalid(char *type) fflush(stdout); } +struct sockaddr_in resolve_domain(char *domain, uint16_t port) +{ + //VARIABLES + struct sockaddr_in server_addr = { 0 }; + struct in_addr ipv4_buffer; + + //SET STUFF + server_addr.sin_family = AF_INET; //SET FAMILY + server_addr.sin_port = htons(port); //SET PORT + + domain[strcspn(domain, "\n")] = '\0'; //REMOVE NEWLINE + + //ALREADY USING IPv4 ADDRESS + if (inet_pton(AF_INET, domain, &ipv4_buffer) == 1) + { + server_addr.sin_addr = ipv4_buffer; + return server_addr; + } + + //DOMAIN-RESOLVE VARIABLES + struct addrinfo hints; + struct addrinfo *res = NULL; + struct sockaddr_in *ipv4; + + //SET addrinfo STUFF + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + //CERO, NADA + if (getaddrinfo(domain, NULL, &hints, &res) != 0) + { + why2_die("Error resolving domain!"); + } + + //USE FIRST IPv4 ADDRESS FOUND + ipv4 = (struct sockaddr_in *) res -> ai_addr; + server_addr.sin_addr = ipv4 -> sin_addr; + + //DEALLOCATION + freeaddrinfo(res); + + return server_addr; +} + int main(void) { signal(SIGINT, exit_client); //HANDLE ^C @@ -101,6 +147,7 @@ int main(void) why2_chat_init_client_config(); //CREATE client.toml CONFIGURATION why2_chat_init_keys(); //CREATE ECC KEY + //VARIABLES listen_socket = socket(AF_INET, SOCK_STREAM, 0); //CREATE AUTHORITY SOCKET char *line = NULL; void *return_line = NULL; @@ -110,16 +157,13 @@ int main(void) why2_bool ssqc = 0; char *cmd_arg = NULL; why2_bool *ca_success; - - //DEFINE CONNECTION PROPERTIES struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; //CA CONNECT line = why2_chat_client_config("authority_ip"); //GET ADDRESS OF CA - server_addr.sin_port = htons(WHY2_CHAT_AUTHORITY_PORT); //CA PORT - server_addr.sin_addr.s_addr = inet_addr(line); //IP ADDRESS OF CA + //GET server_addr + server_addr = resolve_domain(line, WHY2_CHAT_AUTHORITY_PORT); if (connect(listen_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) why2_die("Connecting to CA failed."); //CONNECT TO CA @@ -134,7 +178,6 @@ int main(void) //SERVER CONNECT listen_socket = socket(AF_INET, SOCK_STREAM, 0); //CREATE SERVER SOCKET - server_addr.sin_port = htons(WHY2_CHAT_SERVER_PORT); //GET IP printf("Welcome.\n\n"); @@ -159,7 +202,8 @@ int main(void) why2_toml_read_free(auto_connect); - server_addr.sin_addr.s_addr = inet_addr(line); + //GET server_addr + server_addr = resolve_domain(line, WHY2_CHAT_SERVER_PORT); //PRINT UNDERLINE for (unsigned long i = 0; i < strlen(line) + line_length; i++)