正在显示
1 个修改的文件
包含
268 行增加
和
0 行删除
src/server/spserver/spwin32port.cpp
0 → 100644
1 | +/* | ||
2 | + * Copyright 2008 Stephen Liu | ||
3 | + * For license terms, see the file COPYING along with this library. | ||
4 | + */ | ||
5 | + | ||
6 | +#include <stdio.h> | ||
7 | +#include <stdarg.h> | ||
8 | + | ||
9 | +#include "spwin32port.hpp" | ||
10 | + | ||
11 | +#include <lm.h> | ||
12 | +#include <tlhelp32.h> | ||
13 | + | ||
14 | +/* Windows doesn't have writev() but does have WSASend */ | ||
15 | +int spwin32_writev(SOCKET sock, const struct iovec *vector, DWORD count) | ||
16 | +{ | ||
17 | + DWORD sent = -1; | ||
18 | + WSASend(sock, (LPWSABUF)vector, count, &sent, 0, NULL, NULL); | ||
19 | + return sent; | ||
20 | +} | ||
21 | + | ||
22 | +int spwin32_inet_aton(const char *c, struct in_addr* addr) | ||
23 | +{ | ||
24 | + unsigned int r; | ||
25 | + if (strcmp(c, "255.255.255.255") == 0) { | ||
26 | + addr->s_addr = 0xFFFFFFFFu; | ||
27 | + return 1; | ||
28 | + } | ||
29 | + r = inet_addr(c); | ||
30 | + if (r == INADDR_NONE) | ||
31 | + return 0; | ||
32 | + addr->s_addr = r; | ||
33 | + return 1; | ||
34 | +} | ||
35 | + | ||
36 | +int spwin32_socketpair(int d, int type, int protocol, int socks[2]) | ||
37 | +{ | ||
38 | + struct sockaddr_in addr; | ||
39 | + SOCKET listener; | ||
40 | + int e; | ||
41 | + int addrlen = sizeof(addr); | ||
42 | + DWORD flags = 0; | ||
43 | + | ||
44 | + if (socks == 0) { | ||
45 | + WSASetLastError(WSAEINVAL); | ||
46 | + return SOCKET_ERROR; | ||
47 | + } | ||
48 | + | ||
49 | + socks[0] = socks[1] = INVALID_SOCKET; | ||
50 | + if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) | ||
51 | + return SOCKET_ERROR; | ||
52 | + | ||
53 | + memset(&addr, 0, sizeof(addr)); | ||
54 | + addr.sin_family = AF_INET; | ||
55 | + addr.sin_addr.s_addr = htonl(0x7f000001); | ||
56 | + addr.sin_port = 0; | ||
57 | + | ||
58 | + e = bind(listener, (const struct sockaddr*) &addr, sizeof(addr)); | ||
59 | + if (e == SOCKET_ERROR) { | ||
60 | + e = WSAGetLastError(); | ||
61 | + closesocket(listener); | ||
62 | + WSASetLastError(e); | ||
63 | + return SOCKET_ERROR; | ||
64 | + } | ||
65 | + e = getsockname(listener, (struct sockaddr*) &addr, &addrlen); | ||
66 | + if (e == SOCKET_ERROR) { | ||
67 | + e = WSAGetLastError(); | ||
68 | + closesocket(listener); | ||
69 | + WSASetLastError(e); | ||
70 | + return SOCKET_ERROR; | ||
71 | + } | ||
72 | + | ||
73 | + do { | ||
74 | + if (listen(listener, 1) == SOCKET_ERROR) break; | ||
75 | + if ((socks[0] = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, flags)) == INVALID_SOCKET) break; | ||
76 | + if (connect(socks[0], (const struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR) break; | ||
77 | + if ((socks[1] = accept(listener, NULL, NULL)) == INVALID_SOCKET) break; | ||
78 | + closesocket(listener); | ||
79 | + return 0; | ||
80 | + } while (0); | ||
81 | + e = WSAGetLastError(); | ||
82 | + closesocket(listener); | ||
83 | + closesocket(socks[0]); | ||
84 | + closesocket(socks[1]); | ||
85 | + WSASetLastError(e); | ||
86 | + return SOCKET_ERROR; | ||
87 | +} | ||
88 | + | ||
89 | +int spwin32_gettimeofday(struct timeval* tv, void * ) | ||
90 | +{ | ||
91 | +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) | ||
92 | + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 | ||
93 | +#else | ||
94 | + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL | ||
95 | +#endif | ||
96 | + | ||
97 | + FILETIME ft; | ||
98 | + unsigned __int64 tmpres = 0; | ||
99 | + static int tzflag; | ||
100 | + | ||
101 | + if (NULL != tv) | ||
102 | + { | ||
103 | + GetSystemTimeAsFileTime(&ft); | ||
104 | + | ||
105 | + tmpres |= ft.dwHighDateTime; | ||
106 | + tmpres <<= 32; | ||
107 | + tmpres |= ft.dwLowDateTime; | ||
108 | + | ||
109 | + /*converting file time to unix epoch*/ | ||
110 | + tmpres /= 10; /*convert into microseconds*/ | ||
111 | + tmpres -= DELTA_EPOCH_IN_MICROSECS; | ||
112 | + tv->tv_sec = (long)(tmpres / 1000000UL); | ||
113 | + tv->tv_usec = (long)(tmpres % 1000000UL); | ||
114 | + } | ||
115 | + | ||
116 | + return 0; | ||
117 | +} | ||
118 | + | ||
119 | +//------------------------------------------------------------------- | ||
120 | + | ||
121 | +spwin32_logger_t g_spwin32_syslog = spwin32_syslog; | ||
122 | + | ||
123 | +void spwin32_syslog (int priority, const char * format, ...) | ||
124 | +{ | ||
125 | + char logTemp[ 1024 ] = { 0 }; | ||
126 | + | ||
127 | + va_list vaList; | ||
128 | + va_start( vaList, format ); | ||
129 | + _vsnprintf( logTemp, sizeof( logTemp ), format, vaList ); | ||
130 | + va_end ( vaList ); | ||
131 | + | ||
132 | + if( strchr( logTemp, '\n' ) ) { | ||
133 | + printf( "#%d %s", GetCurrentThreadId(), logTemp ); | ||
134 | + } else { | ||
135 | + printf( "#%d %s\n", GetCurrentThreadId(), logTemp ); | ||
136 | + } | ||
137 | +} | ||
138 | + | ||
139 | +void spwin32_closelog (void) | ||
140 | +{ | ||
141 | +} | ||
142 | + | ||
143 | +void spwin32_openlog (const char *ident , int option , int facility) | ||
144 | +{ | ||
145 | +} | ||
146 | + | ||
147 | +int spwin32_setlogmask (int priority) | ||
148 | +{ | ||
149 | + return 0; | ||
150 | +} | ||
151 | + | ||
152 | +//------------------------------------------------------------------- | ||
153 | + | ||
154 | +int spwin32_initsocket() | ||
155 | +{ | ||
156 | + WSADATA wsaData; | ||
157 | + | ||
158 | + int err = WSAStartup( MAKEWORD( 2, 0 ), &wsaData ); | ||
159 | + if ( err != 0 ) { | ||
160 | + spwin32_syslog( LOG_EMERG, "Couldn't find a useable winsock.dll." ); | ||
161 | + return -1; | ||
162 | + } | ||
163 | + | ||
164 | + return 0; | ||
165 | +} | ||
166 | + | ||
167 | +DWORD spwin32_getppid(void) | ||
168 | +{ | ||
169 | + HANDLE snapshot; | ||
170 | + PROCESSENTRY32 entry; | ||
171 | + DWORD myid = GetCurrentProcessId(), parentid = 0; | ||
172 | + int found = FALSE; | ||
173 | + | ||
174 | + snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); | ||
175 | + if (snapshot == INVALID_HANDLE_VALUE) { | ||
176 | + sp_syslog( LOG_ERR, "couldn't take process snapshot in getppid()" ); | ||
177 | + return parentid; | ||
178 | + } | ||
179 | + | ||
180 | + entry.dwSize = sizeof(PROCESSENTRY32); | ||
181 | + if (!Process32First(snapshot, &entry)) { | ||
182 | + CloseHandle(snapshot); | ||
183 | + sp_syslog( LOG_ERR, "Process32First failed in getppid()" ); | ||
184 | + return parentid; | ||
185 | + } | ||
186 | + | ||
187 | + do { | ||
188 | + if (entry.th32ProcessID == myid) { | ||
189 | + parentid = entry.th32ParentProcessID; | ||
190 | + found = TRUE; | ||
191 | + break; | ||
192 | + } | ||
193 | + } while (Process32Next(snapshot, &entry)); | ||
194 | + | ||
195 | + CloseHandle(snapshot); | ||
196 | + | ||
197 | + if (!found) { | ||
198 | + sp_syslog( LOG_ERR, "couldn't find the current process entry in getppid()" ); | ||
199 | + } | ||
200 | + | ||
201 | + return parentid; | ||
202 | +} | ||
203 | + | ||
204 | +const char * spwin32_strerror( DWORD lastError, char * errmsg, size_t len ) | ||
205 | +{ | ||
206 | + if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lastError, 0, | ||
207 | + errmsg, len - 1, NULL)) { | ||
208 | + /* if we fail, call ourself to find out why and return that error */ | ||
209 | + return spwin32_strerror( GetLastError(), errmsg, len ); | ||
210 | + } | ||
211 | + | ||
212 | + return errmsg; | ||
213 | +} | ||
214 | + | ||
215 | +int spwin32_getexefile( DWORD pid, char * path, int size ) | ||
216 | +{ | ||
217 | + HANDLE snapshot; | ||
218 | + MODULEENTRY32 entry; | ||
219 | + | ||
220 | + snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid ); | ||
221 | + if (snapshot == INVALID_HANDLE_VALUE) { | ||
222 | + sp_syslog( LOG_ERR, "couldn't take process snapshot in getexefile()" ); | ||
223 | + return -1; | ||
224 | + } | ||
225 | + | ||
226 | + entry.dwSize = sizeof(MODULEENTRY32); | ||
227 | + if (!Module32First(snapshot, &entry)) { | ||
228 | + CloseHandle(snapshot); | ||
229 | + char errmsg[ 256 ] = { 0 }; | ||
230 | + sp_syslog( LOG_ERR, "Module32First failed in getexefile(), errno %d, %s", | ||
231 | + GetLastError(), spwin32_strerror( GetLastError(), errmsg, sizeof( errmsg ) ) ); | ||
232 | + return -1; | ||
233 | + } | ||
234 | + | ||
235 | + ::strncpy( path, entry.szExePath, size ); | ||
236 | + path[ size - 1 ] = '\0'; | ||
237 | + | ||
238 | + CloseHandle(snapshot); | ||
239 | + | ||
240 | + return 0; | ||
241 | +} | ||
242 | + | ||
243 | +void spwin32_pwd( char * path, int size ) | ||
244 | +{ | ||
245 | + spwin32_getexefile( GetCurrentProcessId(), path, size ); | ||
246 | + | ||
247 | + char * pos = strrchr( path, '\\' ); | ||
248 | + if( NULL != pos ) *pos = '\0'; | ||
249 | +} | ||
250 | + | ||
251 | +void spwin32_pause_console() | ||
252 | +{ | ||
253 | + DWORD ppid = spwin32_getppid(); | ||
254 | + if( ppid > 0 ) { | ||
255 | + char filePath[ 256 ] = { 0 }; | ||
256 | + spwin32_getexefile( ppid, filePath, sizeof( filePath ) ); | ||
257 | + | ||
258 | + char * pos = strrchr( filePath, '\\' ); | ||
259 | + if( NULL == pos ) pos = filePath; | ||
260 | + | ||
261 | + if( 0 == strcasecmp( pos + 1, "msdev.exe" ) | ||
262 | + || 0 == strcasecmp( pos + 1, "explorer.exe" ) ) | ||
263 | + { | ||
264 | + printf( "\npress any key to exit ...\n" ); | ||
265 | + getchar(); | ||
266 | + } | ||
267 | + } | ||
268 | +} |
请
注册
或
登录
后发表评论