xref: /illumos-gate/usr/src/cmd/krb5/slave/utils.c (revision 2a8bcb4e)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
3*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
4*7c478bd9Sstevel@tonic-gate  */
5*7c478bd9Sstevel@tonic-gate 
6*7c478bd9Sstevel@tonic-gate #include <k5-int.h>
7*7c478bd9Sstevel@tonic-gate #include <socket-utils.h>
8*7c478bd9Sstevel@tonic-gate #include <inet/ip.h>
9*7c478bd9Sstevel@tonic-gate 
10*7c478bd9Sstevel@tonic-gate /*
11*7c478bd9Sstevel@tonic-gate  * convert a sockaddr_storage address to a krb5_address
12*7c478bd9Sstevel@tonic-gate  * Returns address of krbap if success, NULL if error.
13*7c478bd9Sstevel@tonic-gate  */
14*7c478bd9Sstevel@tonic-gate 
15*7c478bd9Sstevel@tonic-gate krb5_address *
cvtkaddr(struct sockaddr_storage * ss,krb5_address * krbap)16*7c478bd9Sstevel@tonic-gate cvtkaddr(struct sockaddr_storage *ss, krb5_address *krbap)
17*7c478bd9Sstevel@tonic-gate {
18*7c478bd9Sstevel@tonic-gate 	switch (ss->ss_family) {
19*7c478bd9Sstevel@tonic-gate 		case AF_INET:
20*7c478bd9Sstevel@tonic-gate 			krbap->contents = (krb5_octet *)
21*7c478bd9Sstevel@tonic-gate 				    malloc(sizeof (ss2sin(ss)->sin_addr));
22*7c478bd9Sstevel@tonic-gate 			if (krbap->contents == NULL)
23*7c478bd9Sstevel@tonic-gate 				return (NULL);
24*7c478bd9Sstevel@tonic-gate 			memcpy((char *)krbap->contents,
25*7c478bd9Sstevel@tonic-gate 					(char *)&(ss2sin(ss)->sin_addr),
26*7c478bd9Sstevel@tonic-gate 					sizeof (ss2sin(ss)->sin_addr));
27*7c478bd9Sstevel@tonic-gate 			krbap->addrtype = ADDRTYPE_INET;
28*7c478bd9Sstevel@tonic-gate 			krbap->length = sizeof (ss2sin(ss)->sin_addr);
29*7c478bd9Sstevel@tonic-gate 			return (krbap);
30*7c478bd9Sstevel@tonic-gate 		case AF_INET6:
31*7c478bd9Sstevel@tonic-gate 			if (IN6_IS_ADDR_V4MAPPED(&ss2sin6(ss)->sin6_addr)) {
32*7c478bd9Sstevel@tonic-gate 				/* coerce to IPv4 address */
33*7c478bd9Sstevel@tonic-gate 				krbap->contents = (krb5_octet *)
34*7c478bd9Sstevel@tonic-gate 					malloc(IPV4_ADDR_LEN);
35*7c478bd9Sstevel@tonic-gate 				if (krbap->contents == NULL)
36*7c478bd9Sstevel@tonic-gate 					return (NULL);
37*7c478bd9Sstevel@tonic-gate 				IN6_V4MAPPED_TO_IPADDR(
38*7c478bd9Sstevel@tonic-gate 					&(ss2sin6(ss)->sin6_addr),
39*7c478bd9Sstevel@tonic-gate 					*(ipaddr_t *)(krbap->contents));
40*7c478bd9Sstevel@tonic-gate 				krbap->addrtype = ADDRTYPE_INET;
41*7c478bd9Sstevel@tonic-gate 				krbap->length = IPV4_ADDR_LEN;
42*7c478bd9Sstevel@tonic-gate 			} else {
43*7c478bd9Sstevel@tonic-gate 				krbap->contents = (krb5_octet *)
44*7c478bd9Sstevel@tonic-gate 					malloc(sizeof (ss2sin6(ss)->sin6_addr));
45*7c478bd9Sstevel@tonic-gate 				if (krbap->contents == NULL)
46*7c478bd9Sstevel@tonic-gate 					return (NULL);
47*7c478bd9Sstevel@tonic-gate 				memcpy((char *)krbap->contents,
48*7c478bd9Sstevel@tonic-gate 					(char *)&ss2sin6(ss)->sin6_addr,
49*7c478bd9Sstevel@tonic-gate 					sizeof (ss2sin6(ss)->sin6_addr));
50*7c478bd9Sstevel@tonic-gate 				krbap->addrtype = ADDRTYPE_INET6;
51*7c478bd9Sstevel@tonic-gate 				krbap->length = sizeof (ss2sin6(ss)->sin6_addr);
52*7c478bd9Sstevel@tonic-gate 			}
53*7c478bd9Sstevel@tonic-gate 			return (krbap);
54*7c478bd9Sstevel@tonic-gate 		default:
55*7c478bd9Sstevel@tonic-gate 			return (NULL);
56*7c478bd9Sstevel@tonic-gate 	}
57*7c478bd9Sstevel@tonic-gate }
58