/* * Copyright (c) 2014, Oculus VR, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #include "EmptyHeader.h" #ifdef RAKNET_SOCKET_2_INLINE_FUNCTIONS #ifndef RAKNETSOCKET2_WINDOWS_LINUX_CPP #define RAKNETSOCKET2_WINDOWS_LINUX_CPP #if !defined(WINDOWS_STORE_RT) && !defined(__native_client__) #if RAKNET_SUPPORT_IPV6==1 void PrepareAddrInfoHints2(addrinfo *hints) { memset(hints, 0, sizeof (addrinfo)); // make sure the struct is empty hints->ai_socktype = SOCK_DGRAM; // UDP sockets hints->ai_flags = AI_PASSIVE; // fill in my IP for me } void GetMyIP_Windows_Linux_IPV4And6( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) { int idx=0; char ac[ 80 ]; int err = gethostname( ac, sizeof( ac ) ); RakAssert(err != -1); struct addrinfo hints; struct addrinfo *servinfo=0, *aip; // will point to the results PrepareAddrInfoHints2(&hints); getaddrinfo(ac, "", &hints, &servinfo); for (idx=0, aip = servinfo; aip != NULL && idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; aip = aip->ai_next, idx++) { if (aip->ai_family == AF_INET) { struct sockaddr_in *ipv4 = (struct sockaddr_in *)aip->ai_addr; memcpy(&addresses[idx].address.addr4,ipv4,sizeof(sockaddr_in)); } else { struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)aip->ai_addr; memcpy(&addresses[idx].address.addr4,ipv6,sizeof(sockaddr_in6)); } } freeaddrinfo(servinfo); // free the linked-list while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS) { addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS; idx++; } } #else #if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(__WIN32__) #include #endif void GetMyIP_Windows_Linux_IPV4( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) { int idx=0; char ac[ 80 ]; int err = gethostname( ac, sizeof( ac ) ); (void) err; RakAssert(err != -1); struct hostent *phe = gethostbyname( ac ); if ( phe == 0 ) { RakAssert(phe!=0); return ; } for ( idx = 0; idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; ++idx ) { if (phe->h_addr_list[ idx ] == 0) break; memcpy(&addresses[idx].address.addr4.sin_addr,phe->h_addr_list[ idx ],sizeof(struct in_addr)); } while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS) { addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS; idx++; } } #endif // RAKNET_SUPPORT_IPV6==1 void GetMyIP_Windows_Linux( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) { #if RAKNET_SUPPORT_IPV6==1 GetMyIP_Windows_Linux_IPV4And6(addresses); #else GetMyIP_Windows_Linux_IPV4(addresses); #endif } #endif // Windows and Linux #endif // file header #endif // #ifdef RAKNET_SOCKET_2_INLINE_FUNCTIONS