diff options
Diffstat (limited to 'src/lib/krb5/os/dnssrv.c')
-rw-r--r-- | src/lib/krb5/os/dnssrv.c | 34 |
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; |