summaryrefslogtreecommitdiffstats
path: root/rfc1035/rfc1035resolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'rfc1035/rfc1035resolve.c')
-rw-r--r--rfc1035/rfc1035resolve.c99
1 files changed, 78 insertions, 21 deletions
diff --git a/rfc1035/rfc1035resolve.c b/rfc1035/rfc1035resolve.c
index d772eb0..b8bb91f 100644
--- a/rfc1035/rfc1035resolve.c
+++ b/rfc1035/rfc1035resolve.c
@@ -1,5 +1,5 @@
/*
-** Copyright 1998 - 2000 Double Precision, Inc.
+** Copyright 1998 - 2018 Double Precision, Inc.
** See COPYING for distribution information.
*/
@@ -13,7 +13,7 @@
#endif
#include <stdlib.h>
#include <string.h>
-
+#include <idna.h>
struct querybuf {
char qbuf[512];
@@ -30,25 +30,82 @@ struct querybuf *qp=(struct querybuf *)q;
qp->qbuflen += l;
}
-struct rfc1035_reply *rfc1035_resolve_multiple(
- struct rfc1035_res *res,
- int opcode,
- const struct rfc1035_query *queries,
- unsigned nqueries)
+
+static struct rfc1035_reply
+*rfc1035_resolve_multiple_idna(struct rfc1035_res *res,
+ int opcode,
+ const struct rfc1035_query *queries,
+ unsigned nqueries);
+
+struct rfc1035_reply
+*rfc1035_resolve_multiple(struct rfc1035_res *res,
+ int opcode,
+ const struct rfc1035_query *queries,
+ unsigned nqueries)
{
-struct querybuf qbuf;
-int udpfd;
-int attempt;
-const RFC1035_ADDR *ns;
-unsigned nscount;
-unsigned current_timeout, timeout_backoff;
-unsigned nbackoff, backoff_num;
-int af;
-static const char fakereply[]={0, 0, 0, RFC1035_RCODE_SERVFAIL,
- 0, 0,
- 0, 0,
- 0, 0,
- 0, 0};
+ struct rfc1035_query *idna_queries=
+ (struct rfc1035_query *)malloc(nqueries * sizeof(*queries));
+ struct rfc1035_reply *r;
+ unsigned n;
+ char **buffers;
+
+ /*
+ ** Translate each label from UTF8 to IDNA.
+ */
+
+ if (!idna_queries)
+ return NULL;
+ if ((buffers=(char **)malloc(nqueries * sizeof(char *))) == NULL)
+ {
+ free(idna_queries);
+ return NULL;
+ }
+ for (n=0; n<nqueries; ++n)
+ {
+ idna_queries[n]=queries[n];
+ if (idna_to_ascii_8z(idna_queries[n].name, &buffers[n], 0)
+ != IDNA_SUCCESS)
+ {
+ errno=EINVAL;
+ while (n)
+ {
+ free(buffers[--n]);
+ }
+ free(idna_queries);
+ free(buffers[n]);
+ return NULL;
+ }
+
+ idna_queries[n].name=buffers[n];
+ }
+
+ r=rfc1035_resolve_multiple_idna(res, opcode, idna_queries, nqueries);
+ for (n=0; n<nqueries; ++n)
+ free(buffers[n]);
+ free(idna_queries);
+ free(buffers);
+ return r;
+}
+
+static struct rfc1035_reply
+*rfc1035_resolve_multiple_idna(struct rfc1035_res *res,
+ int opcode,
+ const struct rfc1035_query *queries,
+ unsigned nqueries)
+{
+ struct querybuf qbuf;
+ int udpfd;
+ int attempt;
+ const RFC1035_ADDR *ns;
+ unsigned nscount;
+ unsigned current_timeout, timeout_backoff;
+ unsigned nbackoff, backoff_num;
+ int af;
+ static const char fakereply[]={0, 0, 0, RFC1035_RCODE_SERVFAIL,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ 0, 0};
nscount=res->rfc1035_nnameservers;
ns=res->nameservers;
@@ -184,7 +241,7 @@ static const char fakereply[]={0, 0, 0, RFC1035_RCODE_SERVFAIL,
if ((reply=rfc1035_recv_tcp(res,
tcpfd, &nbytes, current_timeout))==0)
break;
-
+
rfcreply=rfc1035_replyparse(reply, nbytes);
if (!rfcreply)
{