use new addr_families functions

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3517 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-09-21 13:24:31 +00:00
parent ebe1fa6374
commit 2ca944d2bc
5 changed files with 168 additions and 234 deletions

View File

@@ -132,81 +132,55 @@ krb5_auth_con_setaddrs(krb5_context context,
return 0;
}
static void
sockaddr2krb5_address (struct sockaddr *sa,
krb5_address *ka)
{
switch (sa->sa_family) {
case AF_INET: {
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
ka->addr_type = AF_INET;
ka->address.length = sizeof(sin->sin_addr);
ka->address.data = &sin->sin_addr;
break;
}
#if defined(AF_INET6) && defined(HAVE_SOCKADDR_IN6)
case AF_INET6: {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
ka->addr_type = AF_INET;
ka->address.length = sizeof(struct in_addr);
#ifndef IN6_ADDR_V6_TO_V4
#define IN6_ADDR_V6_TO_V4(x) (&IN6_EXTRACT_V4ADDR(x))
#endif
ka->address.data = IN6_ADDR_V6_TO_V4(&sin6->sin6_addr);
} else {
ka->addr_type = AF_INET6;
ka->address.length = sizeof(sin6->sin6_addr);
ka->address.data = &sin6->sin6_addr;
}
break;
}
#endif
default:
break;
}
}
krb5_error_code
krb5_auth_con_setaddrs_from_fd (krb5_context context,
krb5_auth_context auth_context,
int fd)
{
krb5_address *lptr = NULL, *rptr = NULL;
krb5_error_code ret;
krb5_address local_k_address, remote_k_address;
#if defined(AF_INET6) && defined(HAVE_SOCKADDR_IN6)
struct sockaddr_in6 local_addr, remote_addr;
#else
struct sockaddr_in local_addr, remote_addr;
#endif
krb5_address *lptr = NULL, *rptr = NULL;
size_t max_sz = krb5_max_sockaddr_size ();
char *buf1 = NULL, *buf2 = NULL;
struct sockaddr *local, *remote;
int len;
buf1 = malloc(max_sz);
if (buf1 == NULL) {
ret = ENOMEM;
goto out;
}
local = (struct sockaddr *)buf1;
buf2 = malloc(max_sz);
if (buf2 == NULL) {
ret = ENOMEM;
goto out;
}
remote = (struct sockaddr *)buf2;
if (auth_context->local_address == NULL) {
len = sizeof (local_addr);
if (getsockname (fd, (struct sockaddr *)&local_addr, &len) < 0)
return errno;
sockaddr2krb5_address((struct sockaddr *)&local_addr,
&local_k_address);
len = max_sz;
if(getsockname(fd, local, &len) < 0)
goto out;
krb5_sockaddr2address (local, &local_k_address);
lptr = &local_k_address;
}
if (auth_context->remote_address == NULL) {
len = sizeof (remote_addr);
if (getpeername (fd, (struct sockaddr *)&remote_addr, &len) < 0)
return errno;
sockaddr2krb5_address((struct sockaddr *)&remote_addr,
&remote_k_address);
len = max_sz;
if(getpeername(fd, remote, &len) < 0)
goto out;
krb5_sockaddr2address (remote, &remote_k_address);
rptr = &remote_k_address;
}
return krb5_auth_con_setaddrs (context,
auth_context,
lptr,
rptr);
ret = krb5_auth_con_setaddrs (context,
auth_context,
lptr,
rptr);
out:
free (buf1);
free (buf2);
return ret;
}
krb5_error_code