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-gatecvtkaddr(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