From: serassio <> Date: Sun, 6 Nov 2005 23:54:30 +0000 (+0000) Subject: Windows port: X-Git-Tag: SQUID_3_0_PRE4~538 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=485a0d3f5e948d528851034c5379194c90e02338;p=thirdparty%2Fsquid.git Windows port: - getrusage() and pipe() emulated functions --- diff --git a/src/protos.h b/src/protos.h index 0506ff2afd..322ea12ae2 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $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/ @@ -1001,18 +1001,31 @@ SQUIDCEXTERN void WIN32_RemoveService(void); #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 */ diff --git a/src/win32.cc b/src/win32.cc index 946eaf88c1..5e0ef53aaa 100644 --- a/src/win32.cc +++ b/src/win32.cc @@ -1,6 +1,6 @@ /* - * $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 * * * * * * * * @@ -42,13 +42,18 @@ #include "squid_windows.h" #ifdef _SQUID_MSWIN_ +#if HAVE_WIN32_PSAPI +#include +#endif #ifndef _MSWSOCK_ #include #endif +#include #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */ #include #endif #endif +#include static unsigned int GetOSVersion(); void WIN32_svcstatusupdate(DWORD, DWORD); @@ -904,6 +909,108 @@ int main(int argc, char **argv) #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; @@ -963,6 +1070,16 @@ static void Win32SockCleanup(void) 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;