/* * File: util.c * Author: Andy Sayler * Modified: Shiv Mishra * Project: CSCI 3753 Programming Assignment 5 * Create Date: 2012/02/01 * Modify Date: 2012/02/01 * Modify Date: 2016/09/26 * Description: * This file contains declarations of utility functions for * Programming Assignment 5. * */ #include "util.h" int dnslookup(const char *hostname, char *firstIPstr, int maxSize) { /* Local vars */ struct addrinfo *headresult = NULL; struct addrinfo *result = NULL; struct sockaddr_in *ipv4sock = NULL; struct in_addr *ipv4addr = NULL; char ipv4str[INET_ADDRSTRLEN]; char ipstr[INET6_ADDRSTRLEN]; int addrError = 0; /* DEBUG: Print Hostname*/ #ifdef UTIL_DEBUG fprintf(stderr, "%s\n", hostname); #endif /* Lookup Hostname */ addrError = getaddrinfo(hostname, NULL, NULL, &headresult); if (addrError) { fprintf(stderr, "Error looking up Address: %s\n", gai_strerror(addrError)); return UTIL_FAILURE; } /* Loop Through result Linked List */ for (result = headresult; result != NULL; result = result->ai_next) { /* Extract IP Address and Convert to String */ if (result->ai_addr->sa_family == AF_INET) { /* IPv4 Address Handling */ ipv4sock = (struct sockaddr_in *)(result->ai_addr); ipv4addr = &(ipv4sock->sin_addr); if (!inet_ntop(result->ai_family, ipv4addr, ipv4str, sizeof(ipv4str))) { perror("Error Converting IP to String"); return UTIL_FAILURE; } #ifdef UTIL_DEBUG fprintf(stdout, "%s\n", ipv4str); #endif strncpy(ipstr, ipv4str, sizeof(ipstr)); ipstr[sizeof(ipstr) - 1] = '\0'; } else if (result->ai_addr->sa_family == AF_INET6) { /* IPv6 Handling */ #ifdef UTIL_DEBUG fprintf(stdout, "IPv6 Address: Not Handled\n"); #endif strncpy(ipstr, "UNHANDELED", sizeof(ipstr)); ipstr[sizeof(ipstr) - 1] = '\0'; } else { /* Unhandlded Protocol Handling */ #ifdef UTIL_DEBUG fprintf(stdout, "Unknown Protocol: Not Handled\n"); #endif strncpy(ipstr, "UNHANDELED", sizeof(ipstr)); ipstr[sizeof(ipstr) - 1] = '\0'; } /* Save First IP Address */ if (result == headresult) { strncpy(firstIPstr, ipstr, maxSize); firstIPstr[maxSize - 1] = '\0'; } } /* Cleanup */ freeaddrinfo(headresult); return UTIL_SUCCESS; }