Skip to content

Instantly share code, notes, and snippets.

@ZaWertun
Created August 11, 2021 11:59
Show Gist options
  • Save ZaWertun/20d0b2acf7d9d1fee029566de5c2d966 to your computer and use it in GitHub Desktop.
Save ZaWertun/20d0b2acf7d9d1fee029566de5c2d966 to your computer and use it in GitHub Desktop.
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#define __USE_GNU
#include <dlfcn.h>
/*
gcc -c -Wall -Wpedantic getaddrinfo.c -o getaddrinfo.o && gcc -ldl -fPIC getaddrinfo.c -shared -o getaddrinfo.so
*/
static void get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen)
{
switch(sa->sa_family) {
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen);
break;
case AF_INET6:
inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), s, maxlen);
break;
}
}
int (*real_getaddrinfo)(const char*, const char*, const struct addrinfo*, struct addrinfo**);
extern int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res)
{
*(void **)(&real_getaddrinfo) = dlsym(RTLD_NEXT, "getaddrinfo");
int ret = real_getaddrinfo(node, service, hints, res);
char* res_or_err = NULL;
if (ret == 0) {
char ip_str[INET6_ADDRSTRLEN] = "\0";
get_ip_str((*res)->ai_addr, ip_str, sizeof(ip_str));
res_or_err = ip_str;
} else {
res_or_err = strerror(ret);
}
fprintf(stdout, "$$$ getaddrinfo(\"%s\", \"%s\"): %d -> %s\n", node, service, ret, res_or_err);
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment