diff options
author | rofl0r <rofl0r@users.noreply.github.com> | 2021-12-12 18:59:34 +0300 |
---|---|---|
committer | rofl0r <rofl0r@users.noreply.github.com> | 2021-12-12 18:59:34 +0300 |
commit | b83e90dcaf338ec08b30cd018e3a3542886686d9 (patch) | |
tree | a3aaa0074ba77a42e7474a1353d9c11c8c743db4 | |
parent | 7de7dd0de1ff387a627620ac3482b4cd9b3fba95 (diff) |
update some testcases
-rw-r--r-- | tests/test_getaddrinfo.c | 35 | ||||
-rw-r--r-- | tests/test_getnameinfo.c | 12 |
2 files changed, 47 insertions, 0 deletions
diff --git a/tests/test_getaddrinfo.c b/tests/test_getaddrinfo.c index 88dc890..462406f 100644 --- a/tests/test_getaddrinfo.c +++ b/tests/test_getaddrinfo.c @@ -3,6 +3,8 @@ #include <netdb.h> #include <netinet/in.h> #include <sys/socket.h> +#include <assert.h> +#include <string.h> #ifndef NI_MAXHOST #define NI_MAXHOST 1025 @@ -43,9 +45,42 @@ static int doit(const char* host, const char* service) { return EXIT_SUCCESS; } +/* reproduce use of getaddrinfo as used by nmap 7.91's canonicalize_address */ +int canonicalize_address(struct sockaddr_storage *ss, struct sockaddr_storage *output) { + char canonical_ip_string[NI_MAXHOST]; + struct addrinfo *ai; + int rc; + /* Convert address to string. */ + rc = getnameinfo((struct sockaddr *) ss, sizeof(*ss), + canonical_ip_string, sizeof(canonical_ip_string), NULL, 0, NI_NUMERICHOST); + assert(rc == 0); + struct addrinfo hints = { + .ai_family = ss->ss_family, + .ai_socktype = SOCK_DGRAM, + .ai_flags = AI_NUMERICHOST, + }; + rc = getaddrinfo(canonical_ip_string, NULL, &hints, &ai); + if (rc != 0 || ai == NULL) + return -1; + assert(ai->ai_addrlen > 0 && ai->ai_addrlen <= (int) sizeof(*output)); + memcpy(output, ai->ai_addr, ai->ai_addrlen); + freeaddrinfo(ai); + return 0; +} + int main(void) { int ret; ret = doit("www.example.com", NULL); ret = doit("www.example.com", "80"); + struct sockaddr_storage o, ss = {.ss_family = PF_INET}; + struct sockaddr_in *v4 = &ss; + struct sockaddr_in6 *v6 = &ss; + memcpy(&v4->sin_addr, "\x7f\0\0\1", 4); + ret = canonicalize_address(&ss, &o); + assert (ret == 0); + ss.ss_family = PF_INET6; + memcpy(&v6->sin6_addr, "\0\0\0\0" "\0\0\0\0" "\0\0\0\0""\0\0\0\1", 16); + ret = canonicalize_address(&ss, &o); + assert (ret == 0); return ret; } diff --git a/tests/test_getnameinfo.c b/tests/test_getnameinfo.c index dbe061a..3348997 100644 --- a/tests/test_getnameinfo.c +++ b/tests/test_getnameinfo.c @@ -123,5 +123,17 @@ int main() { ASSERT(ret == 0); + b.sin6_port = 0; + b.sin6_scope_id = 0; + memcpy(&b.sin6_addr,"\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\1", 16); + + if ((ret = getnameinfo((void*)sb, sizeof b, hbuf, sizeof(hbuf), NULL, + 0, NI_NUMERICHOST)) == 0) + printf("host=%s\n", hbuf); + else + printf("%s\n", gai_strerror(ret)); + + ASSERT(ret == 0); + return 0; } |