diff options
| author | Ken Raeburn <raeburn@mit.edu> | 2002-06-05 01:49:47 +0000 |
|---|---|---|
| committer | Ken Raeburn <raeburn@mit.edu> | 2002-06-05 01:49:47 +0000 |
| commit | 41040f094ce1ea792ab78b5e766d7da69ed72e64 (patch) | |
| tree | 24f32278a0a3e936e2edb15365a9167ad7ba22b7 /src/lib | |
| parent | bcc6b3c8263d1e8ba40a862d7ed676ef596d9503 (diff) | |
| download | krb5-41040f094ce1ea792ab78b5e766d7da69ed72e64.tar.gz krb5-41040f094ce1ea792ab78b5e766d7da69ed72e64.tar.xz krb5-41040f094ce1ea792ab78b5e766d7da69ed72e64.zip | |
Separate send-to-kdc UDP code, export it via accessor interface, and call in to
it from krb524_sendto_kdc. Supply a socket type to krb5_locate_server and
krb5_locate_kdc.
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14473 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/krb5/os/ChangeLog | 13 | ||||
| -rw-r--r-- | src/lib/krb5/os/accessor.c | 1 | ||||
| -rw-r--r-- | src/lib/krb5/os/locate_kdc.c | 41 | ||||
| -rw-r--r-- | src/lib/krb5/os/os-proto.h | 5 | ||||
| -rw-r--r-- | src/lib/krb5/os/sendto_kdc.c | 54 | ||||
| -rw-r--r-- | src/lib/krb5/os/t_locate_kdc.c | 2 |
6 files changed, 68 insertions, 48 deletions
diff --git a/src/lib/krb5/os/ChangeLog b/src/lib/krb5/os/ChangeLog index 9f75d40b9..c1b6802be 100644 --- a/src/lib/krb5/os/ChangeLog +++ b/src/lib/krb5/os/ChangeLog @@ -1,5 +1,18 @@ 2002-06-04 Ken Raeburn <raeburn@mit.edu> + * locate_kdc.c (krb5_locate_srv_conf_1): New argument socktype + indicates what type of addrinfo entries to add. + (krb5int_locate_server): Change argument is_stream to socktype. + Pass the value to krb5_locate_srv_conf_1. + (krb5_locate_kdc): New argument socktype. + * sendto_kdc.c (krb5int_sendto_udp): New function, containing most + of the network code from krb5_sendto_kdc. + (krb5_sendto_kdc): Call it. + * accessor.c (krb5int_accessor): Set new sendto_udp field. + * os-proto.h (krb5_locate_kdc): Update prototype. Add forward + declaration for struct addrlist. + * t_locate_kdc.c (main): Update call to krb5_locate_kdc. + * locate_kdc.c: Include fake-addrinfo.h before k5-int.h. (grow_list, krb5int_free_addrlist) (add_addrinfo_to_list): Incorporate list-updating code from diff --git a/src/lib/krb5/os/accessor.c b/src/lib/krb5/os/accessor.c index 5e77051a6..b410f3d30 100644 --- a/src/lib/krb5/os/accessor.c +++ b/src/lib/krb5/os/accessor.c @@ -47,6 +47,7 @@ krb5int_accessor(internals, version) internals_temp.krb5_hmac = krb5_hmac; internals_temp.md5_hash_provider = &krb5int_hash_md5; internals_temp.arcfour_enc_provider = &krb5int_enc_arcfour; + internals_temp.sendto_udp = &krb5int_sendto_udp; *internals = internals_temp; return 0; } diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c index d1819939d..bcaf3e8b8 100644 --- a/src/lib/krb5/os/locate_kdc.c +++ b/src/lib/krb5/os/locate_kdc.c @@ -291,7 +291,8 @@ egress: static krb5_error_code krb5_locate_srv_conf_1(krb5_context context, const krb5_data *realm, const char * name, struct addrlist *addrlist, - int get_masters, int udpport, int sec_udpport) + int get_masters, int socktype, + int udpport, int sec_udpport) { const char *realm_srv_names[4]; char **masterlist, **hostlist, *host, *port, *cp; @@ -431,7 +432,15 @@ 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, SOCK_DGRAM); + if (socktype != 0) + code = add_host_to_list (addrlist, hostlist[i], p1, p2, socktype); + else { + code = add_host_to_list (addrlist, hostlist[i], p1, p2, + SOCK_DGRAM); + if (code == 0) + code = add_host_to_list (addrlist, hostlist[i], p1, p2, + SOCK_STREAM); + } if (code) { #ifdef TEST fprintf (stderr, "error %d returned from add_host_to_list\n", code); @@ -466,7 +475,7 @@ krb5_locate_srv_conf(context, realm, name, al, get_masters, krb5_error_code ret; ret = krb5_locate_srv_conf_1 (context, realm, name, al, - get_masters, udpport, sec_udpport); + get_masters, 0, udpport, sec_udpport); if (ret) return ret; if (al->naddrs == 0) /* Couldn't resolve any KDC names */ @@ -740,7 +749,7 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm, struct addrlist *addrlist, int get_masters, const char *profname, const char *dnsname, - int is_stream, + int socktype, /* network order port numbers! */ int dflport1, int dflport2) { @@ -754,33 +763,27 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm, */ code = krb5_locate_srv_conf_1(context, realm, profname, &al, get_masters, - dflport1, dflport2); + socktype, dflport1, dflport2); #ifdef KRB5_DNS_LOOKUP if (code && dnsname != 0) { int use_dns = _krb5_use_dns_kdc(context); 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) { + if (socktype == SOCK_DGRAM || socktype == 0) { code = krb5_locate_srv_dns_1(realm, dnsname, "_udp", &al); #ifdef TEST if (code) - fprintf(stderr, "dns lookup returned error %d\n", code); + fprintf(stderr, "dns udp lookup returned error %d\n", + code); #endif } - if (is_stream != 0 && code == 0) { + if ((socktype == SOCK_STREAM || socktype == 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); + fprintf(stderr, "dns tcp lookup returned error %d\n", + code); #endif } } @@ -811,7 +814,7 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm, krb5_error_code krb5_locate_kdc(krb5_context context, const krb5_data *realm, struct addrlist *addrlist, - int get_masters) + int get_masters, int socktype) { int udpport, sec_udpport; @@ -827,5 +830,5 @@ krb5_locate_kdc(krb5_context context, const krb5_data *realm, (get_masters ? "_kerberos-master" : "_kerberos"), - 0, udpport, sec_udpport); + socktype, udpport, sec_udpport); } diff --git a/src/lib/krb5/os/os-proto.h b/src/lib/krb5/os/os-proto.h index 48910b51b..f474fa04e 100644 --- a/src/lib/krb5/os/os-proto.h +++ b/src/lib/krb5/os/os-proto.h @@ -30,10 +30,9 @@ #ifndef KRB5_LIBOS_INT_PROTO__ #define KRB5_LIBOS_INT_PROTO__ -#ifdef SOCK_DGRAM /* XXX hack... */ +struct addrlist; krb5_error_code krb5_locate_kdc - (krb5_context, const krb5_data *, struct addrlist *, int); -#endif + (krb5_context, const krb5_data *, struct addrlist *, int, int); #ifdef HAVE_NETINET_IN_H krb5_error_code krb5_unpack_full_ipaddr diff --git a/src/lib/krb5/os/sendto_kdc.c b/src/lib/krb5/os/sendto_kdc.c index 862b85a4b..bf0574240 100644 --- a/src/lib/krb5/os/sendto_kdc.c +++ b/src/lib/krb5/os/sendto_kdc.c @@ -63,36 +63,42 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) krb5_data * reply; int use_master; { - int timeout, host, i; - int sent, nready; krb5_error_code retval; - SOCKET *socklist; - fd_set readable; - struct timeval waitlen; - int cc; struct addrlist addrs; /* * find KDC location(s) for realm */ - if ((retval = krb5_locate_kdc(context, realm, &addrs, use_master))) + if ((retval = krb5_locate_kdc(context, realm, &addrs, use_master, SOCK_DGRAM))) return retval; if (addrs.naddrs == 0) return (use_master ? KRB5_KDC_UNREACH : KRB5_REALM_UNKNOWN); + retval = krb5int_sendto_udp (context, message, &addrs, reply); + krb5int_free_addrlist (&addrs); + return retval; +} + +krb5_error_code +krb5int_sendto_udp (krb5_context context, const krb5_data *message, + const struct addrlist *addrs, krb5_data *reply) +{ + int timeout, host, i; + int sent, nready; + krb5_error_code retval; + SOCKET *socklist; + fd_set readable; + struct timeval waitlen; + int cc; - socklist = (SOCKET *)malloc(addrs.naddrs * sizeof(SOCKET)); + socklist = (SOCKET *)malloc(addrs->naddrs * sizeof(SOCKET)); if (socklist == NULL) { - krb5int_free_addrlist (&addrs); return ENOMEM; } - for (i = 0; i < addrs.naddrs; i++) + for (i = 0; i < addrs->naddrs; i++) socklist[i] = INVALID_SOCKET; if (!(reply->data = malloc(krb5_max_dgram_size))) { - for (i = 0; i < addrs.naddrs; i++) - krb5_xfree (addrs.addrs[i]); - krb5int_free_addrlist (&addrs); krb5_xfree(socklist); return ENOMEM; } @@ -106,7 +112,6 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) * See below for commented out SOCKET_CLEANUP() */ if (SOCKET_INITIALIZE()) { /* PC needs this for some tcp/ip stacks */ - krb5int_free_addrlist (&addrs); krb5_xfree(socklist); free(reply->data); return SOCKET_ERRNO; @@ -120,8 +125,8 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) for (timeout = krb5_skdc_timeout_1; timeout < krb5_max_skdc_timeout; timeout <<= krb5_skdc_timeout_shift) { sent = 0; - for (host = 0; host < addrs.naddrs; host++) { - if (addrs.addrs[host]->ai_socktype != SOCK_DGRAM) + for (host = 0; host < addrs->naddrs; host++) { + if (addrs->addrs[host]->ai_socktype != SOCK_DGRAM) continue; /* Send to the host, wait timeout seconds for a response, then move on. */ @@ -139,22 +144,22 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) */ #ifdef DEBUG fprintf (stderr, "getting dgram socket in family %d...", - addrs.addrs[host]->ai_family); + addrs->addrs[host]->ai_family); #endif - socklist[host] = socket(addrs.addrs[host]->ai_family, + socklist[host] = socket(addrs->addrs[host]->ai_family, SOCK_DGRAM, 0); if (socklist[host] == INVALID_SOCKET) { #ifdef DEBUG perror ("socket"); - fprintf (stderr, "af was %d\n", addrs.addrs[host]->ai_family); + fprintf (stderr, "af was %d\n", addrs->addrs[host]->ai_family); #endif continue; /* try other hosts */ } #ifdef DEBUG { char addrbuf[NI_MAXHOST], portbuf[NI_MAXSERV]; - if (0 != getnameinfo (addrs.addrs[host]->ai_addr, - addrs.addrs[host]->ai_addrlen, + if (0 != getnameinfo (addrs->addrs[host]->ai_addr, + addrs->addrs[host]->ai_addrlen, addrbuf, sizeof (addrbuf), portbuf, sizeof (portbuf), NI_NUMERICHOST | NI_NUMERICSERV)) @@ -169,8 +174,8 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) 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], addrs.addrs[host]->ai_addr, - addrs.addrs[host]->ai_addrlen) == SOCKET_ERROR) { + if (connect(socklist[host], addrs->addrs[host]->ai_addr, + addrs->addrs[host]->ai_addrlen) == SOCKET_ERROR) { #ifdef DEBUG perror ("connect"); #endif @@ -253,13 +258,12 @@ krb5_sendto_kdc (context, message, realm, reply, use_master) } retval = KRB5_KDC_UNREACH; out: - for (i = 0; i < addrs.naddrs; i++) + for (i = 0; i < addrs->naddrs; i++) if (socklist[i] != INVALID_SOCKET) (void) closesocket (socklist[i]); #if 0 SOCKET_CLEANUP(); /* Done with sockets for now */ #endif - krb5int_free_addrlist (&addrs); krb5_xfree(socklist); if (retval) { free(reply->data); diff --git a/src/lib/krb5/os/t_locate_kdc.c b/src/lib/krb5/os/t_locate_kdc.c index 5bb334b6d..fc2073eb2 100644 --- a/src/lib/krb5/os/t_locate_kdc.c +++ b/src/lib/krb5/os/t_locate_kdc.c @@ -118,7 +118,7 @@ int main (int argc, char *argv[]) break; case LOOKUP_WHATEVER: - err = krb5_locate_kdc (ctx, &realm, &al, 0); + err = krb5_locate_kdc (ctx, &realm, &al, 0, 0); break; } if (err) kfatal (err); |
