diff options
author | Ken Raeburn <raeburn@mit.edu> | 2001-06-20 00:00:05 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@mit.edu> | 2001-06-20 00:00:05 +0000 |
commit | 3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa (patch) | |
tree | 02bf1f45da8e111538085773324f2dd52e65feaf /src/krb524 | |
parent | 26444a8941bed940c588602eb9371825b2fa58eb (diff) | |
download | krb5-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/ChangeLog | 4 | ||||
-rw-r--r-- | src/krb524/sendmsg.c | 43 |
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); |