%% options copyright owner = Dirk Krause copyright year = 2016-xxxx license = bsd %% module #include "dk4conf.h" #include "dk4types.h" #include "dk4mem.h" #include "dk4sock.h" #include "dk4mai8dus.h" #include "dk4mao8d.h" $!trace-include #if DK4_HAVE_STRUCT_SOCKADDR_IN6 /** used to initialize IPv6 address for binding local ports. */ static const IN6_ADDR dk4socket_any6 = IN6ADDR_ANY_INIT; #endif int dk4socket_address_family(dk4_sockaddr_storage_t *aptr) { struct sockaddr *sa = NULL; int back = AF_UNSPEC; if (NULL != aptr) { sa = (struct sockaddr *)aptr; switch (sa->sa_family) { case AF_INET : #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : #endif { back = sa->sa_family; } break; } } return back; } size_t dk4socket_address_size(dk4_sockaddr_storage_t *aptr) { struct sockaddr *sa; size_t back = 0; if (NULL != aptr) { sa = (struct sockaddr *)aptr; switch (sa->sa_family) { case AF_INET : { back = sizeof(struct sockaddr_in); } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { back = sizeof(struct sockaddr_in6); } break; #endif } } return back; } int dk4socket_complete_addresses( dk4_sockaddr_storage_t *array, unsigned short remport, unsigned short locport ) { #if DK4_HAVE_STRUCT_SOCKADDR_IN6 struct sockaddr_in6 *sa6; #endif struct sockaddr_in *sa4; struct sockaddr *sa; int back = DK4_SOCKET_RESULT_FAILED; $? "+ dk4socket_complete_addresses" sa = (struct sockaddr *)array; switch (sa->sa_family) { case AF_INET : { $? ". IPv4" sa4 = (struct sockaddr_in *)array; sa4->sin_port = dk4socket_htons(remport); sa4 = (struct sockaddr_in *)(&(array[1])); sa4->sin_family = AF_INET; sa4->sin_addr.s_addr = dk4socket_htonl(INADDR_ANY); sa4->sin_port = dk4socket_htons(locport); back = DK4_SOCKET_RESULT_SUCCESS; } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { $? ". IPv6" sa6 = (struct sockaddr_in6 *)array; sa6->sin6_port = dk4socket_htons(remport); sa6 = (struct sockaddr_in6 *)(&(array[1])); sa6->sin6_family = AF_INET6; DK4_MEMCPY(&(sa6->sin6_addr), &dk4socket_any6, sizeof(IN6_ADDR)); sa6->sin6_port = dk4socket_htons(locport); back = DK4_SOCKET_RESULT_SUCCESS; } break; #endif } $? "- dk4socket_complete_addresses %d", back return back; }