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.
36 #include "squid-old.h"
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])
58 Ip::Address localhost
;
61 struct addrinfo
*AI
= NULL
;
63 localhost
.SetLocalhost();
65 /* INET6: back-compatible: localhost pipes default to IPv4 unless set otherwise.
66 * it is blocked by untested helpers on many admins configs
67 * if this proves to be wrong it can die easily.
71 handles
[0] = handles
[1] = -1;
73 ++statCounter
.syscalls
.sock
.sockets
;
77 handle0
.GetAddrInfo(AI
);
79 if ((new_socket
= socket(AI
->ai_family
, AI
->ai_socktype
, AI
->ai_protocol
)) < 0)
82 if (bind(new_socket
, AI
->ai_addr
, AI
->ai_addrlen
) < 0 ||
83 listen(new_socket
, 1) < 0 || getsockname(new_socket
, AI
->ai_addr
, &(AI
->ai_addrlen
) ) < 0 ||
84 (handles
[1] = socket(AI
->ai_family
, AI
->ai_socktype
, 0)) < 0) {
85 closesocket(new_socket
);
89 handle0
= *AI
; // retrieve the new details returned by connect()
91 handle1
.SetPort(handle1
.GetPort());
92 handle1
.GetAddrInfo(AI
);
94 if (connect(handles
[1], AI
->ai_addr
, AI
->ai_addrlen
) < 0 ||
95 (handles
[0] = accept(new_socket
, AI
->ai_addr
, &(AI
->ai_addrlen
)) ) < 0) {
96 closesocket(handles
[1]);
98 closesocket(new_socket
);
102 closesocket(new_socket
);
104 F
= &fd_table
[handles
[0]];
105 F
->local_addr
= handle0
;
107 F
= &fd_table
[handles
[1]];
108 F
->local_addr
= localhost
;
109 handle1
.NtoA(F
->ipaddr
, MAX_IPSTRLEN
);
110 F
->remote_port
= handle1
.GetPort();
115 int WIN32_getrusage(int who
, struct rusage
*usage
)
119 if (WIN32_OS_version
>= _WIN_OS_WINNT
) {
120 /* On Windows NT and later call PSAPI.DLL for process Memory */
121 /* informations -- Guido Serassio */
123 PROCESS_MEMORY_COUNTERS pmc
;
124 hProcess
= OpenProcess(PROCESS_QUERY_INFORMATION
|
126 FALSE
, GetCurrentProcessId());
128 /* Microsoft CRT doesn't have getrusage function, */
129 /* so we get process CPU time information from PSAPI.DLL. */
130 FILETIME ftCreate
, ftExit
, ftKernel
, ftUser
;
132 if (GetProcessTimes(hProcess
, &ftCreate
, &ftExit
, &ftKernel
, &ftUser
)) {
133 int64_t *ptUser
= (int64_t *)&ftUser
;
134 int64_t tUser64
= *ptUser
/ 10;
135 int64_t *ptKernel
= (int64_t *)&ftKernel
;
136 int64_t tKernel64
= *ptKernel
/ 10;
137 usage
->ru_utime
.tv_sec
=(long)(tUser64
/ 1000000);
138 usage
->ru_stime
.tv_sec
=(long)(tKernel64
/ 1000000);
139 usage
->ru_utime
.tv_usec
=(long)(tUser64
% 1000000);
140 usage
->ru_stime
.tv_usec
=(long)(tKernel64
% 1000000);
142 CloseHandle( hProcess
);
147 if (GetProcessMemoryInfo( hProcess
, &pmc
, sizeof(pmc
))) {
148 usage
->ru_maxrss
=(DWORD
)(pmc
.WorkingSetSize
/ getpagesize());
149 usage
->ru_majflt
=pmc
.PageFaultCount
;
151 CloseHandle( hProcess
);
155 CloseHandle( hProcess
);
163 Win32__WSAFDIsSet(int fd
, fd_set FAR
* set
)
165 fde
*F
= &fd_table
[fd
];
166 SOCKET s
= F
->win32
.handle
;
168 return __WSAFDIsSet(s
, set
);
171 LONG CALLBACK
WIN32_ExceptionHandler(EXCEPTION_POINTERS
* ep
)
173 EXCEPTION_RECORD
* er
;
175 er
= ep
->ExceptionRecord
;
177 switch (er
->ExceptionCode
) {
179 case EXCEPTION_ACCESS_VIOLATION
:
183 case EXCEPTION_DATATYPE_MISALIGNMENT
:
185 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED
:
187 case EXCEPTION_IN_PAGE_ERROR
:
195 return EXCEPTION_CONTINUE_SEARCH
;
199 void WIN32_ExceptionHandlerInit()
203 if (Win32_Old_ExceptionHandler
== NULL
)
204 Win32_Old_ExceptionHandler
= SetUnhandledExceptionFilter(WIN32_ExceptionHandler
);
209 void WIN32_ExceptionHandlerCleanup()
211 if (Win32_Old_ExceptionHandler
!= NULL
)
212 SetUnhandledExceptionFilter(Win32_Old_ExceptionHandler
);
215 #endif /* SQUID_MSWIN_ */