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