summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/os/locate_kdc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/krb5/os/locate_kdc.c')
-rw-r--r--src/lib/krb5/os/locate_kdc.c98
1 files changed, 53 insertions, 45 deletions
diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c
index cc498705c9..f245ad637f 100644
--- a/src/lib/krb5/os/locate_kdc.c
+++ b/src/lib/krb5/os/locate_kdc.c
@@ -28,11 +28,6 @@
#include "k5-int.h"
#include <stdio.h>
-#ifdef KRB5_USE_INET
-extern char *krb5_kdc_udp_portname;
-extern char *krb5_kdc_sec_udp_portname;
-#endif
-
/*
* returns count of number of addresses found
*/
@@ -44,7 +39,8 @@ krb5_locate_kdc(context, realm, addr_pp, naddrs)
struct sockaddr **addr_pp;
int *naddrs;
{
- char **hostlist;
+ const char *realm_kdc_names[4];
+ char **hostlist, *host, *port, *cp;
krb5_error_code code;
int i, j, out, count;
struct sockaddr *addr_p;
@@ -58,22 +54,27 @@ krb5_locate_kdc(context, realm, addr_pp, naddrs)
hostlist = 0;
- if (code = krb5_get_krbhst (context, realm, &hostlist))
- return(code);
+ realm_kdc_names[0] = "realms";
+ realm_kdc_names[1] = realm->data;
+ realm_kdc_names[2] = "kdc";
+ realm_kdc_names[3] = 0;
+
+ code = profile_get_values(context->profile, realm_kdc_names, &hostlist);
+ if (code == PROF_NO_SECTION)
+ return KRB5_REALM_UNKNOWN;
+ if (code == PROF_NO_RELATION)
+ return KRB5_CONFIG_BADFORMAT;
+ if (code)
+ return code;
#ifdef KRB5_USE_INET
- if (sp = getservbyname(krb5_kdc_udp_portname, "udp"))
+ if (sp = getservbyname(KDC_PORTNAME, "udp"))
udpport = sp->s_port;
- if (krb5_kdc_sec_udp_portname)
- if (sp = getservbyname(krb5_kdc_sec_udp_portname, "udp")) {
-#ifdef KRB5_TRY_SECONDARY_PORT_FIRST
- sec_udpport = udpport;
- udpport = sp->s_port;
-#else
- sec_udpport = sp->s_port;
-#endif
- }
+ if (sp = getservbyname(KDC_SECONDARY_PORTNAME, "udp"))
+ sec_udpport = sp->s_port;
#endif
+ if (sec_udpport == udpport)
+ sec_udpport = 0;
count = 0;
while (hostlist[count])
@@ -92,39 +93,46 @@ krb5_locate_kdc(context, realm, addr_pp, naddrs)
addr_p = (struct sockaddr *)malloc (sizeof (struct sockaddr) * count);
for (i=0, out=0; hostlist[i]; i++) {
+ host = hostlist[i];
+ /*
+ * Strip off excess whitespace
+ */
+ cp = strchr(host, ' ');
+ if (cp)
+ *cp = 0;
+ cp = strchr(host, '\t');
+ if (cp)
+ *cp = 0;
+ port = strchr(host, ':');
+ if (port) {
+ *port = 0;
+ port++;
+ }
hp = gethostbyname(hostlist[i]);
if (hp != 0) {
switch (hp->h_addrtype) {
#ifdef KRB5_USE_INET
case AF_INET:
- if (udpport) { /* must have gotten a port # */
- for (j=0; hp->h_addr_list[j]; j++) {
- sin_p = (struct sockaddr_in *) &addr_p[out++];
- memset ((char *)sin_p, 0, sizeof(struct sockaddr));
- sin_p->sin_family = hp->h_addrtype;
- sin_p->sin_port = udpport;
- memcpy((char *)&sin_p->sin_addr,
- (char *)hp->h_addr_list[j],
- sizeof(struct in_addr));
- if (out >= count) {
- count *= 2;
- addr_p = (struct sockaddr *)
- realloc ((char *)addr_p,
- sizeof(struct sockaddr) * count);
- }
- if (sec_udpport) {
- addr_p[out] = addr_p[out-1];
- sin_p = (struct sockaddr_in *) &addr_p[out++];
- sin_p->sin_port = sec_udpport;
- if (out >= count) {
- count *= 2;
- addr_p = (struct sockaddr *)
- realloc ((char *)addr_p,
- sizeof(struct sockaddr) * count);
- }
- }
+ for (j=0; hp->h_addr_list[j]; j++) {
+ sin_p = (struct sockaddr_in *) &addr_p[out++];
+ memset ((char *)sin_p, 0, sizeof(struct sockaddr));
+ sin_p->sin_family = hp->h_addrtype;
+ sin_p->sin_port = port ? htons(atoi(port)) : udpport;
+ memcpy((char *)&sin_p->sin_addr,
+ (char *)hp->h_addr_list[j],
+ sizeof(struct in_addr));
+ if (out+1 >= count) {
+ count += 5;
+ addr_p = (struct sockaddr *)
+ realloc ((char *)addr_p,
+ sizeof(struct sockaddr) * count);
+ }
+ if (sec_udpport && !port) {
+ addr_p[out] = addr_p[out-1];
+ sin_p = (struct sockaddr_in *) &addr_p[out++];
+ sin_p->sin_port = sec_udpport;
}
- }
+ }
break;
#endif
default: