use new addr_families functions. Now works over IPv6

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3516 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-09-21 13:24:12 +00:00
parent 13ce221883
commit ebe1fa6374
2 changed files with 111 additions and 71 deletions

View File

@@ -43,12 +43,14 @@ RCSID("$Id$");
static krb5_error_code
get_kdc_address (krb5_context context,
krb5_realm realm,
struct sockaddr_in *addr)
struct sockaddr *sa,
int *sa_size)
{
krb5_error_code ret;
struct hostent *hostent;
char **hostlist;
char *dot;
char *p;
ret = krb5_get_krbhst (context,
&realm,
@@ -56,22 +58,31 @@ get_kdc_address (krb5_context context,
if (ret)
return ret;
dot = strchr (*hostlist, ':');
p = *hostlist;
dot = strchr (p, ':');
if (dot)
*dot = '\0';
hostent = gethostbyname (*hostlist);
#ifdef HAVE_GETHOSTBYNAME2
hostent = gethostbyname2 (p, AF_INET6);
if (hostent == NULL)
hostent = gethostbyname2 (p, AF_INET);
#else
hostent = gethostbyname (p);
#endif
krb5_free_krbhst (context, hostlist);
if (hostent == 0)
if (hostent == NULL)
return h_errno; /* XXX */
memset (addr, 0, sizeof(*addr));
addr->sin_family = AF_INET;
memcpy (&addr->sin_addr, hostent->h_addr_list[0], sizeof(addr->sin_addr));
addr->sin_port = krb5_getportbyname (context, "kpasswd", "udp",
KPASSWD_PORT);
return 0;
return krb5_h_addr2sockaddr (hostent->h_addrtype,
hostent->h_addr_list[0],
sa,
sa_size,
krb5_getportbyname (context,
"kpasswd",
"udp",
KPASSWD_PORT));
}
static krb5_error_code
@@ -79,7 +90,8 @@ send_request (krb5_context context,
krb5_auth_context *auth_context,
krb5_creds *creds,
int sock,
struct sockaddr_in addr,
struct sockaddr *sa,
int sa_size,
char *passwd)
{
krb5_error_code ret;
@@ -126,8 +138,8 @@ send_request (krb5_context context,
*p++ = (ap_req_data.length >> 0) & 0xFF;
memset(&msghdr, 0, sizeof(msghdr));
msghdr.msg_name = (void *)&addr;
msghdr.msg_namelen = sizeof(addr);
msghdr.msg_name = (void *)sa;
msghdr.msg_namelen = sa_size;
msghdr.msg_iov = iov;
msghdr.msg_iovlen = sizeof(iov)/sizeof(*iov);
#if 0
@@ -276,21 +288,32 @@ krb5_change_password (krb5_context context,
krb5_auth_context auth_context = NULL;
krb5_creds cred;
int sock;
struct sockaddr_in addr;
int i;
sock = socket (AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
return errno;
ret = get_kdc_address (context, creds->client->realm, &addr);
if (ret)
return ret;
char *buf;
struct sockaddr *sa;
int sa_size;
ret = krb5_auth_con_init (context, &auth_context);
if (ret)
return ret;
buf = malloc (krb5_max_sockaddr_size ());
if (buf == NULL) {
ret = ENOMEM;
goto out;
}
sa = (struct sockaddr *)buf;
ret = get_kdc_address (context, creds->client->realm, sa, &sa_size);
if (ret)
goto out;
sock = socket (sa->sa_family, SOCK_DGRAM, 0);
if (sock < 0) {
ret = errno;
goto out;
}
krb5_auth_con_setflags (context, auth_context,
KRB5_AUTH_CONTEXT_DO_SEQUENCE);
@@ -302,7 +325,8 @@ krb5_change_password (krb5_context context,
&auth_context,
creds,
sock,
addr,
sa,
sa_size,
newpw);
if (ret)
goto out;
@@ -332,5 +356,6 @@ krb5_change_password (krb5_context context,
out:
krb5_auth_con_free (context, auth_context);
free (buf);
return ret;
}