some dns resolver code
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -166,7 +166,19 @@ am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES =
|
||||
depcomp = $(SHELL) $(top_srcdir)/ac/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__maybe_remake_depfiles = depfiles
|
||||
am__depfiles_remade = ./$(DEPDIR)/libmio_la-dns.Plo \
|
||||
./$(DEPDIR)/libmio_la-err.Plo ./$(DEPDIR)/libmio_la-fmt.Plo \
|
||||
./$(DEPDIR)/libmio_la-mio.Plo ./$(DEPDIR)/libmio_la-pro.Plo \
|
||||
./$(DEPDIR)/libmio_la-sck-addr.Plo \
|
||||
./$(DEPDIR)/libmio_la-sck.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys-ass.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys-err.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys-log.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys-mux.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys-tim.Plo \
|
||||
./$(DEPDIR)/libmio_la-sys.Plo ./$(DEPDIR)/libmio_la-tmr.Plo \
|
||||
./$(DEPDIR)/libmio_la-utf8.Plo ./$(DEPDIR)/libmio_la-utl.Plo
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
@ -356,7 +368,6 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -441,8 +452,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
@ -513,22 +524,28 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-dns.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-err.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-fmt.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-pro.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sck-addr.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sck.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-ass.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-err.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-log.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-mux.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-tim.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-tmr.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utf8.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-dns.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-err.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-fmt.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-pro.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sck-addr.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sck.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-ass.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-err.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-log.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-mux.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-tim.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-tmr.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utf8.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utl.Plo@am__quote@ # am--include-marker
|
||||
|
||||
$(am__depfiles_remade):
|
||||
@$(MKDIR_P) $(@D)
|
||||
@echo '# dummy' >$@-t && $(am__mv) $@-t $@
|
||||
|
||||
am--depfiles: $(am__depfiles_remade)
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||
@ -745,7 +762,10 @@ cscopelist-am: $(am__tagged_files)
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
@ -818,7 +838,22 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f ./$(DEPDIR)/libmio_la-dns.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-err.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-fmt.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-mio.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-pro.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sck-addr.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sck.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-ass.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-err.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-log.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-mux.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-tim.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-tmr.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-utf8.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-utl.Plo
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-hdr distclean-tags
|
||||
@ -865,7 +900,22 @@ install-ps-am:
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f ./$(DEPDIR)/libmio_la-dns.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-err.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-fmt.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-mio.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-pro.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sck-addr.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sck.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-ass.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-err.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-log.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-mux.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys-tim.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-sys.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-tmr.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-utf8.Plo
|
||||
-rm -f ./$(DEPDIR)/libmio_la-utl.Plo
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
@ -887,9 +937,9 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
|
||||
$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
|
||||
.MAKE: all install-am install-data-am install-strip uninstall-am
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
||||
clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
|
||||
ctags ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-hdr distclean-libtool distclean-tags distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-data-hook install-dvi \
|
||||
|
241
mio/lib/dns.c
241
mio/lib/dns.c
@ -28,21 +28,15 @@
|
||||
#include <mio-sck.h>
|
||||
#include "mio-prv.h"
|
||||
|
||||
typedef struct mio_dns_t mio_dns_t;
|
||||
typedef struct mio_svc_dns_t mio_svc_dns_t;
|
||||
|
||||
struct mio_dns_t
|
||||
struct mio_svc_dns_t
|
||||
{
|
||||
MIO_SVC_HEADERS;
|
||||
/*MIO_DNS_SVC_HEADERS;*/
|
||||
};
|
||||
|
||||
struct mio_dnss_t
|
||||
{
|
||||
MIO_SVC_HEADERS;
|
||||
/*MIO_DNS_SVC_HEADERS;*/
|
||||
};
|
||||
|
||||
struct mio_dnsc_t
|
||||
struct mio_svc_dnc_t
|
||||
{
|
||||
MIO_SVC_HEADERS;
|
||||
/*MIO_DNS_SVC_HEADERS;*/
|
||||
@ -53,17 +47,17 @@ struct mio_dnsc_t
|
||||
mio_dns_msg_t* pending_req;
|
||||
};
|
||||
|
||||
struct dnsc_sck_xtn_t
|
||||
struct dnc_sck_xtn_t
|
||||
{
|
||||
mio_dnsc_t* dnsc;
|
||||
mio_svc_dnc_t* dnc;
|
||||
};
|
||||
typedef struct dnsc_sck_xtn_t dnsc_sck_xtn_t;
|
||||
typedef struct dnc_sck_xtn_t dnc_sck_xtn_t;
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
#define DN_AT_END(ptr) (ptr[0] == '\0' || (ptr[0] == '.' && ptr[1] == '\0'))
|
||||
|
||||
static mio_oow_t to_dn (mio_dns_t* dns, const mio_bch_t* str, mio_uint8_t* buf, mio_oow_t bufsz)
|
||||
static mio_oow_t to_dn (mio_svc_dns_t* dns, const mio_bch_t* str, mio_uint8_t* buf, mio_oow_t bufsz)
|
||||
{
|
||||
mio_uint8_t* bp = buf, * be = buf + bufsz;
|
||||
|
||||
@ -133,18 +127,18 @@ static mio_oow_t dn_length (mio_uint8_t* ptr, mio_oow_t len)
|
||||
# define dns_msg_to_pkt(msg) ((mio_dns_pkt_t*)((mio_dns_msg_t*)(msg) + 1))
|
||||
#endif
|
||||
|
||||
static void release_dns_msg (mio_dnsc_t* dnsc, mio_dns_msg_t* msg)
|
||||
static void release_dns_msg (mio_svc_dnc_t* dnc, mio_dns_msg_t* msg)
|
||||
{
|
||||
mio_t* mio = dnsc->mio;
|
||||
mio_t* mio = dnc->mio;
|
||||
|
||||
MIO_DEBUG1 (mio, "releasing dns msg %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->id));
|
||||
|
||||
if (msg == dnsc->pending_req || msg->next || msg->prev)
|
||||
if (msg == dnc->pending_req || msg->next || msg->prev)
|
||||
{
|
||||
/* it's chained in the pending request. unchain it */
|
||||
if (msg->next) msg->next->prev = msg->prev;
|
||||
if (msg->prev) msg->prev->next = msg->next;
|
||||
else dnsc->pending_req = msg->next;
|
||||
else dnc->pending_req = msg->next;
|
||||
}
|
||||
|
||||
/* TODO: add it to the free msg list instead of just freeing it. */
|
||||
@ -157,7 +151,7 @@ MIO_DEBUG1 (mio, "releasing dns msg %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->
|
||||
mio_freemem (mio, msg);
|
||||
}
|
||||
|
||||
static mio_oow_t encode_rdata_in_dns_msg (mio_dnsc_t* dnsc, const mio_dns_brr_t* rr, mio_dns_rrtr_t* rrtr)
|
||||
static mio_oow_t encode_rdata_in_dns_msg (mio_svc_dnc_t* dnc, const mio_dns_brr_t* rr, mio_dns_rrtr_t* rrtr)
|
||||
{
|
||||
switch (rr->qtype)
|
||||
{
|
||||
@ -213,9 +207,9 @@ static mio_oow_t encode_rdata_in_dns_msg (mio_dnsc_t* dnsc, const mio_dns_brr_t*
|
||||
return rr->dlen;
|
||||
}
|
||||
|
||||
static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_dns_bedns_t* edns)
|
||||
static mio_dns_msg_t* build_dns_msg (mio_svc_dnc_t* dnc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_dns_bedns_t* edns, void* ctx)
|
||||
{
|
||||
mio_t* mio = dnsc->mio;
|
||||
mio_t* mio = dnc->mio;
|
||||
mio_oow_t dnlen, msgbufsz, i;
|
||||
mio_dns_msg_t* msg;
|
||||
mio_dns_pkt_t* pkt;
|
||||
@ -279,18 +273,19 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
|
||||
|
||||
msg->buflen = msgbufsz; /* record the buffer size in the preamble */
|
||||
msg->rtmridx = MIO_TMRIDX_INVALID;
|
||||
msg->dev = (mio_dev_t*)dnsc->sck;
|
||||
msg->dev = (mio_dev_t*)dnc->sck;
|
||||
msg->ctx = ctx;
|
||||
|
||||
pkt = dns_msg_to_pkt(msg); /* actual message begins after the size word */
|
||||
pkt = dns_msg_to_pkt(msg); /* actual packet data begins after the message structure */
|
||||
|
||||
dn = (mio_uint8_t*)(pkt + 1);
|
||||
dn = (mio_uint8_t*)(pkt + 1); /* skip the dns packet header */
|
||||
for (i = 0; i < qr_count; i++)
|
||||
{
|
||||
/* dnlen includes the ending <zero> */
|
||||
dnlen = to_dn((mio_dns_t*)dnsc, qr[i].qname, dn, mio_count_bcstr(qr[i].qname) + 2);
|
||||
dnlen = to_dn((mio_svc_dns_t*)dnc, qr[i].qname, dn, mio_count_bcstr(qr[i].qname) + 2);
|
||||
if (dnlen <= 0)
|
||||
{
|
||||
release_dns_msg (dnsc, msg);
|
||||
release_dns_msg (dnc, msg);
|
||||
mio_seterrbfmt (mio, MIO_EINVAL, "invalid domain name - %hs", qr[i].qname);
|
||||
return MIO_NULL;
|
||||
}
|
||||
@ -310,10 +305,10 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
|
||||
{
|
||||
mio_oow_t rdata_len;
|
||||
|
||||
dnlen = to_dn((mio_dns_t*)dnsc, rr[i].qname, dn, mio_count_bcstr(rr[i].qname) + 2);
|
||||
dnlen = to_dn((mio_svc_dns_t*)dnc, rr[i].qname, dn, mio_count_bcstr(rr[i].qname) + 2);
|
||||
if (dnlen <= 0)
|
||||
{
|
||||
release_dns_msg (dnsc, msg);
|
||||
release_dns_msg (dnc, msg);
|
||||
mio_seterrbfmt (mio, MIO_EINVAL, "invalid domain name - %hs", rr[i].qname);
|
||||
return MIO_NULL;
|
||||
}
|
||||
@ -323,7 +318,7 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
|
||||
rrtr->qclass = mio_hton16(rr[i].qclass);
|
||||
rrtr->ttl = mio_hton32(rr[i].ttl);
|
||||
|
||||
rdata_len = encode_rdata_in_dns_msg(dnsc, &rr[i], rrtr);
|
||||
rdata_len = encode_rdata_in_dns_msg(dnc, &rr[i], rrtr);
|
||||
dn = (mio_uint8_t*)(rrtr + 1) + rdata_len;
|
||||
|
||||
match_count++;
|
||||
@ -368,8 +363,8 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
|
||||
|
||||
if (bdns->id < 0)
|
||||
{
|
||||
pkt->id = mio_hton16(dnsc->seq);
|
||||
dnsc->seq++;
|
||||
pkt->id = mio_hton16(dnc->seq);
|
||||
dnc->seq++;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -392,10 +387,10 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
|
||||
return msg;
|
||||
}
|
||||
|
||||
static int parse_dns_pkt (mio_dnsc_t* dnsc, mio_dns_pkt_t* pkt, mio_oow_t len)
|
||||
static int parse_dns_pkt (mio_svc_dnc_t* dnc, mio_dns_pkt_t* pkt, mio_oow_t len)
|
||||
{
|
||||
|
||||
mio_t* mio = dnsc->mio;
|
||||
mio_t* mio = dnc->mio;
|
||||
mio_dns_bdns_t* bdns;
|
||||
mio_uint16_t i, rrc;
|
||||
mio_uint8_t* dn;
|
||||
@ -501,10 +496,10 @@ return 0;
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static int dnsc_on_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen, const mio_sckaddr_t* srcaddr)
|
||||
static int dnc_on_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen, const mio_sckaddr_t* srcaddr)
|
||||
{
|
||||
mio_t* mio = dev->mio;
|
||||
mio_dnsc_t* dnsc = ((dnsc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnsc;
|
||||
mio_svc_dnc_t* dnc = ((dnc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnc;
|
||||
mio_dns_pkt_t* pkt;
|
||||
mio_dns_msg_t* reqmsg;
|
||||
mio_uint16_t id;
|
||||
@ -523,10 +518,10 @@ static int dnsc_on_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen,
|
||||
|
||||
id = mio_ntoh16(pkt->id);
|
||||
|
||||
/* if id doesn't matche one of the pending requests sent, drop */
|
||||
/* if id doesn't match one of the pending requests sent, drop it */
|
||||
|
||||
/* TODO: improve performance */
|
||||
reqmsg = dnsc->pending_req;
|
||||
reqmsg = dnc->pending_req;
|
||||
while (reqmsg)
|
||||
{
|
||||
mio_dns_pkt_t* reqpkt = dns_msg_to_pkt(reqmsg);
|
||||
@ -534,9 +529,12 @@ static int dnsc_on_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen,
|
||||
{
|
||||
MIO_DEBUG1 (mio, "received dns response...id %d\n", id);
|
||||
/* TODO: parse the response... perform actual work. pass the result back?? */
|
||||
parse_dns_pkt (dnsc, pkt, dlen);
|
||||
/*parse_dns_pkt (dnc, pkt, dlen);*/
|
||||
|
||||
release_dns_msg (dnsc, reqmsg);
|
||||
if (MIO_LIKELY(reqmsg->ctx))
|
||||
((mio_svc_dnc_on_reply_t)reqmsg->ctx) (dnc, reqmsg, MIO_ENOERR, data, dlen);
|
||||
|
||||
release_dns_msg (dnc, reqmsg);
|
||||
return 0;
|
||||
}
|
||||
reqmsg = reqmsg->next;
|
||||
@ -547,25 +545,28 @@ MIO_DEBUG1 (mio, "received dns response...id %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dnsc_on_read_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job)
|
||||
static void dnc_on_read_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job)
|
||||
{
|
||||
mio_dns_msg_t* msg = (mio_dns_msg_t*)job->ctx;
|
||||
mio_dev_sck_t* dev = (mio_dev_sck_t*)msg->dev;
|
||||
mio_dnsc_t* dnsc = ((dnsc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnsc;
|
||||
mio_dns_msg_t* reqmsg = (mio_dns_msg_t*)job->ctx;
|
||||
mio_dev_sck_t* dev = (mio_dev_sck_t*)reqmsg->dev;
|
||||
mio_svc_dnc_t* dnc = ((dnc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnc;
|
||||
|
||||
MIO_ASSERT (mio, msg->rtmridx == MIO_TMRIDX_INVALID);
|
||||
MIO_ASSERT (mio, reqmsg->rtmridx == MIO_TMRIDX_INVALID);
|
||||
|
||||
MIO_DEBUG0 (mio, "unable to receive dns response in time...\n");
|
||||
release_dns_msg (dnsc, msg);
|
||||
|
||||
if (MIO_LIKELY(reqmsg->ctx))
|
||||
((mio_svc_dnc_on_reply_t)reqmsg->ctx) (dnc, reqmsg, MIO_ETMOUT, MIO_NULL, 0);
|
||||
|
||||
release_dns_msg (dnc, reqmsg);
|
||||
}
|
||||
|
||||
|
||||
static int dnsc_on_write (mio_dev_sck_t* dev, mio_iolen_t wrlen, void* wrctx, const mio_sckaddr_t* dstaddr)
|
||||
static int dnc_on_write (mio_dev_sck_t* dev, mio_iolen_t wrlen, void* wrctx, const mio_sckaddr_t* dstaddr)
|
||||
{
|
||||
mio_t* mio = dev->mio;
|
||||
mio_dns_msg_t* msg = (mio_dns_msg_t*)wrctx;
|
||||
mio_dnsc_t* dnsc = ((dnsc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnsc;
|
||||
|
||||
mio_svc_dnc_t* dnc = ((dnc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnc;
|
||||
|
||||
MIO_DEBUG1 (mio, "sent dns message %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->id));
|
||||
|
||||
@ -577,7 +578,7 @@ MIO_DEBUG1 (mio, "sent dns message %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->i
|
||||
mio_tmrjob_t tmrjob;
|
||||
mio_ntime_t tmout;
|
||||
|
||||
/* TODO: make this configurable. or accept dnsc->config.read_timeout... */
|
||||
/* TODO: make this configurable. or accept dnc->config.read_timeout... */
|
||||
tmout.sec = 3;
|
||||
tmout.nsec = 0;
|
||||
|
||||
@ -585,140 +586,166 @@ MIO_DEBUG1 (mio, "sent dns message %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->i
|
||||
tmrjob.ctx = msg;
|
||||
mio_gettime (mio, &tmrjob.when);
|
||||
MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &tmout);
|
||||
tmrjob.handler = dnsc_on_read_timeout;
|
||||
tmrjob.handler = dnc_on_read_timeout;
|
||||
tmrjob.idxptr = &msg->rtmridx;
|
||||
msg->rtmridx = mio_instmrjob(mio, &tmrjob);
|
||||
if (msg->rtmridx == MIO_TMRIDX_INVALID)
|
||||
{
|
||||
if (MIO_LIKELY(msg->ctx))
|
||||
((mio_svc_dnc_on_reply_t)msg->ctx) (dnc, msg, mio_geterrnum(mio), MIO_NULL, 0);
|
||||
release_dns_msg (dnc, msg);
|
||||
|
||||
MIO_DEBUG0 (mio, "unable to schedule timeout...\n");
|
||||
release_dns_msg (dnsc, msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TODO: improve performance. hashing by id? */
|
||||
if (dnsc->pending_req)
|
||||
|
||||
/* chain it to the peing request list */
|
||||
if (dnc->pending_req)
|
||||
{
|
||||
dnsc->pending_req->prev = msg;
|
||||
msg->next = dnsc->pending_req;
|
||||
dnc->pending_req->prev = msg;
|
||||
msg->next = dnc->pending_req;
|
||||
}
|
||||
dnsc->pending_req = msg;
|
||||
dnc->pending_req = msg;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* sent an answer - we don't need this any more */
|
||||
/* also we don't call the on_reply callback stored in msg->ctx as this is not a reply context */
|
||||
release_dns_msg (dnc, msg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dnsc_on_connect (mio_dev_sck_t* dev)
|
||||
static void dnc_on_connect (mio_dev_sck_t* dev)
|
||||
{
|
||||
}
|
||||
|
||||
static void dnsc_on_disconnect (mio_dev_sck_t* dev)
|
||||
static void dnc_on_disconnect (mio_dev_sck_t* dev)
|
||||
{
|
||||
}
|
||||
|
||||
mio_dnsc_t* mio_dnsc_start (mio_t* mio)
|
||||
mio_svc_dnc_t* mio_svc_dnc_start (mio_t* mio)
|
||||
{
|
||||
mio_dnsc_t* dnsc = MIO_NULL;
|
||||
mio_svc_dnc_t* dnc = MIO_NULL;
|
||||
mio_dev_sck_make_t mkinfo;
|
||||
dnsc_sck_xtn_t* xtn;
|
||||
dnc_sck_xtn_t* xtn;
|
||||
|
||||
dnsc = (mio_dnsc_t*)mio_callocmem(mio, MIO_SIZEOF(*dnsc));
|
||||
if (!dnsc) goto oops;
|
||||
dnc = (mio_svc_dnc_t*)mio_callocmem(mio, MIO_SIZEOF(*dnc));
|
||||
if (!dnc) goto oops;
|
||||
|
||||
dnsc->mio = mio;
|
||||
dnsc->stop = mio_dnsc_stop;
|
||||
dnc->mio = mio;
|
||||
dnc->stop = mio_svc_dnc_stop;
|
||||
|
||||
MIO_MEMSET (&mkinfo, 0, MIO_SIZEOF(mkinfo));
|
||||
mkinfo.type = MIO_DEV_SCK_UDP4; /* or UDP6 depending on the binding address */
|
||||
mkinfo.on_write = dnsc_on_write;
|
||||
mkinfo.on_read = dnsc_on_read;
|
||||
mkinfo.on_connect = dnsc_on_connect;
|
||||
mkinfo.on_disconnect = dnsc_on_disconnect;
|
||||
dnsc->sck = mio_dev_sck_make(mio, MIO_SIZEOF(*xtn), &mkinfo);
|
||||
if (!dnsc->sck) goto oops;
|
||||
mkinfo.on_write = dnc_on_write;
|
||||
mkinfo.on_read = dnc_on_read;
|
||||
mkinfo.on_connect = dnc_on_connect;
|
||||
mkinfo.on_disconnect = dnc_on_disconnect;
|
||||
dnc->sck = mio_dev_sck_make(mio, MIO_SIZEOF(*xtn), &mkinfo);
|
||||
if (!dnc->sck) goto oops;
|
||||
|
||||
xtn = (dnsc_sck_xtn_t*)mio_dev_sck_getxtn(dnsc->sck);
|
||||
xtn->dnsc = dnsc;
|
||||
xtn = (dnc_sck_xtn_t*)mio_dev_sck_getxtn(dnc->sck);
|
||||
xtn->dnc = dnc;
|
||||
|
||||
/* TODO: bind if requested */
|
||||
/*if (mio_dev_sck_bind(dev, ....) <= -1) goto oops;*/
|
||||
{
|
||||
mio_uint32_t ia = 0x01010101; /* 1.1.1.1 */
|
||||
mio_sckaddr_initforip4 (&dnsc->serveraddr, 53, (mio_ip4addr_t*)&ia);
|
||||
mio_uint32_t ia = 0x01010101; /* 1.1.1.1 */ /* TODO: accept as parameter ... */
|
||||
mio_sckaddr_initforip4 (&dnc->serveraddr, 53, (mio_ip4addr_t*)&ia);
|
||||
}
|
||||
|
||||
MIO_SVC_REGISTER (mio, (mio_svc_t*)dnsc);
|
||||
return dnsc;
|
||||
MIO_SVC_REGISTER (mio, (mio_svc_t*)dnc);
|
||||
return dnc;
|
||||
|
||||
oops:
|
||||
if (dnsc)
|
||||
if (dnc)
|
||||
{
|
||||
if (dnsc->sck) mio_dev_sck_kill (dnsc->sck);
|
||||
mio_freemem (mio, dnsc);
|
||||
if (dnc->sck) mio_dev_sck_kill (dnc->sck);
|
||||
mio_freemem (mio, dnc);
|
||||
}
|
||||
return MIO_NULL;
|
||||
}
|
||||
|
||||
void mio_dnsc_stop (mio_dnsc_t* dnsc)
|
||||
void mio_svc_dnc_stop (mio_svc_dnc_t* dnc)
|
||||
{
|
||||
mio_t* mio = dnsc->mio;
|
||||
if (dnsc->sck) mio_dev_sck_kill (dnsc->sck);
|
||||
MIO_SVC_UNREGISTER (mio, dnsc);
|
||||
while (dnsc->pending_req) release_dns_msg (dnsc, dnsc->pending_req);
|
||||
mio_freemem (mio, dnsc);
|
||||
mio_t* mio = dnc->mio;
|
||||
if (dnc->sck) mio_dev_sck_kill (dnc->sck);
|
||||
MIO_SVC_UNREGISTER (mio, dnc);
|
||||
while (dnc->pending_req) release_dns_msg (dnc, dnc->pending_req);
|
||||
mio_freemem (mio, dnc);
|
||||
}
|
||||
|
||||
|
||||
int mio_dnsc_sendmsg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_dns_bedns_t* edns)
|
||||
int mio_svc_dnc_sendmsg (mio_svc_dnc_t* dnc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_dns_bedns_t* edns, mio_svc_dnc_on_reply_t on_reply)
|
||||
{
|
||||
/* send a request or a response */
|
||||
mio_dns_msg_t* msg;
|
||||
|
||||
msg = build_dns_msg(dnsc, bdns, qr, qr_count, rr, rr_count, edns);
|
||||
msg = build_dns_msg(dnc, bdns, qr, qr_count, rr, rr_count, edns, on_reply);
|
||||
if (!msg) return -1;
|
||||
|
||||
/* TODO: optionally, override dnsc->serveraddr and use the target address passed as a parameter */
|
||||
if (mio_dev_sck_write(dnsc->sck, dns_msg_to_pkt(msg), msg->pktlen, msg, &dnsc->serveraddr) <= -1)
|
||||
/* TODO: optionally, override dnc->serveraddr and use the target address passed as a parameter */
|
||||
if (mio_dev_sck_write(dnc->sck, dns_msg_to_pkt(msg), msg->pktlen, msg, &dnc->serveraddr) <= -1)
|
||||
{
|
||||
release_dns_msg (dnsc, msg);
|
||||
release_dns_msg (dnc, msg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mio_dnsc_sendreq (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_bedns_t* edns)
|
||||
int mio_svc_dnc_sendreq (mio_svc_dnc_t* dnc, mio_dns_bdns_t* bdns, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_bedns_t* edns, mio_svc_dnc_on_reply_t on_reply)
|
||||
{
|
||||
/* send requests without resource record */
|
||||
mio_oow_t i;
|
||||
for (i = 0; i < qr_count; i++)
|
||||
{
|
||||
if (mio_dnsc_sendmsg(dnsc, bdns, &qr[i], 1, MIO_NULL, 0, edns) <= -1) return -1;
|
||||
if (mio_svc_dnc_sendmsg(dnc, bdns, &qr[i], 1, MIO_NULL, 0, edns, on_reply) <= -1) return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void dnss_on_request (mio_dnss_t* dnss, mio_dns_req_t* req)
|
||||
static void on_dnc_resolve_reply (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum_t status, const void* data, mio_oow_t dlen)
|
||||
{
|
||||
mio_dnss_reply (dnss, rep); /* reply send timeout??? */
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
||||
int main ()
|
||||
int mio_svc_dnc_resolve (mio_svc_dnc_t* dnc, const mio_bch_t* qname, mio_dns_qtype_t qtype, mio_svc_dnc_on_reply_t on_reply)
|
||||
{
|
||||
mio = mio_open ();
|
||||
static mio_dns_bdns_t qhdr =
|
||||
{
|
||||
-1, /* id */
|
||||
0, /* qr */
|
||||
MIO_DNS_OPCODE_QUERY, /* opcode */
|
||||
0, /* aa */
|
||||
0, /* tc */
|
||||
1, /* rd */
|
||||
0, /* ra */
|
||||
0, /* ad */
|
||||
0, /* cd */
|
||||
MIO_DNS_RCODE_NOERROR /* rcode */
|
||||
};
|
||||
|
||||
dnss1 = mio_dnss_start(mio, "1.1.1.1:53,2.2.2.2:53", dnss_on_request);
|
||||
mio_dnss_end (dnss1);
|
||||
static mio_dns_bedns_t qedns =
|
||||
{
|
||||
4096, /* uplen */
|
||||
|
||||
dnsc1 = mio_dnsc_start (mio, "8.8.8.8:53,1.1.1.1:53"); /* option - send to all, send one by one */
|
||||
mio_dnsc_resolve (dnsc1, "A:www.google.com", dnsc_on_response);
|
||||
mio_dnsc_end (dnsc1);
|
||||
0, /* edns version */
|
||||
0, /* dnssec ok */
|
||||
|
||||
mio_close (mio);
|
||||
return 0;
|
||||
0, /* number of edns options */
|
||||
MIO_NULL
|
||||
};
|
||||
|
||||
mio_dns_bqr_t qr;
|
||||
|
||||
qr.qname = (mio_bch_t*)qname;
|
||||
qr.qtype = qtype;
|
||||
qr.qclass = MIO_DNS_QCLASS_IN;
|
||||
|
||||
return mio_svc_dnc_sendreq(dnc, &qhdr, &qr, 1, &qedns, on_reply);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -120,6 +120,7 @@ struct mio_dns_msg_t
|
||||
mio_oow_t pktlen;
|
||||
mio_tmridx_t rtmridx;
|
||||
mio_dev_t* dev;
|
||||
void* ctx;
|
||||
mio_dns_msg_t* prev;
|
||||
mio_dns_msg_t* next;
|
||||
};
|
||||
@ -205,8 +206,7 @@ typedef struct mio_dns_eopt_t mio_dns_eopt_t;
|
||||
|
||||
#include <mio-upac.h>
|
||||
|
||||
typedef struct mio_dnss_t mio_dnss_t;
|
||||
typedef struct mio_dnsc_t mio_dnsc_t;
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
#define MIO_DNS_HDR_MAKE_FLAGS(qr,opcode,aa,tc,rd,ra,ad,cd,rcode) \
|
||||
@ -324,34 +324,56 @@ struct mio_dns_bedns_t
|
||||
};
|
||||
typedef struct mio_dns_bedns_t mio_dns_bedns_t;
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
typedef struct mio_svc_dns_t mio_svc_dns_t;
|
||||
typedef struct mio_svc_dnc_t mio_svc_dnc_t;
|
||||
|
||||
typedef void (*mio_svc_dnc_on_reply_t) (
|
||||
mio_svc_dnc_t* dnc,
|
||||
mio_dns_msg_t* reqmsg,
|
||||
mio_errnum_t status,
|
||||
const void* data,
|
||||
mio_oow_t len
|
||||
);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
MIO_EXPORT mio_dnsc_t* mio_dnsc_start (
|
||||
MIO_EXPORT mio_svc_dnc_t* mio_svc_dnc_start (
|
||||
mio_t* mio
|
||||
);
|
||||
|
||||
MIO_EXPORT void mio_dnsc_stop (
|
||||
mio_dnsc_t* dnsc
|
||||
MIO_EXPORT void mio_svc_dnc_stop (
|
||||
mio_svc_dnc_t* dnc
|
||||
);
|
||||
|
||||
MIO_EXPORT int mio_dnsc_sendreq (
|
||||
mio_dnsc_t* dnsc,
|
||||
mio_dns_bdns_t* bdns,
|
||||
mio_dns_bqr_t* qr,
|
||||
mio_oow_t qr_count,
|
||||
mio_dns_bedns_t* edns
|
||||
MIO_EXPORT int mio_svc_dnc_sendreq (
|
||||
mio_svc_dnc_t* dnc,
|
||||
mio_dns_bdns_t* bdns,
|
||||
mio_dns_bqr_t* qr,
|
||||
mio_oow_t qr_count,
|
||||
mio_dns_bedns_t* edns,
|
||||
mio_svc_dnc_on_reply_t on_reply
|
||||
);
|
||||
|
||||
MIO_EXPORT int mio_dnsc_sendmsg (
|
||||
mio_dnsc_t* dnsc,
|
||||
mio_dns_bdns_t* bdns,
|
||||
mio_dns_bqr_t* qr,
|
||||
mio_oow_t qr_count,
|
||||
mio_dns_brr_t* rr,
|
||||
mio_oow_t rr_count,
|
||||
mio_dns_bedns_t* edns
|
||||
MIO_EXPORT int mio_svc_dnc_sendmsg (
|
||||
mio_svc_dnc_t* dnc,
|
||||
mio_dns_bdns_t* bdns,
|
||||
mio_dns_bqr_t* qr,
|
||||
mio_oow_t qr_count,
|
||||
mio_dns_brr_t* rr,
|
||||
mio_oow_t rr_count,
|
||||
mio_dns_bedns_t* edns,
|
||||
mio_svc_dnc_on_reply_t on_reply
|
||||
);
|
||||
|
||||
MIO_EXPORT int mio_svc_dnc_resolve (
|
||||
mio_svc_dnc_t* dnc,
|
||||
const mio_bch_t* qname,
|
||||
mio_dns_qtype_t qtype,
|
||||
mio_svc_dnc_on_reply_t on_reply
|
||||
);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
@ -677,11 +677,11 @@ mio_dev_t* mio_dev_make (mio_t* mio, mio_oow_t dev_size, mio_dev_mth_t* dev_mth,
|
||||
if (!(dev->dev_cap & MIO_DEV_CAP_OUT)) dev->dev_cap |= MIO_DEV_CAP_OUT_CLOSED;
|
||||
|
||||
if (mio_dev_watch(dev, MIO_DEV_WATCH_START, 0) <= -1) goto oops_after_make;
|
||||
|
||||
/* and place the new device object at the back of the active device list */
|
||||
APPEND_DEVICE_TO_LIST (&mio->actdev, dev);
|
||||
dev->dev_cap |= MIO_DEV_CAP_ACTIVE;
|
||||
|
||||
|
||||
return dev;
|
||||
|
||||
oops_after_make:
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "mio-prv.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
static mio_errnum_t errno_to_errnum (int errcode)
|
||||
{
|
||||
@ -240,6 +241,7 @@ mio_errnum_t mio_sys_syserrstrb (mio_t* mio, int syserr_type, int syserr_code, m
|
||||
return errno_to_errnum(syserr_code);
|
||||
}
|
||||
|
||||
|
||||
if (buf) mio_copy_bcstr (buf, len, "system error");
|
||||
return MIO_ESYSERR;
|
||||
}
|
||||
|
Reference in New Issue
Block a user