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