558
554
state.options |= RES_DEBUG;
560
556
fprintf(stderr, "dns_lookup(%s, %d, %s), buffer size %d\n", domain,
561
rr_class, rk_dns_type_to_string(rr_type), size);
557
rr_class, rk_dns_type_to_string(rr_type), len);
563
reply = malloc(size);
564
560
if (reply == NULL) {
565
561
resolve_free_handle(handle);
569
len = resolve_search(handle, domain, rr_class, rr_type, reply, size);
565
size = resolve_search(handle, domain, rr_class, rr_type, reply, len);
571
567
if (_resolve_debug) {
572
568
fprintf(stderr, "dns_lookup(%s, %d, %s) --> %d\n",
573
domain, rr_class, rk_dns_type_to_string(rr_type), len);
569
domain, rr_class, rk_dns_type_to_string(rr_type), size);
572
/* resolver thinks it know better, go for it */
574
} else if (size > 0) {
575
/* got a good reply */
577
} else if (size <= 0 && len < rk_DNS_MAX_PACKET_SIZE) {
579
if (len > rk_DNS_MAX_PACKET_SIZE)
580
len = rk_DNS_MAX_PACKET_SIZE;
576
583
resolve_free_handle(handle);
580
} while (size < len && len < rk_DNS_MAX_PACKET_SIZE);
581
resolve_free_handle(handle);
583
589
len = min(len, size);
584
590
r = parse_reply(reply, len);
717
static struct rk_resource_record *
718
parse_dns_record(PDNS_RECORD pRec)
720
struct rk_resource_record * rr;
725
rr = calloc(1, sizeof(*rr));
727
rr->domain = strdup(pRec->pName);
728
rr->type = pRec->wType;
730
rr->ttl = pRec->dwTtl;
737
rr->u.txt = strdup(pRec->Data.NS.pNameHost);
738
if(rr->u.txt == NULL) {
746
size_t hostlen = strnlen(pRec->Data.MX.pNameExchange, DNS_MAX_NAME_LENGTH);
748
rr->u.mx = (struct mx_record *)malloc(sizeof(struct mx_record) +
750
if (rr->u.mx == NULL) {
755
strcpy_s(rr->u.mx->domain, hostlen + 1, pRec->Data.MX.pNameExchange);
756
rr->u.mx->preference = pRec->Data.MX.wPreference;
761
size_t hostlen = strnlen(pRec->Data.SRV.pNameTarget, DNS_MAX_NAME_LENGTH);
764
(struct srv_record*)malloc(sizeof(struct srv_record) +
766
if(rr->u.srv == NULL) {
771
rr->u.srv->priority = pRec->Data.SRV.wPriority;
772
rr->u.srv->weight = pRec->Data.SRV.wWeight;
773
rr->u.srv->port = pRec->Data.SRV.wPort;
774
strcpy_s(rr->u.srv->target, hostlen + 1, pRec->Data.SRV.pNameTarget);
782
if (pRec->Data.TXT.dwStringCount == 0) {
783
rr->u.txt = strdup("");
787
len = strnlen(pRec->Data.TXT.pStringArray[0], DNS_MAX_TEXT_STRING_LENGTH);
789
rr->u.txt = (char *)malloc(len + 1);
790
strcpy_s(rr->u.txt, len + 1, pRec->Data.TXT.pStringArray[0]);
798
if (pRec->wDataLength < 4) {
803
key_len = pRec->wDataLength - 4;
804
rr->u.key = malloc (sizeof(*rr->u.key) + key_len - 1);
805
if (rr->u.key == NULL) {
810
rr->u.key->flags = pRec->Data.KEY.wFlags;
811
rr->u.key->protocol = pRec->Data.KEY.chProtocol;
812
rr->u.key->algorithm = pRec->Data.KEY.chAlgorithm;
813
rr->u.key->key_len = key_len;
814
memcpy_s (rr->u.key->key_data, key_len,
815
pRec->Data.KEY.Key, key_len);
820
size_t sig_len, hostlen;
822
if(pRec->wDataLength <= 18) {
827
sig_len = pRec->wDataLength;
829
hostlen = strnlen(pRec->Data.SIG.pNameSigner, DNS_MAX_NAME_LENGTH);
831
rr->u.sig = malloc(sizeof(*rr->u.sig)
832
+ hostlen + sig_len);
833
if (rr->u.sig == NULL) {
837
rr->u.sig->type = pRec->Data.SIG.wTypeCovered;
838
rr->u.sig->algorithm = pRec->Data.SIG.chAlgorithm;
839
rr->u.sig->labels = pRec->Data.SIG.chLabelCount;
840
rr->u.sig->orig_ttl = pRec->Data.SIG.dwOriginalTtl;
841
rr->u.sig->sig_expiration = pRec->Data.SIG.dwExpiration;
842
rr->u.sig->sig_inception = pRec->Data.SIG.dwTimeSigned;
843
rr->u.sig->key_tag = pRec->Data.SIG.wKeyTag;
844
rr->u.sig->sig_len = sig_len;
845
memcpy_s (rr->u.sig->sig_data, sig_len,
846
pRec->Data.SIG.Signature, sig_len);
847
rr->u.sig->signer = &rr->u.sig->sig_data[sig_len];
848
strcpy_s(rr->u.sig->signer, hostlen + 1, pRec->Data.SIG.pNameSigner);
854
rr->u.ds = malloc (sizeof(*rr->u.ds) + pRec->Data.DS.wDigestLength - 1);
855
if (rr->u.ds == NULL) {
860
rr->u.ds->key_tag = pRec->Data.DS.wKeyTag;
861
rr->u.ds->algorithm = pRec->Data.DS.chAlgorithm;
862
rr->u.ds->digest_type = pRec->Data.DS.chDigestType;
863
rr->u.ds->digest_len = pRec->Data.DS.wDigestLength;
864
memcpy_s (rr->u.ds->digest_data, pRec->Data.DS.wDigestLength,
865
pRec->Data.DS.Digest, pRec->Data.DS.wDigestLength);
875
rr->next = parse_dns_record(pRec->pNext);
879
ROKEN_LIB_FUNCTION struct rk_dns_reply * ROKEN_LIB_CALL
880
rk_dns_lookup(const char *domain, const char *type_name)
884
PDNS_RECORD pRec = NULL;
885
struct rk_dns_reply * r = NULL;
889
type = rk_dns_string_to_type(type_name);
892
fprintf(stderr, "dns_lookup: unknown resource type: `%s'\n",
897
status = DnsQuery_UTF8(domain, type, DNS_QUERY_STANDARD, NULL,
899
if (status != ERROR_SUCCESS)
902
r = calloc(1, sizeof(*r));
903
r->q.domain = strdup(domain);
907
r->head = parse_dns_record(pRec);
909
if (r->head == NULL) {
919
DnsRecordListFree(pRec, DnsFreeRecordList);
923
#endif /* HAVE_WINDNS */
707
925
#else /* NOT defined(HAVE_RES_SEARCH) && defined(HAVE_DN_EXPAND) */
709
struct rk_dns_reply * ROKEN_LIB_FUNCTION
927
ROKEN_LIB_FUNCTION struct rk_dns_reply * ROKEN_LIB_CALL
710
928
rk_dns_lookup(const char *domain, const char *type_name)
715
void ROKEN_LIB_FUNCTION
933
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
716
934
rk_dns_free_data(struct rk_dns_reply *r)
720
void ROKEN_LIB_FUNCTION
938
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
721
939
rk_dns_srv_order(struct rk_dns_reply *r)