]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Windows port:
authorserassio <>
Sun, 6 Nov 2005 23:54:30 +0000 (23:54 +0000)
committerserassio <>
Sun, 6 Nov 2005 23:54:30 +0000 (23:54 +0000)
- getrusage() and pipe() emulated functions

src/protos.h
src/win32.cc

index 0506ff2afd2684f0acca65948b278f7aab1d2d6c..322ea12ae2dce8424cbb84a629bb48b30166ebc9 100644 (file)
@@ -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 */
index 946eaf88c1b639d80f422b03793b00e4575ab163..5e0ef53aaad5406651f3d60bc663febd488386eb 100644 (file)
@@ -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 * * * * * * *
  *
 #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);
@@ -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;