summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/os/locate_kdc.c
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2002-06-04 06:59:28 +0000
committerKen Raeburn <raeburn@mit.edu>2002-06-04 06:59:28 +0000
commitb02232ffdf69f75caaf10c78e00a9fa8f93b3286 (patch)
tree8324d8d24db2a4b72d95cfe57c7762355e5edd81 /src/lib/krb5/os/locate_kdc.c
parent53c8f6650caef85bb9b38f23e0e50965d50d26f6 (diff)
downloadkrb5-b02232ffdf69f75caaf10c78e00a9fa8f93b3286.tar.gz
krb5-b02232ffdf69f75caaf10c78e00a9fa8f93b3286.tar.xz
krb5-b02232ffdf69f75caaf10c78e00a9fa8f93b3286.zip
Add capability of looking up TCP addresses for KDC in DNS; not enabled yet.
Internal "addrlist" structure now includes socket type, by way of using struct addrinfo where struct sockaddr was used before; updated uses. No support for noting TCP/UDP vs UDP-only addresses in config files. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14465 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/os/locate_kdc.c')
-rw-r--r--src/lib/krb5/os/locate_kdc.c152
1 files changed, 69 insertions, 83 deletions
diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c
index cc6d9c5670..d1819939d1 100644
--- a/src/lib/krb5/os/locate_kdc.c
+++ b/src/lib/krb5/os/locate_kdc.c
@@ -28,6 +28,7 @@
*/
#define NEED_SOCKETS
+#include "fake-addrinfo.h"
#include "k5-int.h"
#include "os-proto.h"
#include <stdio.h>
@@ -44,8 +45,6 @@
#define T_SRV 33
#endif /* T_SRV */
-#include "fake-addrinfo.h"
-
/* for old Unixes and friends ... */
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
@@ -133,7 +132,7 @@ grow_list (struct addrlist *lp, int nmore)
int i;
int newspace = lp->space + nmore;
size_t newsize = newspace * sizeof (struct addrlist);
- struct sockaddr **newaddrs;
+ struct addrinfo **newaddrs;
/* NULL check a concession to SunOS4 compatibility for now; not
required for pure ANSI support. */
@@ -158,57 +157,13 @@ krb5int_free_addrlist (struct addrlist *lp)
{
int i;
for (i = 0; i < lp->naddrs; i++)
- free (lp->addrs[i]);
+ freeaddrinfo (lp->addrs[i]);
free (lp->addrs);
lp->addrs = NULL;
lp->naddrs = lp->space = 0;
}
#define free_list krb5int_free_addrlist
-static int
-add_sockaddr_to_list (struct addrlist *lp, const struct sockaddr *addr,
- size_t len)
-{
- struct sockaddr *copy;
- int err;
-
-#ifdef TEST
- char name[NI_MAXHOST];
-
- fprintf (stderr, "\tadding sockaddr family %2d, len %d", addr->sa_family,
- len);
-
- err = getnameinfo (addr, len, name, sizeof (name), NULL, 0,
- NI_NUMERICHOST | NI_NUMERICSERV);
- if (err == 0)
- fprintf (stderr, "\t%s", name);
- fprintf (stderr, "\n");
-#endif
-
- if (lp->naddrs == lp->space) {
- err = grow_list (lp, 1);
- if (err) {
-#ifdef TEST
- fprintf (stderr, "grow_list failed %d\n", err);
-#endif
- return err;
- }
- }
- copy = malloc (len);
- if (copy == NULL) {
-#ifdef TEST
- perror ("malloc");
-#endif
- return errno;
- }
- memcpy (copy, addr, len);
- lp->addrs[lp->naddrs++] = copy;
-#ifdef TEST
- fprintf (stderr, "count is now %d\n", lp->naddrs);
-#endif
- return 0;
-}
-
static int translate_ai_error (int err)
{
switch (err) {
@@ -249,8 +204,8 @@ static int translate_ai_error (int err)
static int add_addrinfo_to_list (struct addrlist *lp, struct addrinfo *a)
{
- int r;
- r = add_sockaddr_to_list (lp, a->ai_addr, a->ai_addrlen);
+ int err;
+
#ifdef TEST
switch (a->ai_socktype) {
case SOCK_DGRAM:
@@ -269,29 +224,31 @@ static int add_addrinfo_to_list (struct addrlist *lp, struct addrinfo *a)
break;
}
#endif
- return r;
-}
-static void set_port_num (struct sockaddr *addr, int num)
-{
- switch (addr->sa_family) {
- case AF_INET:
- ((struct sockaddr_in *)addr)->sin_port = num;
- break;
-#ifdef KRB5_USE_INET6
- case AF_INET6:
- ((struct sockaddr_in6 *)addr)->sin6_port = num;
- break;
+ if (lp->naddrs == lp->space) {
+ err = grow_list (lp, 1);
+ if (err) {
+#ifdef TEST
+ fprintf (stderr, "grow_list failed %d\n", err);
#endif
+ return err;
+ }
}
+ lp->addrs[lp->naddrs++] = a;
+ a->ai_next = 0;
+#ifdef TEST
+ fprintf (stderr, "count is now %d\n", lp->naddrs);
+#endif
+ return 0;
}
static int
add_host_to_list (struct addrlist *lp, const char *hostname,
- int port, int secport)
+ int port, int secport, int socktype)
{
- struct addrinfo *addrs, *a, hint;
+ struct addrinfo *addrs, *a, *anext, hint;
int err;
+ char portbuf[10], secportbuf[10];
#ifdef TEST
fprintf (stderr, "adding hostname %s, ports %d,%d\n", hostname,
@@ -299,25 +256,29 @@ add_host_to_list (struct addrlist *lp, const char *hostname,
#endif
memset(&hint, 0, sizeof(hint));
- hint.ai_socktype = SOCK_DGRAM;
- err = getaddrinfo (hostname, NULL, &hint, &addrs);
+ hint.ai_socktype = socktype;
+ sprintf(portbuf, "%d", ntohs(port));
+ sprintf(secportbuf, "%d", ntohs(secport));
+ err = getaddrinfo (hostname, portbuf, &hint, &addrs);
if (err)
return translate_ai_error (err);
- for (a = addrs; a; a = a->ai_next) {
- set_port_num (a->ai_addr, port);
+ anext = 0;
+ for (a = addrs; a != 0 && err == 0; a = anext) {
+ anext = a->ai_next;
err = add_addrinfo_to_list (lp, a);
- if (err)
- break;
-
- if (secport == 0)
- continue;
-
- set_port_num (a->ai_addr, secport);
+ }
+ if (err || secport == 0)
+ goto egress;
+ err = getaddrinfo (hostname, secportbuf, &hint, &addrs);
+ if (err)
+ return translate_ai_error (err);
+ for (a = addrs; a != 0 && err == 0; a = anext) {
+ anext = a->ai_next;
err = add_addrinfo_to_list (lp, a);
- if (err)
- break;
}
- freeaddrinfo (addrs);
+egress:
+ if (anext)
+ freeaddrinfo (anext);
return err;
}
@@ -470,7 +431,7 @@ krb5_locate_srv_conf_1(krb5_context context, const krb5_data *realm,
p2 = sec_udpport;
}
- code = add_host_to_list (addrlist, hostlist[i], p1, p2);
+ code = add_host_to_list (addrlist, hostlist[i], p1, p2, SOCK_DGRAM);
if (code) {
#ifdef TEST
fprintf (stderr, "error %d returned from add_host_to_list\n", code);
@@ -732,7 +693,10 @@ krb5_locate_srv_dns_1 (const krb5_data *realm,
#ifdef TEST
fprintf (stderr, "\tport=%d host=%s\n", entry->port, entry->host);
#endif
- code = add_host_to_list (addrlist, entry->host, htons (entry->port), 0);
+ code = add_host_to_list (addrlist, entry->host, htons (entry->port), 0,
+ (strcmp("_tcp", protocol)
+ ? SOCK_DGRAM
+ : SOCK_STREAM));
if (code)
break;
}
@@ -795,9 +759,31 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm,
#ifdef KRB5_DNS_LOOKUP
if (code && dnsname != 0) {
int use_dns = _krb5_use_dns_kdc(context);
- if (use_dns)
- code = krb5_locate_srv_dns_1(realm, dnsname,
- is_stream ? "_tcp" : "_udp", &al);
+ if (use_dns) {
+ /* Values of is_stream:
+ 0: udp only
+ 1: tcp only
+ 2: udp or tcp
+ No other values currently allowed. */
+ code = 0;
+#ifdef TEST
+ fprintf(stderr, "is_stream = %d\n", is_stream);
+#endif
+ if (is_stream != 1) {
+ code = krb5_locate_srv_dns_1(realm, dnsname, "_udp", &al);
+#ifdef TEST
+ if (code)
+ fprintf(stderr, "dns lookup returned error %d\n", code);
+#endif
+ }
+ if (is_stream != 0 && code == 0) {
+ code = krb5_locate_srv_dns_1(realm, dnsname, "_tcp", &al);
+#ifdef TEST
+ if (code)
+ fprintf(stderr, "dns lookup returned error %d\n", code);
+#endif
+ }
+ }
}
#endif /* KRB5_DNS_LOOKUP */
#ifdef TEST