2 * $Id: win32.cc,v 1.27 2008/01/20 17:13:22 serassio Exp $
5 * AUTHOR: Guido Serassio <serassio@squid-cache.org>
6 * inspired by previous work by Romeo Anghelache & Eric Stern.
8 * SQUID Web Proxy Cache http://www.squid-cache.org/
9 * ----------------------------------------------------------
11 * Squid is the result of efforts by numerous individuals from
12 * the Internet community; see the CONTRIBUTORS file for full
13 * details. Many organizations have provided support for Squid's
14 * development; see the SPONSORS file for full details. Squid is
15 * Copyrighted (C) 2001 by the Regents of the University of
16 * California; see the COPYRIGHT file for full details. Squid
17 * incorporates software developed and/or copyrighted by other
18 * sources; see the CREDITS file for full details.
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
37 #include "squid_windows.h"
48 SQUIDCEXTERN LPCRITICAL_SECTION dbg_mutex
;
49 void WIN32_ExceptionHandlerCleanup(void);
50 static LPTOP_LEVEL_EXCEPTION_FILTER Win32_Old_ExceptionHandler
= NULL
;
53 int WIN32_pipe(int handles
[2])
61 struct addrinfo
*AI
= NULL
;
63 localhost
.SetLocalhost();
65 #if !IPV6_SPECIAL_LOCALHOST
66 /* INET6: back-compatible: localhost pipes default to IPv4 unless set otherwise.
67 * it is blocked by untested helpers on many admins configs
68 * if this proves to be wrong it can die easily.
73 handles
[0] = handles
[1] = -1;
75 statCounter
.syscalls
.sock
.sockets
++;
79 handle0
.GetAddrInfo(AI
);
81 if ((new_socket
= socket(AI
->ai_family
, AI
->ai_socktype
, AI
->ai_protocol
)) < 0)
84 if (bind(new_socket
, AI
->ai_addr
, AI
->ai_addrlen
) < 0 ||
85 listen(new_socket
, 1) < 0 || getsockname(new_socket
, AI
->ai_addr
, &(AI
->ai_addrlen
) ) < 0 ||
86 (handles
[1] = socket(AI
->ai_family
, AI
->ai_socktype
, 0)) < 0) {
87 closesocket(new_socket
);
91 handle0
= *AI
; // retrieve the new details returned by connect()
93 handle1
.SetPort(handle1
.GetPort());
94 handle1
.GetAddrInfo(AI
);
96 if (connect(handles
[1], AI
->ai_addr
, AI
->ai_addrlen
) < 0 ||
97 (handles
[0] = accept(new_socket
, AI
->ai_addr
, &(AI
->ai_addrlen
)) ) < 0) {
98 closesocket(handles
[1]);
100 closesocket(new_socket
);
104 closesocket(new_socket
);
106 F
= &fd_table
[handles
[0]];
107 F
->local_addr
= handle0
;
109 F
= &fd_table
[handles
[1]];
110 F
->local_addr
= localhost
;
111 handle1
.NtoA(F
->ipaddr
, MAX_IPSTRLEN
);
112 F
->remote_port
= handle1
.GetPort();
117 int WIN32_getrusage(int who
, struct rusage
*usage
)
121 if ((WIN32_OS_version
== _WIN_OS_WINNT
) || (WIN32_OS_version
== _WIN_OS_WIN2K
)
122 || (WIN32_OS_version
== _WIN_OS_WINXP
) || (WIN32_OS_version
== _WIN_OS_WINNET
)) {
123 /* On Windows NT/2000 call PSAPI.DLL for process Memory */
124 /* informations -- Guido Serassio */
126 PROCESS_MEMORY_COUNTERS pmc
;
127 hProcess
= OpenProcess(PROCESS_QUERY_INFORMATION
|
129 FALSE
, GetCurrentProcessId());
131 /* Microsoft CRT doesn't have getrusage function, */
132 /* so we get process CPU time information from PSAPI.DLL. */
133 FILETIME ftCreate
, ftExit
, ftKernel
, ftUser
;
135 if (GetProcessTimes(hProcess
, &ftCreate
, &ftExit
, &ftKernel
, &ftUser
)) {
136 int64_t *ptUser
= (int64_t *)&ftUser
;
137 int64_t tUser64
= *ptUser
/ 10;
138 int64_t *ptKernel
= (int64_t *)&ftKernel
;
139 int64_t tKernel64
= *ptKernel
/ 10;
140 usage
->ru_utime
.tv_sec
=(long)(tUser64
/ 1000000);
141 usage
->ru_stime
.tv_sec
=(long)(tKernel64
/ 1000000);
142 usage
->ru_utime
.tv_usec
=(long)(tUser64
% 1000000);
143 usage
->ru_stime
.tv_usec
=(long)(tKernel64
% 1000000);
145 CloseHandle( hProcess
);
150 if (GetProcessMemoryInfo( hProcess
, &pmc
, sizeof(pmc
))) {
151 usage
->ru_maxrss
=(DWORD
)(pmc
.WorkingSetSize
/ getpagesize());
152 usage
->ru_majflt
=pmc
.PageFaultCount
;
154 CloseHandle( hProcess
);
158 CloseHandle( hProcess
);
166 int Win32__WSAFDIsSet(int fd
, fd_set FAR
* set
169 fde
*F
= &fd_table
[fd
];
170 SOCKET s
= F
->win32
.handle
;
172 return __WSAFDIsSet(s
, set
);
175 LONG CALLBACK
WIN32_ExceptionHandler(EXCEPTION_POINTERS
* ep
)
177 EXCEPTION_RECORD
* er
;
179 er
= ep
->ExceptionRecord
;
181 switch (er
->ExceptionCode
) {
183 case EXCEPTION_ACCESS_VIOLATION
:
187 case EXCEPTION_DATATYPE_MISALIGNMENT
:
189 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED
:
191 case EXCEPTION_IN_PAGE_ERROR
:
199 return EXCEPTION_CONTINUE_SEARCH
;
203 void WIN32_ExceptionHandlerInit()
207 if (Win32_Old_ExceptionHandler
== NULL
)
208 Win32_Old_ExceptionHandler
= SetUnhandledExceptionFilter(WIN32_ExceptionHandler
);
213 void WIN32_ExceptionHandlerCleanup()
215 if (Win32_Old_ExceptionHandler
!= NULL
)
216 SetUnhandledExceptionFilter(Win32_Old_ExceptionHandler
);
219 #endif /* SQUID_MSWIN_ */