1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include "PosixCompat.h"
19#include <DebugServices.h>
20
21
22typedef PCHAR (WINAPI * if_indextoname_funcptr_t)(ULONG index, PCHAR name);
23typedef ULONG (WINAPI * if_nametoindex_funcptr_t)(PCSTR name);
24
25
26unsigned
27if_nametoindex( const char * ifname )
28{
29	HMODULE library;
30	unsigned index = 0;
31
32	check( ifname );
33
34	// Try and load the IP helper library dll
35	if ((library = LoadLibrary(TEXT("Iphlpapi")) ) != NULL )
36	{
37		if_nametoindex_funcptr_t if_nametoindex_funcptr;
38
39		// On Vista and above there is a Posix like implementation of if_nametoindex
40		if ((if_nametoindex_funcptr = (if_nametoindex_funcptr_t) GetProcAddress(library, "if_nametoindex")) != NULL )
41		{
42			index = if_nametoindex_funcptr(ifname);
43		}
44
45		FreeLibrary(library);
46	}
47
48	return index;
49}
50
51
52char*
53if_indextoname( unsigned ifindex, char * ifname )
54{
55	HMODULE library;
56	char * name = NULL;
57
58	check( ifname );
59	*ifname = '\0';
60
61	// Try and load the IP helper library dll
62	if ((library = LoadLibrary(TEXT("Iphlpapi")) ) != NULL )
63	{
64		if_indextoname_funcptr_t if_indextoname_funcptr;
65
66		// On Vista and above there is a Posix like implementation of if_indextoname
67		if ((if_indextoname_funcptr = (if_indextoname_funcptr_t) GetProcAddress(library, "if_indextoname")) != NULL )
68		{
69			name = if_indextoname_funcptr(ifindex, ifname);
70		}
71
72		FreeLibrary(library);
73	}
74
75	return name;
76}
77
78
79int
80inet_pton( int family, const char * addr, void * dst )
81{
82	struct sockaddr_storage ss;
83	int sslen = sizeof( ss );
84
85	ZeroMemory( &ss, sizeof( ss ) );
86	ss.ss_family = family;
87
88	if ( WSAStringToAddressA( ( LPSTR ) addr, family, NULL, ( struct sockaddr* ) &ss, &sslen ) == 0 )
89	{
90		if ( family == AF_INET ) { memcpy( dst, &( ( struct sockaddr_in* ) &ss)->sin_addr, sizeof( IN_ADDR ) ); return 1; }
91		else if ( family == AF_INET6 ) { memcpy( dst, &( ( struct sockaddr_in6* ) &ss)->sin6_addr, sizeof( IN6_ADDR ) ); return 1; }
92		else return 0;
93	}
94    else return 0;
95}
96
97
98int
99gettimeofday( struct timeval * tv, struct timezone * tz )
100{
101#define EPOCHFILETIME (116444736000000000i64)
102
103	if ( tv != NULL )
104	{
105		FILETIME        ft;
106		LARGE_INTEGER   li;
107		__int64         t;
108
109		GetSystemTimeAsFileTime(&ft);
110		li.LowPart  = ft.dwLowDateTime;
111		li.HighPart = ft.dwHighDateTime;
112		t  = li.QuadPart;	/* In 100-nanosecond intervals */
113		t -= EPOCHFILETIME;	/* Offset to the Epoch time */
114		t /= 10;			/* In microseconds */
115		tv->tv_sec  = ( long )( t / 1000000 );
116		tv->tv_usec = ( long )( t % 1000000 );
117	}
118
119	return 0;
120}
121
122
123extern struct tm*
124localtime_r( const time_t * clock, struct tm * result )
125{
126	localtime_s( result, clock );
127	return result;
128}
129