aboutsummaryrefslogtreecommitdiff
path: root/src/lib/krb5/os/dnssrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/krb5/os/dnssrv.c')
-rw-r--r--src/lib/krb5/os/dnssrv.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/lib/krb5/os/dnssrv.c b/src/lib/krb5/os/dnssrv.c
index 62d6d13..ffbbc85 100644
--- a/src/lib/krb5/os/dnssrv.c
+++ b/src/lib/krb5/os/dnssrv.c
@@ -46,10 +46,10 @@ krb5int_free_srv_dns_data (struct srv_dns_entry *p)
}
/* Construct a DNS label of the form "service.[protocol.]realm.". protocol may
- * be NULL. */
+ * and/or sitename be NULL. */
static char *
make_lookup_name(const krb5_data *realm, const char *service,
- const char *protocol)
+ const char *protocol, const char *sitename)
{
struct k5buf buf;
@@ -60,6 +60,8 @@ make_lookup_name(const krb5_data *realm, const char *service,
k5_buf_add_fmt(&buf, "%s.", service);
if (protocol != NULL)
k5_buf_add_fmt(&buf, "%s.", protocol);
+ if (sitename != NULL)
+ k5_buf_add_fmt(&buf, "%s._sites.", sitename);
k5_buf_add_len(&buf, realm->data, realm->length);
/*
@@ -119,6 +121,7 @@ k5_make_uri_query(krb5_context context, const krb5_data *realm,
krb5_error_code
krb5int_make_srv_query_realm(krb5_context context, const krb5_data *realm,
const char *service, const char *protocol,
+ const char *sitename,
struct srv_dns_entry **answers)
{
char *name = NULL;
@@ -128,7 +131,7 @@ krb5int_make_srv_query_realm(krb5_context context, const krb5_data *realm,
*answers = NULL;
- name = make_lookup_name(realm, service, protocol);
+ name = make_lookup_name(realm, service, protocol, sitename);
if (name == NULL)
return 0;
@@ -136,6 +139,12 @@ krb5int_make_srv_query_realm(krb5_context context, const krb5_data *realm,
st = DnsQuery_UTF8(name, DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, &records,
NULL);
+ if (st != ERROR_SUCCESS && sitename != NULL) {
+ /* Try again without the site name. */
+ free(name);
+ return krb5int_make_srv_query_realm(context, realm, service, protocol,
+ NULL, answers);
+ }
if (st != ERROR_SUCCESS)
return 0;
@@ -176,7 +185,8 @@ cleanup:
/* Query the URI RR, collecting weight, priority, and target. */
krb5_error_code
k5_make_uri_query(krb5_context context, const krb5_data *realm,
- const char *service, struct srv_dns_entry **answers)
+ const char *service, const char *sitename,
+ struct srv_dns_entry **answers)
{
const unsigned char *p = NULL, *base = NULL;
char *name = NULL;
@@ -188,13 +198,18 @@ k5_make_uri_query(krb5_context context, const krb5_data *realm,
*answers = NULL;
/* Construct service.realm. */
- name = make_lookup_name(realm, service, NULL);
+ name = make_lookup_name(realm, service, NULL, sitename);
if (name == NULL)
return 0;
TRACE_DNS_URI_SEND(context, name);
size = krb5int_dns_init(&ds, name, C_IN, T_URI);
+ if (size < 0 && sitename != NULL) {
+ /* Try again without the site name. */
+ free(name);
+ return k5_make_uri_query(context, realm, service, NULL, answers);
+ }
if (size < 0)
goto out;
@@ -242,6 +257,7 @@ out:
krb5_error_code
krb5int_make_srv_query_realm(krb5_context context, const krb5_data *realm,
const char *service, const char *protocol,
+ const char *sitename,
struct srv_dns_entry **answers)
{
const unsigned char *p = NULL, *base = NULL;
@@ -262,13 +278,19 @@ krb5int_make_srv_query_realm(krb5_context context, const krb5_data *realm,
*
*/
- name = make_lookup_name(realm, service, protocol);
+ name = make_lookup_name(realm, service, protocol, sitename);
if (name == NULL)
return 0;
TRACE_DNS_SRV_SEND(context, name);
size = krb5int_dns_init(&ds, name, C_IN, T_SRV);
+ if (size < 0 && sitename) {
+ /* Try again without the site name. */
+ free(name);
+ return krb5int_make_srv_query_realm(context, realm, service, protocol,
+ NULL, answers);
+ }
if (size < 0)
goto out;