aboutsummaryrefslogtreecommitdiff
path: root/src/krb524
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2001-06-20 00:00:05 +0000
committerKen Raeburn <raeburn@mit.edu>2001-06-20 00:00:05 +0000
commit3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa (patch)
tree02bf1f45da8e111538085773324f2dd52e65feaf /src/krb524
parent26444a8941bed940c588602eb9371825b2fa58eb (diff)
downloadkrb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.zip
krb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.tar.gz
krb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.tar.bz2
Use a "struct addrlist" instead of separate count and pointer-to-pointer values
for internal interfaces for looking up servers. Add a new routine to free the addrlist contents, so that memory management can be changed in one place. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13390 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/krb524')
-rw-r--r--src/krb524/ChangeLog4
-rw-r--r--src/krb524/sendmsg.c43
2 files changed, 26 insertions, 21 deletions
diff --git a/src/krb524/ChangeLog b/src/krb524/ChangeLog
index 9389020..ba597d5 100644
--- a/src/krb524/ChangeLog
+++ b/src/krb524/ChangeLog
@@ -1,3 +1,7 @@
+2001-06-19 Ken Raeburn <raeburn@mit.edu>
+
+ * sendmsg.c (krb524_sendto_kdc): Use new locate_server interface.
+
2001-06-06 Ezra Peisach <epeisach@mit.edu>
* test.c (print_key): Pass in des_cblock* instead of char *.
diff --git a/src/krb524/sendmsg.c b/src/krb524/sendmsg.c
index 3d7b433..00c55f0 100644
--- a/src/krb524/sendmsg.c
+++ b/src/krb524/sendmsg.c
@@ -68,8 +68,7 @@ krb524_sendto_kdc (context, message, realm, reply)
krb5_data * reply;
{
register int timeout, host, i;
- struct sockaddr **addr;
- int naddr;
+ struct addrlist al = ADDRLIST_INIT;
struct servent *serv;
int sent, nready;
krb5_error_code retval;
@@ -90,37 +89,37 @@ krb524_sendto_kdc (context, message, realm, reply)
serv = getservbyname(KRB524_SERVICE, "udp");
port = serv ? serv->s_port : htons (KRB524_PORT);
- retval = internals.krb5_locate_server(context, realm, &addr, &naddr, 0,
+ retval = internals.krb5_locate_server(context, realm, &al, 0,
"krb524_server", "_krb524",
0, port, 0);
if (retval == KRB5_REALM_CANT_RESOLVE || retval == KRB5_REALM_UNKNOWN) {
/* Fallback heuristic: Assume krb524 port on every KDC might
work. */
- retval = internals.krb5_locate_kdc(context, realm, &addr, &naddr, 0);
+ retval = internals.krb5_locate_kdc(context, realm, &al, 0);
/*
* Bash the ports numbers.
*/
if (retval == 0)
- for (i = 0; i < naddr; i++) {
- if (addr[i]->sa_family == AF_INET)
- sa2sin (addr[i])->sin_port = port;
+ for (i = 0; i < al.naddrs; i++) {
+ if (al.addrs[i]->sa_family == AF_INET)
+ sa2sin (al.addrs[i])->sin_port = port;
}
}
if (retval)
return retval;
- if (naddr == 0)
+ if (al.naddrs == 0)
return KRB5_REALM_UNKNOWN;
- socklist = (SOCKET *)malloc(naddr * sizeof(SOCKET));
+ socklist = (SOCKET *)malloc(al.naddrs * sizeof(SOCKET));
if (socklist == NULL) {
- free(addr);
+ internals.free_addrlist (&al);
return ENOMEM;
}
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < al.naddrs; i++)
socklist[i] = INVALID_SOCKET;
if (!(reply->data = malloc(internals.krb5_max_dgram_size))) {
- free(addr);
+ internals.free_addrlist (&al);
free(socklist);
return ENOMEM;
}
@@ -145,10 +144,11 @@ krb524_sendto_kdc (context, message, realm, reply)
* do exponential backoff.
*/
- for (timeout = internals.krb5_skdc_timeout_1; timeout < internals.krb5_max_skdc_timeout;
+ for (timeout = internals.krb5_skdc_timeout_1;
+ timeout < internals.krb5_max_skdc_timeout;
timeout <<= internals.krb5_skdc_timeout_shift) {
sent = 0;
- for (host = 0; host < naddr; host++) {
+ for (host = 0; host < al.naddrs; host++) {
/* send to the host, wait timeout seconds for a response,
then move on. */
/* cache some sockets for each host */
@@ -163,7 +163,8 @@ krb524_sendto_kdc (context, message, realm, reply)
* protocol exists to support a particular socket type
* within a given protocol family.
*/
- socklist[host] = socket(addr[host]->sa_family, SOCK_DGRAM, 0);
+ socklist[host] = socket(al.addrs[host]->sa_family, SOCK_DGRAM,
+ 0);
if (socklist[host] == INVALID_SOCKET)
continue; /* try other hosts */
/* have a socket to send/recv from */
@@ -172,12 +173,12 @@ krb524_sendto_kdc (context, message, realm, reply)
socket will time out, so use connect, send, recv instead of
sendto, recvfrom. The connect here may return an error if
the destination host is known to be unreachable. */
- if (connect(socklist[host],
- addr[host], socklen(addr[host])) == SOCKET_ERROR)
+ if (connect(socklist[host], al.addrs[host],
+ socklen(al.addrs[host])) == SOCKET_ERROR)
continue;
}
- if (send(socklist[host],
- message->data, (int) message->length, 0) != message->length)
+ if (send(socklist[host], message->data, (int) message->length, 0)
+ != message->length)
continue;
retry:
waitlen.tv_usec = 0;
@@ -238,13 +239,13 @@ krb524_sendto_kdc (context, message, realm, reply)
}
retval = KRB5_KDC_UNREACH;
out:
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < al.naddrs; i++)
if (socklist[i] != INVALID_SOCKET)
(void) closesocket (socklist[i]);
#if 0
SOCKET_CLEANUP(); /* Done with sockets for now */
#endif
- free(addr);
+ internals.free_addrlist (&al);
free(socklist);
if (retval) {
free(reply->data);