(addr2sockaddr, print_addr): new methods
(find_af, find_atype): new functions. use them. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5259 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -45,10 +45,13 @@ struct addr_operations {
|
|||||||
krb5_address_type atype;
|
krb5_address_type atype;
|
||||||
size_t max_sockaddr_size;
|
size_t max_sockaddr_size;
|
||||||
krb5_error_code (*sockaddr2addr)(const struct sockaddr *, krb5_address *);
|
krb5_error_code (*sockaddr2addr)(const struct sockaddr *, krb5_address *);
|
||||||
|
void (*addr2sockaddr)(const krb5_address *, struct sockaddr *,
|
||||||
|
int *sa_size, int port);
|
||||||
void (*h_addr2sockaddr)(const char *, struct sockaddr *, int *, int);
|
void (*h_addr2sockaddr)(const char *, struct sockaddr *, int *, int);
|
||||||
krb5_error_code (*h_addr2addr)(const char *, krb5_address *);
|
krb5_error_code (*h_addr2addr)(const char *, krb5_address *);
|
||||||
krb5_boolean (*uninteresting)(const struct sockaddr *);
|
krb5_boolean (*uninteresting)(const struct sockaddr *);
|
||||||
void (*anyaddr)(struct sockaddr *, int *, int);
|
void (*anyaddr)(struct sockaddr *, int *, int);
|
||||||
|
int (*print_addr)(const krb5_address *, char *, size_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -66,6 +69,21 @@ ipv4_sockaddr2addr (const struct sockaddr *sa, krb5_address *a)
|
|||||||
return krb5_data_copy(&a->address, buf, 4);
|
return krb5_data_copy(&a->address, buf, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipv4_addr2sockaddr (const krb5_address *a,
|
||||||
|
struct sockaddr *sa,
|
||||||
|
int *sa_size,
|
||||||
|
int port)
|
||||||
|
{
|
||||||
|
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
|
||||||
|
|
||||||
|
memset (sin, 0, sizeof(*sin));
|
||||||
|
sin->sin_family = AF_INET;
|
||||||
|
memcpy (&sin->sin_addr, a->address.data, 4);
|
||||||
|
sin->sin_port = port;
|
||||||
|
*sa_size = sizeof(*sin);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ipv4_h_addr2sockaddr(const char *addr,
|
ipv4_h_addr2sockaddr(const char *addr,
|
||||||
struct sockaddr *sa, int *sa_size, int port)
|
struct sockaddr *sa, int *sa_size, int port)
|
||||||
@@ -112,6 +130,16 @@ ipv4_anyaddr (struct sockaddr *sa, int *sa_size, int port)
|
|||||||
sin->sin_addr.s_addr = INADDR_ANY;
|
sin->sin_addr.s_addr = INADDR_ANY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipv4_print_addr (const krb5_address *addr, char *str, size_t len)
|
||||||
|
{
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
|
memcpy (&ia, addr->address.data, 4);
|
||||||
|
|
||||||
|
return snprintf (str, len, "IPv4:%s", inet_ntoa(ia));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AF_INET6 - aka IPv6 implementation
|
* AF_INET6 - aka IPv6 implementation
|
||||||
*/
|
*/
|
||||||
@@ -144,9 +172,26 @@ ipv6_sockaddr2addr (const struct sockaddr *sa, krb5_address *a)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipv6_addr2sockaddr (const krb5_address *a,
|
||||||
|
struct sockaddr *sa,
|
||||||
|
int *sa_size,
|
||||||
|
int port)
|
||||||
|
{
|
||||||
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
|
||||||
|
|
||||||
|
memset (sin6, 0, sizeof(*sin6));
|
||||||
|
sin6->sin6_family = AF_INET6;
|
||||||
|
memcpy (&sin6->sin6_addr, a->address.data, sizeof(sin6->sin6_addr));
|
||||||
|
sin6->sin6_port = port;
|
||||||
|
*sa_size = sizeof(*sin6);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ipv6_h_addr2sockaddr(const char *addr,
|
ipv6_h_addr2sockaddr(const char *addr,
|
||||||
struct sockaddr *sa, int *sa_size, int port)
|
struct sockaddr *sa,
|
||||||
|
int *sa_size,
|
||||||
|
int port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
|
||||||
|
|
||||||
@@ -196,6 +241,12 @@ ipv6_anyaddr (struct sockaddr *sa, int *sa_size, int port)
|
|||||||
sin6->sin6_addr = in6addr_any;
|
sin6->sin6_addr = in6addr_any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipv6_print_addr (const krb5_address *addr, char *str, size_t len)
|
||||||
|
{
|
||||||
|
abort (); /* XXX - not done yet */
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* IPv6 */
|
#endif /* IPv6 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -204,12 +255,14 @@ ipv6_anyaddr (struct sockaddr *sa, int *sa_size, int port)
|
|||||||
|
|
||||||
static struct addr_operations at[] = {
|
static struct addr_operations at[] = {
|
||||||
{AF_INET, KRB5_ADDRESS_INET, sizeof(struct sockaddr_in),
|
{AF_INET, KRB5_ADDRESS_INET, sizeof(struct sockaddr_in),
|
||||||
ipv4_sockaddr2addr, ipv4_h_addr2sockaddr, ipv4_h_addr2addr,
|
ipv4_sockaddr2addr, ipv4_addr2sockaddr,
|
||||||
ipv4_uninteresting, ipv4_anyaddr},
|
ipv4_h_addr2sockaddr, ipv4_h_addr2addr,
|
||||||
|
ipv4_uninteresting, ipv4_anyaddr, ipv4_print_addr},
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
{AF_INET6, KRB5_ADDRESS_INET6, sizeof(struct sockaddr_in6),
|
{AF_INET6, KRB5_ADDRESS_INET6, sizeof(struct sockaddr_in6),
|
||||||
ipv6_sockaddr2addr, ipv6_h_addr2sockaddr, ipv6_h_addr2addr,
|
ipv6_sockaddr2addr, ipv6_addr2sockaddr,
|
||||||
ipv6_uninteresting, ipv6_anyaddr}
|
ipv6_h_addr2sockaddr, ipv6_h_addr2addr,
|
||||||
|
ipv6_uninteresting, ipv6_anyaddr, ipv6_print_addr}
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -222,12 +275,23 @@ static size_t max_sockaddr_size = 0;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static struct addr_operations *
|
static struct addr_operations *
|
||||||
find_addr_type(int atype)
|
find_af(int af)
|
||||||
{
|
{
|
||||||
struct addr_operations *a;
|
struct addr_operations *a;
|
||||||
|
|
||||||
for (a = at; a < at + num_addrs; ++a)
|
for (a = at; a < at + num_addrs; ++a)
|
||||||
if (atype == a->af)
|
if (af == a->af)
|
||||||
|
return a;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct addr_operations *
|
||||||
|
find_atype(int atype)
|
||||||
|
{
|
||||||
|
struct addr_operations *a;
|
||||||
|
|
||||||
|
for (a = at; a < at + num_addrs; ++a)
|
||||||
|
if (atype == a->atype)
|
||||||
return a;
|
return a;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -235,12 +299,26 @@ find_addr_type(int atype)
|
|||||||
krb5_error_code
|
krb5_error_code
|
||||||
krb5_sockaddr2address (const struct sockaddr *sa, krb5_address *addr)
|
krb5_sockaddr2address (const struct sockaddr *sa, krb5_address *addr)
|
||||||
{
|
{
|
||||||
struct addr_operations *a = find_addr_type(sa->sa_family);
|
struct addr_operations *a = find_af(sa->sa_family);
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
return KRB5_PROG_ATYPE_NOSUPP;
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
return (*a->sockaddr2addr)(sa, addr);
|
return (*a->sockaddr2addr)(sa, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
krb5_addr2sockaddr (const krb5_address *addr,
|
||||||
|
struct sockaddr *sa,
|
||||||
|
int *sa_size,
|
||||||
|
int port)
|
||||||
|
{
|
||||||
|
struct addr_operations *a = find_atype(addr->addr_type);
|
||||||
|
|
||||||
|
if (a == NULL)
|
||||||
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
|
(*a->addr2sockaddr)(addr, sa, sa_size, port);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
krb5_max_sockaddr_size (void)
|
krb5_max_sockaddr_size (void)
|
||||||
{
|
{
|
||||||
@@ -256,7 +334,7 @@ krb5_max_sockaddr_size (void)
|
|||||||
krb5_boolean
|
krb5_boolean
|
||||||
krb5_sockaddr_uninteresting(const struct sockaddr *sa)
|
krb5_sockaddr_uninteresting(const struct sockaddr *sa)
|
||||||
{
|
{
|
||||||
struct addr_operations *a = find_addr_type(sa->sa_family);
|
struct addr_operations *a = find_af(sa->sa_family);
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
return (*a->uninteresting)(sa);
|
return (*a->uninteresting)(sa);
|
||||||
@@ -267,7 +345,7 @@ krb5_h_addr2sockaddr (int af,
|
|||||||
const char *addr, struct sockaddr *sa, int *sa_size,
|
const char *addr, struct sockaddr *sa, int *sa_size,
|
||||||
int port)
|
int port)
|
||||||
{
|
{
|
||||||
struct addr_operations *a = find_addr_type(af);
|
struct addr_operations *a = find_af(af);
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
return KRB5_PROG_ATYPE_NOSUPP;
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
(*a->h_addr2sockaddr)(addr, sa, sa_size, port);
|
(*a->h_addr2sockaddr)(addr, sa, sa_size, port);
|
||||||
@@ -278,44 +356,34 @@ krb5_error_code
|
|||||||
krb5_h_addr2addr (int af,
|
krb5_h_addr2addr (int af,
|
||||||
const char *haddr, krb5_address *addr)
|
const char *haddr, krb5_address *addr)
|
||||||
{
|
{
|
||||||
struct addr_operations *a = find_addr_type(af);
|
struct addr_operations *a = find_af(af);
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
return KRB5_PROG_ATYPE_NOSUPP;
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
return (*a->h_addr2addr)(haddr, addr);
|
return (*a->h_addr2addr)(haddr, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
krb5_error_code
|
|
||||||
krb5_addr2sockaddr (krb5_address *addr,
|
|
||||||
struct sockaddr *sa,
|
|
||||||
int *sa_size,
|
|
||||||
int port)
|
|
||||||
{
|
|
||||||
struct addr_operations *a;
|
|
||||||
|
|
||||||
for (a = at; a < at + num_addrs; ++a)
|
|
||||||
if (addr->addr_type == a->atype)
|
|
||||||
break;
|
|
||||||
if (a == at + num_addrs)
|
|
||||||
return KRB5_PROG_ATYPE_NOSUPP;
|
|
||||||
|
|
||||||
(*a->h_addr2sockaddr)(addr->address.data, sa, sa_size, port);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
krb5_error_code
|
krb5_error_code
|
||||||
krb5_anyaddr (int af,
|
krb5_anyaddr (int af,
|
||||||
struct sockaddr *sa,
|
struct sockaddr *sa,
|
||||||
int *sa_size,
|
int *sa_size,
|
||||||
int port)
|
int port)
|
||||||
{
|
{
|
||||||
struct addr_operations *a;
|
struct addr_operations *a = find_af (af);
|
||||||
|
|
||||||
for (a = at; a < at + num_addrs; ++a)
|
if (a == NULL)
|
||||||
if (a->af == af)
|
|
||||||
break;
|
|
||||||
if (a == at + num_addrs)
|
|
||||||
return KRB5_PROG_ATYPE_NOSUPP;
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
|
|
||||||
(*a->anyaddr)(sa, sa_size, port);
|
(*a->anyaddr)(sa, sa_size, port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
krb5_print_address (const krb5_address *addr, char *str, int len, int *ret_len)
|
||||||
|
{
|
||||||
|
struct addr_operations *a = find_atype(addr->addr_type);
|
||||||
|
|
||||||
|
if (a == NULL)
|
||||||
|
return KRB5_PROG_ATYPE_NOSUPP;
|
||||||
|
*ret_len = (*a->print_addr)(addr, str, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user