/*
- * $Id: protos.h,v 1.513 2005/11/04 20:27:31 wessels Exp $
+ * $Id: protos.h,v 1.514 2005/11/06 16:54:30 serassio Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
#endif /* _SQUID_WIN32_ */
#ifdef _SQUID_MSWIN_
+SQUIDCEXTERN int WIN32_pipe(int[2]);
+
SQUIDCEXTERN int WIN32_getrusage(int, struct rusage *);
SQUIDCEXTERN void WIN32_ExceptionHandlerInit(void);
+
+SQUIDCEXTERN int Win32__WSAFDIsSet(int fd, fd_set* set
+ );
+
#endif
/* external_acl.c */
SQUIDCEXTERN void parse_externalAclHelper(external_acl **);
+
SQUIDCEXTERN void dump_externalAclHelper(StoreEntry * sentry, const char *name, const external_acl *);
+
SQUIDCEXTERN void free_externalAclHelper(external_acl **);
+
typedef void EAH(void *data, void *result);
+
SQUIDCEXTERN void externalAclLookup(ACLChecklist * ch, void *acl_data, EAH * handler, void *data);
+
SQUIDCEXTERN void externalAclInit(void);
+
SQUIDCEXTERN void externalAclShutdown(void);
+
SQUIDCEXTERN char *strtokFile(void);
#endif /* SQUID_PROTOS_H */
/*
- * $Id: win32.cc,v 1.17 2005/08/28 08:55:21 serassio Exp $
+ * $Id: win32.cc,v 1.18 2005/11/06 16:54:30 serassio Exp $
*
* * * * * * * * Legal stuff * * * * * * *
*
#include "squid_windows.h"
#ifdef _SQUID_MSWIN_
+#if HAVE_WIN32_PSAPI
+#include <psapi.h>
+#endif
#ifndef _MSWSOCK_
#include <mswsock.h>
#endif
+#include <process.h>
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
#include <crtdbg.h>
#endif
#endif
+#include <fde.h>
static unsigned int GetOSVersion();
void WIN32_svcstatusupdate(DWORD, DWORD);
#endif /* USE_WIN32_SERVICE */
#if defined(_SQUID_MSWIN_)
+int WIN32_pipe(int handles[2])
+{
+ int new_socket;
+ fde *F = NULL;
+
+ struct sockaddr_in serv_addr;
+ int len = sizeof(serv_addr);
+ u_short handle1_port;
+
+ handles[0] = handles[1] = -1;
+
+ statCounter.syscalls.sock.sockets++;
+
+ if ((new_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
+ return -1;
+
+ memset((void *) &serv_addr, 0, sizeof(serv_addr));
+
+ serv_addr.sin_family = AF_INET;
+
+ serv_addr.sin_port = htons(0);
+
+ serv_addr.sin_addr = local_addr;
+
+ if (bind(new_socket, (SOCKADDR *) & serv_addr, len) < 0 ||
+ listen(new_socket, 1) < 0 || getsockname(new_socket, (SOCKADDR *) & serv_addr, &len) < 0 ||
+ (handles[1] = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+ closesocket(new_socket);
+ return -1;
+ }
+
+ handle1_port = ntohs(serv_addr.sin_port);
+
+ if (connect(handles[1], (SOCKADDR *) & serv_addr, len) < 0 ||
+ (handles[0] = accept(new_socket, (SOCKADDR *) & serv_addr, &len)) < 0) {
+ closesocket(handles[1]);
+ handles[1] = -1;
+ closesocket(new_socket);
+ return -1;
+ }
+
+ closesocket(new_socket);
+
+ F = &fd_table[handles[0]];
+ F->local_addr = local_addr;
+ F->local_port = ntohs(serv_addr.sin_port);
+
+ F = &fd_table[handles[1]];
+ F->local_addr = local_addr;
+ xstrncpy(F->ipaddr, inet_ntoa(local_addr), 16);
+ F->remote_port = handle1_port;
+
+ return 0;
+}
+
+int WIN32_getrusage(int who, struct rusage *usage)
+{
+#if HAVE_WIN32_PSAPI
+
+ if ((WIN32_OS_version == _WIN_OS_WINNT) || (WIN32_OS_version == _WIN_OS_WIN2K)
+ || (WIN32_OS_version == _WIN_OS_WINXP) || (WIN32_OS_version == _WIN_OS_WINNET))
+ {
+ /* On Windows NT/2000 call PSAPI.DLL for process Memory */
+ /* informations -- Guido Serassio */
+ HANDLE hProcess;
+ PROCESS_MEMORY_COUNTERS pmc;
+ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
+ PROCESS_VM_READ,
+ FALSE, GetCurrentProcessId());
+ {
+ /* Microsoft CRT doesn't have getrusage function, */
+ /* so we get process CPU time information from PSAPI.DLL. */
+ FILETIME ftCreate, ftExit, ftKernel, ftUser;
+
+ if (GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser)) {
+ int64_t tUser64 = (*(int64_t *)&ftUser / 10);
+ int64_t tKernel64 = (*(int64_t *)&ftKernel / 10);
+ usage->ru_utime.tv_sec =(long)(tUser64 / 1000000);
+ usage->ru_stime.tv_sec =(long)(tKernel64 / 1000000);
+ usage->ru_utime.tv_usec =(long)(tUser64 % 1000000);
+ usage->ru_stime.tv_usec =(long)(tKernel64 % 1000000);
+ } else {
+ CloseHandle( hProcess );
+ return -1;
+ }
+ }
+
+ if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc))) {
+ usage->ru_maxrss=(DWORD)(pmc.WorkingSetSize / getpagesize());
+ usage->ru_majflt=pmc.PageFaultCount;
+ } else {
+ CloseHandle( hProcess );
+ return -1;
+ }
+
+ CloseHandle( hProcess );
+ }
+
+#endif
+ return 0;
+}
+
static int Win32SockInit(void)
{
int iVersionRequested;
return;
}
+int Win32__WSAFDIsSet(int fd, fd_set FAR * set
+ )
+{
+ fde *F = &fd_table[fd];
+ SOCKET s = F->win32.handle;
+
+ return __WSAFDIsSet(s, set
+ );
+}
+
void Squid_Win32InvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved)
{
return;