| /* -*- Mode: C; tab-width: 4 -*- |
| * |
| * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "PosixCompat.h" |
| #include <DebugServices.h> |
| |
| |
| typedef PCHAR (WINAPI * if_indextoname_funcptr_t)(ULONG index, PCHAR name); |
| typedef ULONG (WINAPI * if_nametoindex_funcptr_t)(PCSTR name); |
| |
| |
| unsigned |
| if_nametoindex( const char * ifname ) |
| { |
| HMODULE library; |
| unsigned index = 0; |
| |
| check( ifname ); |
| |
| // Try and load the IP helper library dll |
| if ((library = LoadLibrary(TEXT("Iphlpapi")) ) != NULL ) |
| { |
| if_nametoindex_funcptr_t if_nametoindex_funcptr; |
| |
| // On Vista and above there is a Posix like implementation of if_nametoindex |
| if ((if_nametoindex_funcptr = (if_nametoindex_funcptr_t) GetProcAddress(library, "if_nametoindex")) != NULL ) |
| { |
| index = if_nametoindex_funcptr(ifname); |
| } |
| |
| FreeLibrary(library); |
| } |
| |
| return index; |
| } |
| |
| |
| char* |
| if_indextoname( unsigned ifindex, char * ifname ) |
| { |
| HMODULE library; |
| char * name = NULL; |
| |
| check( ifname ); |
| *ifname = '\0'; |
| |
| // Try and load the IP helper library dll |
| if ((library = LoadLibrary(TEXT("Iphlpapi")) ) != NULL ) |
| { |
| if_indextoname_funcptr_t if_indextoname_funcptr; |
| |
| // On Vista and above there is a Posix like implementation of if_indextoname |
| if ((if_indextoname_funcptr = (if_indextoname_funcptr_t) GetProcAddress(library, "if_indextoname")) != NULL ) |
| { |
| name = if_indextoname_funcptr(ifindex, ifname); |
| } |
| |
| FreeLibrary(library); |
| } |
| |
| return name; |
| } |
| |
| |
| int |
| inet_pton( int family, const char * addr, void * dst ) |
| { |
| struct sockaddr_storage ss; |
| int sslen = sizeof( ss ); |
| |
| ZeroMemory( &ss, sizeof( ss ) ); |
| ss.ss_family = family; |
| |
| if ( WSAStringToAddressA( ( LPSTR ) addr, family, NULL, ( struct sockaddr* ) &ss, &sslen ) == 0 ) |
| { |
| if ( family == AF_INET ) { memcpy( dst, &( ( struct sockaddr_in* ) &ss)->sin_addr, sizeof( IN_ADDR ) ); return 1; } |
| else if ( family == AF_INET6 ) { memcpy( dst, &( ( struct sockaddr_in6* ) &ss)->sin6_addr, sizeof( IN6_ADDR ) ); return 1; } |
| else return 0; |
| } |
| else return 0; |
| } |
|
|
| |
| int |
| gettimeofday( struct timeval * tv, struct timezone * tz ) |
| {
|
| #define EPOCHFILETIME (116444736000000000i64)
|
|
|
| if ( tv != NULL )
|
| {
|
| FILETIME ft;
|
| LARGE_INTEGER li;
|
| __int64 t;
|
|
|
| GetSystemTimeAsFileTime(&ft);
|
| li.LowPart = ft.dwLowDateTime;
|
| li.HighPart = ft.dwHighDateTime;
|
| t = li.QuadPart; /* In 100-nanosecond intervals */
|
| t -= EPOCHFILETIME; /* Offset to the Epoch time */
|
| t /= 10; /* In microseconds */
|
| tv->tv_sec = ( long )( t / 1000000 );
|
| tv->tv_usec = ( long )( t % 1000000 );
|
| }
|
|
|
| return 0; |
| } |
| |
| |
| extern struct tm* |
| localtime_r( const time_t * clock, struct tm * result ) |
| { |
| localtime_s( result, clock ); |
| return result; |
| } |