#ifndef LIBLLARP_DNSD_HPP #define LIBLLARP_DNSD_HPP #include "dns.hpp" // question and dnsc #include "dnsc.hpp" #include // for sockaadr typedef ssize_t (*sendto_dns_hook_func)(void *sock, const struct sockaddr *from, const void *buffer, size_t length); struct dnsd_question_request { /// sock type void *user; // raw or llarp subsystem bool llarp; /// request id int id; /// question being asked dns_msg_question question; // request source socket struct sockaddr *from; sendto_dns_hook_func hook; // sendto hook tbh // maybe a reference to dnsd_context incase of multiple }; typedef bool (*intercept_query_hook)(struct dnsc_context *); struct dnsd_context { /// DNS daemon socket to listen on struct llarp_udp_io udp; dnsc_context client; /// custom data for intercept query hook void *user; /// hook function for intercepting dns requests intercept_query_hook intercept; }; void llarp_handle_dnsd_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *paddr, const void *buf, ssize_t sz); /// initialize dns subsystem and bind socket /// returns true on bind success otherwise returns false bool llarp_dnsd_init(struct dnsd_context *dnsd, struct llarp_ev_loop *netloop, const char *dnsd_ifname, uint16_t dnsd_port, const char *dnsc_hostname, uint16_t dnsc_port); bool llarp_dnsd_stop(struct dnsd_context *dnsd); #endif