sock: choose target with the lowest priority
sock_srv_lookup chose the last target in the answer section. But it must choose one with the lowest priority it can reach (due to RFC2052).
This commit is contained in:
17
src/sock.c
17
src/sock.c
@@ -837,6 +837,7 @@ int sock_srv_lookup(const char *service, const char *proto,
|
|||||||
#else
|
#else
|
||||||
if (!set) {
|
if (!set) {
|
||||||
unsigned char buf[65535];
|
unsigned char buf[65535];
|
||||||
|
unsigned short min;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if ((len = res_query(fulldomain, C_IN, T_SRV, buf, 65535)) > 0) {
|
if ((len = res_query(fulldomain, C_IN, T_SRV, buf, 65535)) > 0) {
|
||||||
@@ -853,22 +854,22 @@ int sock_srv_lookup(const char *service, const char *proto,
|
|||||||
netbuf_get_dnsquery_question(buf, 65536, &offset, &question);
|
netbuf_get_dnsquery_question(buf, 65536, &offset, &question);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
min = 65535;
|
||||||
for (i = 0; i < header.ancount; i++) {
|
for (i = 0; i < header.ancount; i++) {
|
||||||
netbuf_get_dnsquery_resourcerecord(buf, 65536, &offset, &rr);
|
netbuf_get_dnsquery_resourcerecord(buf, 65536, &offset, &rr);
|
||||||
|
|
||||||
if (rr.type == 33) {
|
if (rr.type == 33) {
|
||||||
struct dnsquery_srvrdata *srvrdata = &(rr.rdata);
|
struct dnsquery_srvrdata *srvrdata = &(rr.rdata);
|
||||||
|
|
||||||
snprintf(resulttarget, resulttargetlength, "%s",
|
if (srvrdata->priority < min || !set) {
|
||||||
srvrdata->target);
|
snprintf(resulttarget, resulttargetlength, "%s",
|
||||||
*resultport = srvrdata->port;
|
srvrdata->target);
|
||||||
set = 1;
|
*resultport = srvrdata->port;
|
||||||
|
set = 1;
|
||||||
|
min = srvrdata->priority;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < header.ancount; i++) {
|
|
||||||
netbuf_get_dnsquery_resourcerecord(buf, 65536, &offset, &rr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user