diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 7dbcfec..3f298a5 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -72,7 +72,6 @@ jobs: test_src: [ "ato.c", "check/is_str.c", - "dns.c", "get_next_line.c", "hton.c", "htoi4.c", @@ -100,11 +99,11 @@ jobs: run: git submodule update --remote --recursive - name: 🔧 Launch, with sudo, ${{ matrix.test_src }} - if: contains(fromJson('["dns.c"]'), matrix.test_src) + if: contains(fromJson('["htoi4.c", "i4toh.c"]'), matrix.test_src) run: sudo make CI_TARGET=${{ matrix.test_src }} ci-run - name: 🔧 Launch ${{ matrix.test_src }} - if: ${{ !contains(fromJson('["dns.c"]'), matrix.test_src) }} + if: ${{ !contains(fromJson('["htoi4.c", "i4toh.c"]'), matrix.test_src) }} run: make CI_TARGET=${{ matrix.test_src }} ci-run norminette: diff --git a/inc/libft_network/ipv4.h b/inc/libft_network/ipv4.h index da738e4..e254bfb 100644 --- a/inc/libft_network/ipv4.h +++ b/inc/libft_network/ipv4.h @@ -6,7 +6,7 @@ /* By: brda-sil identification = ft_htons(421); pkt_dns->recursion_desired = 1; pkt_dns->question_count = ft_htons(1); - ft_pkt_dnsq_fill(&pkt, domain, DNS_TYPE_A, DNS_CLASS_IN); + ft_pkt_dnsq_fill_a(&pkt, domain, DNS_CLASS_IN); pkt_ip->total_len = ft_htons(PACK_LEN_IP + PACK_LEN_UDP + PACK_LEN_DNS + ft_pkt_dnsq_len(pkt)); pkt_udp->length = ft_htons(PACK_LEN_UDP + PACK_LEN_DNS + ft_pkt_dnsq_len(pkt)); return (pkt); diff --git a/src/network/ipv4/htoi4_socket/recv_packet.c b/src/network/ipv4/htoi4_socket/recv_packet.c index 4d8a908..8b7505e 100644 --- a/src/network/ipv4/htoi4_socket/recv_packet.c +++ b/src/network/ipv4/htoi4_socket/recv_packet.c @@ -6,7 +6,7 @@ /* By: brda-sil identification = ft_htons(420); + pkt_ip->fragment_off = ft_htons(ft_pkt_fragment_offset(IPHDR_F_DONT_FRAG, 0)); + pkt_ip->ttl = DNS_TTL; + pkt_ip->protocol = IPPROTO_UDP; + pkt_ip->dst_addr = ft_htonl(DNS_ADDR); + pkt_udp = ft_pkt_get_udp(&pkt); + pkt_udp->src_port = ft_htons(DNS_SRC_PORT); + pkt_udp->dst_port = ft_htons(DNS_DST_PORT); + pkt_dns = ft_pkt_get_dns(&pkt); + pkt_dns->identification = ft_htons(421); + pkt_dns->recursion_desired = 1; + pkt_dns->question_count = ft_htons(1); + ft_pkt_dnsq_fill_ptr(&pkt, ip, DNS_CLASS_IN); + pkt_ip->total_len = ft_htons(PACK_LEN_IP + PACK_LEN_UDP + PACK_LEN_DNS + ft_pkt_dnsq_len(pkt)); + pkt_udp->length = ft_htons(PACK_LEN_UDP + PACK_LEN_DNS + ft_pkt_dnsq_len(pkt)); + return (pkt); +} diff --git a/src/network/ipv4/i4toh_socket/init_socket.c b/src/network/ipv4/i4toh_socket/init_socket.c new file mode 100644 index 0000000..9810051 --- /dev/null +++ b/src/network/ipv4/i4toh_socket/init_socket.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_socket.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: brda-sil src_port); + dst_port = ft_htons(pack_udp->dst_port); + if (dst_port == DNS_SRC_PORT && src_port == DNS_DST_PORT) + { + return (1); + } + return (0); +} + +static t_bool recv_reply(int sock, t_packet *pong_pkt) +{ + long ret; + + ret = recvfrom( + sock, // SOCKET + pong_pkt->data, // BUFFER + PACK_MAX_LEN, // LEN + 0, // FLAG + FT_NULL, // SOCK ADDR FROM + 0 // SOCK ADDR FROM LEN + ); + return (ret == -1); +} + +char *ft_i4toh_recv_packet(int sock) +{ + t_packet pkt; + + while (TRUE) + { + pkt = ft_pkt_get(); + if (recv_reply(sock, &pkt)) + { + return 0; + } + if (check_reply(&pkt)) + break; + } + return (ft_dns_get_ptr_record(&pkt)); +} diff --git a/src/network/ipv4/i4toh_socket/send_packet.c b/src/network/ipv4/i4toh_socket/send_packet.c new file mode 100644 index 0000000..d169c93 --- /dev/null +++ b/src/network/ipv4/i4toh_socket/send_packet.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* send_packet.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: brda-sil > 8; - dns_data[len_fmt_domain + 2] = type & 0x00ff; + dns_data[len_fmt_domain + 1] = (DNS_TYPE_A & 0xff00) >> 8; + dns_data[len_fmt_domain + 2] = DNS_TYPE_A & 0x00ff; + dns_data[len_fmt_domain + 3] = (class & 0xff00) >> 8; + dns_data[len_fmt_domain + 4] = class & 0x00ff; +} + +void ft_pkt_dnsq_fill_ptr( + t_packet *pack, + t_int4 ip, + t_uint16 class + ) +{ + char *domain; + unsigned char *dns_data; + char *fmt_domain; + t_size len_fmt_domain; + + dns_data = ft_pkt_get_dns_data(pack); + domain = ft_dns_ip_to_domain(ip); + fmt_domain = ft_dns_get_domain_fmt(domain); + free(domain); + len_fmt_domain = ft_strlen(fmt_domain); + ft_memcpy(dns_data, fmt_domain, len_fmt_domain); + dns_data[len_fmt_domain] = 0; + free(fmt_domain); + dns_data[len_fmt_domain + 1] = (DNS_TYPE_PTR & 0xff00) >> 8; + dns_data[len_fmt_domain + 2] = DNS_TYPE_PTR & 0x00ff; dns_data[len_fmt_domain + 3] = (class & 0xff00) >> 8; dns_data[len_fmt_domain + 4] = class & 0x00ff; } diff --git a/src/network/ipv4/htoi4_socket/get_a_record.c b/src/network/packet/dns/get_a_record.c similarity index 92% rename from src/network/ipv4/htoi4_socket/get_a_record.c rename to src/network/packet/dns/get_a_record.c index dfba441..b48b2d3 100644 --- a/src/network/ipv4/htoi4_socket/get_a_record.c +++ b/src/network/packet/dns/get_a_record.c @@ -6,13 +6,13 @@ /* By: brda-sil ", domain); - ft_putip_fd(ip, 1); - ft_putchar_fd('\n', 1); - return (0); -} - -int test_not_working_domain(char *domain) -{ - t_int4 ip; - - ip = ft_htoi4_socket(domain); - if (ip) - return (1); - ft_printf("%-30s -> NOT WORKING\n", domain); - return (0); -} - -int ci_test(void) -{ - int ret; - - ret = 0; - ret += test_domain("www.google.com"); - ret += test_domain("google.com"); - ret += test_not_working_domain("google"); // SOA response - ret += test_not_working_domain("google."); // SOA response - ret += test_not_working_domain("google.."); // SOA response - ret += test_not_working_domain("an.unknown.domain.name"); - return (ret); -} - -int interactive(void) -{ - ft_perr("parsing", 2); - return (0); -} - -int main(void) -{ - if (CI_TEST) - return (ci_test()); - else - return (interactive()); - return (0); -} diff --git a/test/src/htoi4.c b/test/src/htoi4.c index 8e7f683..7dd9dbc 100644 --- a/test/src/htoi4.c +++ b/test/src/htoi4.c @@ -5,8 +5,8 @@ /* +:+ +:+ +:+ */ /* By: brda-sil ", fqdn, service); - ft_putip_fd(retv, 1); + ip = ft_htoi4_socket(domain); + if (!ip) + return (1); + ft_printf("%-30s -> ", domain); + ft_putip_fd(ip, 1); ft_putchar_fd('\n', 1); + return (0); } -int ci_test(void) +int test_not_working_domain(char *domain) { - test_htoi4("kernel.org", FT_NULL); + t_int4 ip; + + ip = ft_htoi4_socket(domain); + if (ip) + return (1); + ft_printf("%-30s -> NOT WORKING\n", domain); return (0); } +int ci_test(void) +{ + int ret; + + ret = 0; + ret += test_domain("www.google.com"); + ret += test_domain("google.com"); + ret += test_not_working_domain("google"); // SOA response + ret += test_not_working_domain("google."); // SOA response + ret += test_not_working_domain("google.."); // SOA response + ret += test_not_working_domain("an.unknown.domain.name"); + return (ret); +} + int interactive(void) { ft_perr("parsing", 2); @@ -46,4 +68,3 @@ int main(void) return (interactive()); return (0); } - diff --git a/test/src/i4toh.c b/test/src/i4toh.c new file mode 100644 index 0000000..9e60e80 --- /dev/null +++ b/test/src/i4toh.c @@ -0,0 +1,114 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* i4toh.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: brda-sil //for inet_pton() +#include // for NI_MAXHOST, getnameinfo() and gai_strerror() + +#ifndef CI_TEST +# define CI_TEST FALSE +#endif + +# define TARGET_IP 0xacd914ce + +void test_getnameinfo(char *ip); + +int test_i4toh(t_int4 ip) +{ + char *name; + char *ip_str; + + ip_str = ft_getip_str(ft_htonl(ip)); + name = ft_i4toh_socket(ip); + // test_getnameinfo(ip_str); + free(ip_str); + ft_putip_fd(ip, 1); + ft_putstr_fd(" -> ", 1); + if (!name) + { + ft_putstr_fd("error\n", 1); + return (1); + } + ft_putstr_fd(name, 1); + ft_putstr_fd("\n", 1); + free(name); + return (0); +} + +int ci_test(void) +{ + int ret; + + ret = 0; + ret += test_i4toh(0xd83ad6ae); + ret += test_i4toh(0x4d9aed79); + ret += test_i4toh(0xd5f50030); + // ret += test_i4toh(0xc0a80001); // not working for local ip + // ret += test_i4toh(0xc0a8000c); + return (ret); +} + +int interactive(void) +{ + ft_perr("parsing", 2); + return (0); +} + +int main(void) +{ + if (CI_TEST) + return (ci_test()); + else + return (interactive()); + return (0); +} + + +#include +#include +#include +#include + +static int convert4(struct sockaddr_in *sa, const char *name) +{ + return inet_pton(sa->sin_family = AF_INET, name, &sa->sin_addr); +} + +static int convert6(struct sockaddr_in6 *sa, const char *name) +{ + return inet_pton(sa->sin6_family = AF_INET6, name, &sa->sin6_addr); +} + + +void test_getnameinfo(char *ip) +{ + union { + struct sockaddr sa; + struct sockaddr_in s4; + struct sockaddr_in6 s6; + struct sockaddr_storage ss; + } addr; + + if (convert4(&addr.s4, ip) != 1 && convert6(&addr.s6, ip) != 1) { + ft_printf("%s: not a valid IP address.\n", ip); + return ; + } + + char node[NI_MAXHOST]; + int res = getnameinfo(&addr.sa, sizeof addr, node, sizeof node, NULL, 0, NI_NAMEREQD); + if (res) { + ft_printf("%s: %s\n", ip, gai_strerror(res)); + return ; + } + ft_printf("REAL: %s\n", node); + return ; +}