liyujie
2025-08-28 786ff4f4ca2374bdd9177f2e24b503d43e7a3b93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* -*- 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;
}